2 条题解
-
0
#include<bits/stdc++.h> #define int long long #define ffor(i,a,b) for(int i=(a);i<=(b);i++) #define roff(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int MAXN=1e5+10; int n,q,a[MAXN]; const int mod=1e9; int fst=1023,sec=1025; struct TAG {int add,tm,c;}tag[MAXN<<2]; struct INFO {int len,sum,hsum;}t[MAXN<<2]; INFO operator +(INFO A,INFO B) {return {A.len+B.len,A.sum+B.sum,A.hsum+B.hsum};} TAG operator +(TAG A,TAG B) {return {A.add+B.add,A.tm+B.tm,A.c+B.c+A.add*B.tm};} INFO operator +(INFO A,TAG B) {return {A.len,A.sum+A.len*B.add,A.hsum+B.c*A.len+A.sum*B.tm};} #define lson (k<<1) #define rson (k<<1|1) #define mid (l+r>>1) void build(int k,int l,int r) { t[k]={r-l+1,0,0},tag[k]={0,0,0}; if(l!=r) build(lson,l,mid),build(rson,mid+1,r); return ; } void push_down(int k,int l,int r) { t[lson]=t[lson]+tag[k],t[rson]=t[rson]+tag[k]; tag[lson]=tag[lson]+tag[k],tag[rson]=tag[rson]+tag[k]; return tag[k]={0,0,0},void(); } void update(int k,int l,int r,int x,int y,TAG tg) { if(x<=l&&r<=y) return t[k]=t[k]+tg,tag[k]=tag[k]+tg,void(); push_down(k,l,r); if(x<=mid) update(lson,l,mid,x,y,tg); if(y>mid) update(rson,mid+1,r,x,y,tg); return t[k]=t[lson]+t[rson],void(); } int query(int k,int l,int r,int x,int y) { if(x>y) return 0; if(x<=l&&r<=y) return t[k].hsum; push_down(k,l,r); if(y<=mid) return query(lson,l,mid,x,y); if(x>mid) return query(rson,mid+1,r,x,y); return query(lson,l,mid,x,y)+query(rson,mid+1,r,x,y); } vector<pair<pair<int,int>,pair<int,int>>> qr[MAXN]; int ans[MAXN]; signed main() { ios::sync_with_stdio(False),cin.tie(0),cout.tie(0); n=100000; ffor(i,1,100000) a[i]=fst^sec,fst=fst*1023%mod,sec=sec*1025%mod; // cin>>n; // ffor(i,1,n) cin>>a[i]; // ffor(i,1,10) cout<<a[i]<<' '; cin>>q; ffor(i,1,q) {int l1,r1,l2,r2;cin>>l1>>r1>>l2>>r2,qr[r2].push_back({{l1,r1},{i,{1}}}),qr[l2-1].push_back({{l1,r1},{i,{-1}}});} build(1,1,n); stack<int> st; st.push(0); ffor(i,1,n) { update(1,1,n,i,i,{a[i],0,0}); while(a[i]>a[st.top()]&&st.top()) { int u=st.top(); st.pop(); update(1,1,n,st.top()+1,u,{a[i]-a[u],0,0}); } st.push(i); update(1,1,n,1,n,{0,1,0}); for(auto pr:qr[i]) ans[pr.second.first]+=pr.second.second*query(1,1,n,pr.first.first,pr.first.second); } build(1,1,n); while(!st.empty()) st.pop(); st.push(0); ffor(i,1,n) { update(1,1,n,i,i,{a[i],0,0}); while(a[i]<a[st.top()]&&st.top()) { int u=st.top(); st.pop(); update(1,1,n,st.top()+1,u,{a[i]-a[u],0,0}); } st.push(i); update(1,1,n,1,n,{0,1,0}); for(auto pr:qr[i]) ans[pr.second.first]-=pr.second.second*query(1,1,n,pr.first.first,pr.first.second); } ffor(i,1,q) cout<<ans[i]<<'\n'; return 0; } -
0
#include<bits/stdc++.h> #define int long long #define ffor(i,a,b) for(int i=(a);i<=(b);i++) #define roff(i,a,b) for(int i=(a);i>=(b);i--) using namespace std; const int MAXN=1e5+10; int n,q,a[MAXN]; const int mod=1e9; int fst=1023,sec=1025; struct TAG {int add,tm,c;}tag[MAXN<<2]; struct INFO {int len,sum,hsum;}t[MAXN<<2]; INFO operator +(INFO A,INFO B) {return {A.len+B.len,A.sum+B.sum,A.hsum+B.hsum};} TAG operator +(TAG A,TAG B) {return {A.add+B.add,A.tm+B.tm,A.c+B.c+A.add*B.tm};} INFO operator +(INFO A,TAG B) {return {A.len,A.sum+A.len*B.add,A.hsum+B.c*A.len+A.sum*B.tm};} #define lson (k<<1) #define rson (k<<1|1) #define mid (l+r>>1) void build(int k,int l,int r) { t[k]={r-l+1,0,0},tag[k]={0,0,0}; if(l!=r) build(lson,l,mid),build(rson,mid+1,r); return ; } void push_down(int k,int l,int r) { t[lson]=t[lson]+tag[k],t[rson]=t[rson]+tag[k]; tag[lson]=tag[lson]+tag[k],tag[rson]=tag[rson]+tag[k]; return tag[k]={0,0,0},void(); } void update(int k,int l,int r,int x,int y,TAG tg) { if(x<=l&&r<=y) return t[k]=t[k]+tg,tag[k]=tag[k]+tg,void(); push_down(k,l,r); if(x<=mid) update(lson,l,mid,x,y,tg); if(y>mid) update(rson,mid+1,r,x,y,tg); return t[k]=t[lson]+t[rson],void(); } int query(int k,int l,int r,int x,int y) { if(x>y) return 0; if(x<=l&&r<=y) return t[k].hsum; push_down(k,l,r); if(y<=mid) return query(lson,l,mid,x,y); if(x>mid) return query(rson,mid+1,r,x,y); return query(lson,l,mid,x,y)+query(rson,mid+1,r,x,y); } vector<pair<pair<int,int>,pair<int,int>>> qr[MAXN]; int ans[MAXN]; signed main() { ios::sync_with_stdio(False),cin.tie(0),cout.tie(0); n=100000; ffor(i,1,100000) a[i]=fst^sec,fst=fst*1023%mod,sec=sec*1025%mod; // cin>>n; // ffor(i,1,n) cin>>a[i]; // ffor(i,1,10) cout<<a[i]<<' '; cin>>q; ffor(i,1,q) {int l1,r1,l2,r2;cin>>l1>>r1>>l2>>r2,qr[r2].push_back({{l1,r1},{i,1}}),qr[l2-1].push_back({{l1,r1},{i,-1}});} build(1,1,n); stack<int> st; st.push(0); ffor(i,1,n) { update(1,1,n,i,i,{a[i],0,0}); while(a[i]>a[st.top()]&&st.top()) { int u=st.top(); st.pop(); update(1,1,n,st.top()+1,u,{a[i]-a[u],0,0}); } st.push(i); update(1,1,n,1,n,{0,1,0}); for(auto pr:qr[i]) ans[pr.second.first]+=pr.second.second*query(1,1,n,pr.first.first,pr.first.second); } build(1,1,n); while(!st.empty()) st.pop(); st.push(0); ffor(i,1,n) { update(1,1,n,i,i,{a[i],0,0}); while(a[i]<a[st.top()]&&st.top()) { int u=st.top(); st.pop(); update(1,1,n,st.top()+1,u,{a[i]-a[u],0,0}); } st.push(i); update(1,1,n,1,n,{0,1,0}); for(auto pr:qr[i]) ans[pr.second.first]-=pr.second.second*query(1,1,n,pr.first.first,pr.first.second); } ffor(i,1,q) cout<<ans[i]<<'\n'; return 0; }
- 1
信息
- ID
- 5927
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者