結果
| 問題 |
No.1074 増殖
|
| コンテスト | |
| ユーザー |
milanis48663220
|
| 提出日時 | 2020-06-05 23:19:24 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 7,965 bytes |
| コンパイル時間 | 782 ms |
| コンパイル使用メモリ | 77,984 KB |
| 最終ジャッジ日時 | 2024-11-14 22:37:17 |
| 合計ジャッジ時間 | 1,552 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.cpp:16:24: error: 'numeric_limits' was not declared in this scope
16 | static const T idm=numeric_limits<T>::min();
| ^~~~~~~~~~~~~~
main.cpp:16:40: error: expected primary-expression before '>' token
16 | static const T idm=numeric_limits<T>::min();
| ^
main.cpp:16:46: error: no matching function for call to 'min()'
16 | static const T idm=numeric_limits<T>::min();
| ~~~~~^~
In file included from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/string:50,
from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/bits/locale_classes.h:40,
from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/bits/ios_base.h:41,
from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/ios:42,
from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/ostream:38,
from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/iostream:39,
from main.cpp:1:
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/bits/stl_algobase.h:230:5: note: candidate: 'template<class _Tp> constexpr const _Tp& std::min(const _Tp&, const _Tp&)'
230 | min(const _Tp& __a, const _Tp& __b)
| ^~~
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/bits/stl_algobase.h:230:5: note: template argument deduction/substitution failed:
main.cpp:16:46: note: candidate expects 2 arguments, 0 provided
16 | static const T idm=numeric_limits<T>::min();
| ~~~~~^~
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.3.0/include/c++/12/bits/stl_algobase.h:278:5: note: candidate: 'template<class _Tp, class _Compare> constexpr const _Tp& std::min(const _Tp&, const _Tp&, _Compare)'
278 | min(const _Tp& __a, const _Tp& __b, _Compare __
ソースコード
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
const ll INF = 1e7;
template<typename T>
class SegmentTreeBeats{
int n,hi;
static const T idm=numeric_limits<T>::min();
static const T idM=numeric_limits<T>::max(),idl=idM;
struct Node{
T Max,Max_second,Min,Min_second,sum,laz_val,laz_add;
int Max_count,Min_count,len;
Node():Max(idm),Max_second(idm),Min(idM),Min_second(idM)
,laz_val(idl),laz_add(0),len(1){}
};
vector<Node> Nodes;
inline void calc(int k){
Node &p=Nodes[k];
Node l=Nodes[k<<1|0];
Node r=Nodes[k<<1|1];
p.sum=l.sum+r.sum;
if (l.Max<r.Max){
p.Max=r.Max;
p.Max_count=r.Max_count;
p.Max_second=max(l.Max,r.Max_second);
} else if (r.Max<l.Max){
p.Max=l.Max;
p.Max_count=l.Max_count;
p.Max_second=max(l.Max_second,r.Max);
} else {
p.Max=l.Max;
p.Max_count=l.Max_count+r.Max_count;
p.Max_second=max(l.Max_second,r.Max_second);
}
if (l.Min<r.Min){
p.Min=l.Min;
p.Min_count=l.Min_count;
p.Min_second=min(l.Min_second,r.Min);
} else if (r.Min<l.Min){
p.Min=r.Min;
p.Min_count=r.Min_count;
p.Min_second=min(l.Min,r.Min_second);
} else {
p.Min=l.Min;
p.Min_count=l.Min_count+r.Min_count;
p.Min_second=min(l.Min_second,r.Min_second);
}
}
inline void update_node_min(int k,T x){
Node &node=Nodes[k];
node.sum+=(x-node.Max)*node.Max_count;
if (node.Max==node.Min) node.Max=node.Min=x;
else if (node.Max==node.Min_second) node.Max=node.Min_second=x;
else node.Max=x;
if (node.laz_val!=idl&&node.laz_val<x) node.laz_val=x;
}
inline void update_node_max(int k,T x){
Node &node=Nodes[k];
node.sum+=(x-node.Min)*node.Min_count;
if (node.Min==node.Max) node.Min=node.Max=x;
else if (node.Min==node.Max_second) node.Min=node.Max_second=x;
else node.Min=x;
if (node.laz_val!=idl&&x<node.laz_val) node.laz_val=x;
}
inline void update_node_add(int k,T x){
Node &node=Nodes[k];
node.Max+=x;
if (node.Max_second!=idm) node.Max_second+=x;
node.Min+=x;
if (node.Min_second!=idM) node.Min_second+=x;
node.sum+=x*node.len;
(node.laz_val!=idl?node.laz_val:node.laz_add)+=x;
}
inline void update_node_val(int k,T x){
Node &node=Nodes[k];
node.Max=x; node.Max_second=idm;
node.Min=x; node.Min_second=idM;
node.Max_count=node.Min_count=node.len;
node.sum=x*node.len;
node.laz_val=x; node.laz_add=0;
}
inline void update_sub_min(int k,T x){
if (Nodes[k].Max<=x) return;
if (Nodes[k].Max_second<x){
update_node_min(k,x); return;
}
propagate(k);
update_sub_min(k<<1|0,x);
update_sub_min(k<<1|1,x);
calc(k);
}
inline void update_sub_max(int k,T x){
if (x<=Nodes[k].Min) return;
if (x<Nodes[k].Min_second){
update_node_max(k,x); return;
}
propagate(k);
update_sub_max(k<<1|0,x);
update_sub_max(k<<1|1,x);
calc(k);
}
inline void propagate(int k){
if (k>=n) return;
Node &p=Nodes[k];
if (p.laz_val!=idl){
update_node_val(k<<1|0,p.laz_val);
update_node_val(k<<1|1,p.laz_val);
p.laz_val=idl; return;
}
if (p.laz_add!=0){
update_node_add(k<<1|0,p.laz_add);
update_node_add(k<<1|1,p.laz_add);
p.laz_add=0;
}
if (p.Max<Nodes[k<<1|0].Max) update_node_min(k<<1|0,p.Max);
if (p.Max<Nodes[k<<1|1].Max) update_node_min(k<<1|1,p.Max);
if (Nodes[k<<1|0].Min<p.Min) update_node_max(k<<1|0,p.Min);
if (Nodes[k<<1|1].Min<p.Min) update_node_max(k<<1|1,p.Min);
}
inline void thrust(int k){
if (k==n<<1) return;
int kc=__builtin_ctz(k);
for (int i=hi;i-->kc;) propagate(k>>i);
}
inline void thrust(int l,int r){
if (r==n<<1){thrust(l); return;}
int h=hi,x=l^r;
for (;!(x>>--h)&&h;) propagate(l>>h);
int lc=__builtin_ctz(l),rc=__builtin_ctz(r);
for (int i=h+1;i-->lc;) propagate(l>>i);
for (int i=h+1;i-->rc;) propagate(r>>i);
}
inline void recalc(int k){
k>>=__builtin_ctz(k);
while(k>>=1) calc(k);
}
public:
SegmentTreeBeats(int n_){init(n_);}
void init(int n_){
n=hi=1;
while(n<n_) n<<=1,++hi;
Nodes.resize(n<<1);
}
void build(const vector<T> &v){
for (int i=0;i<v.size();++i){
Nodes[i+n].Max=Nodes[i+n].Min=Nodes[i+n].sum=v[i];
Nodes[i+n].Max_count=Nodes[i+n].Min_count=Nodes[i+n].len=1;
}
for (int i=n-1;i;--i){
calc(i);
Nodes[i].len=Nodes[i<<1|0].len+Nodes[i<<1|1].len;
}
}
void update_min(int a,int b,T x){
if (a>=b) return;
thrust(a+=n),thrust(b+=n);
for (int l=a,r=b;l<r;l>>=1,r>>=1){
if (l&1) update_sub_min(l++,x);
if (r&1) update_sub_min(--r,x);
}
recalc(a),recalc(b);
}
void update_max(int a,int b,T x){
if (a>=b) return;
thrust(a+=n),thrust(b+=n);
for (int l=a,r=b;l<r;l>>=1,r>>=1){
if (l&1) update_sub_max(l++,x);
if (r&1) update_sub_max(--r,x);
}
recalc(a),recalc(b);
}
void update_add(int a,int b,T x){
if (a>=b) return;
thrust(a+=n),thrust(b+=n);
for (int l=a,r=b;l<r;l>>=1,r>>=1){
if (l&1) update_node_add(l++,x);
if (r&1) update_node_add(--r,x);
}
recalc(a),recalc(b);
}
void update_val(int a,int b,T x){
if (a>=b) return;
thrust(a+=n),thrust(b+=n);
for (int l=a,r=b;l<r;l>>=1,r>>=1){
if (l&1) update_node_val(l++,x);
if (r&1) update_node_val(--r,x);
}
recalc(a),recalc(b);
}
T query_min(int a,int b){
if (a>=b) return idM;
thrust(a+=n),thrust(b+=n);
T vl=idM,vr=idM;
for (int l=a,r=b;l<r;l>>=1,r>>=1){
if (l&1) vl=min(vl,Nodes[l++].Min);
if (r&1) vr=min(vr,Nodes[--r].Min);
}
return min(vl,vr);
}
T query_max(int a,int b){
if (a>=b) return idm;
thrust(a+=n),thrust(b+=n);
T vl=idm,vr=idm;
for (int l=a,r=b;l<r;l>>=1,r>>=1){
if (l&1) vl=max(vl,Nodes[l++].Max);
if (r&1) vr=max(vr,Nodes[--r].Max);
}
return max(vl,vr);
}
T query_sum(int a,int b){
if (a>=b) return 0;
thrust(a+=n),thrust(b+=n);
T vl=0,vr=0;
for (int l=a,r=b;l<r;l>>=1,r>>=1){
if (l&1) vl+=Nodes[l++].sum;
if (r&1) vr+=Nodes[--r].sum;
}
return vl+vr;
}
T operator[](int i){return Nodes[i+n].sum;}
};
int N;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout << setprecision(10) << fixed;
cin >> N;
int M = 40005;
int K = 20000;
vector<ll> a(M);
SegmentTreeBeats<ll> sgt_max(M);
SegmentTreeBeats<ll> sgt_min(M);
sgt_max.build(a);
sgt_min.build(a);
for(int i = 0; i < N; i++){
ll x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
x1 += K; x2 += K;
ll prev = sgt_max.query_sum(x1, x2+1)-sgt_min.query_sum(x1, x2+1);
sgt_max.update_max(x1, x2, y2);
sgt_min.update_min(x1, x2, y1);
ll cur = sgt_max.query_sum(x1, x2+1)-sgt_min.query_sum(x1, x2+1);
cout << cur-prev << endl;
}
}
milanis48663220