2 条题解

  • 0
    @ 2025-10-8 17:10:23
    #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
      @ 2025-10-8 17:09:56
      #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
      上传者