bzoj4262: Sum
Description
Input
第一行一个数 t,表示询问组数。
第一行一个数 t,表示询问组数。
接下来 t 行,每行四个数 l_1, r_1, l_2, r_2。
Output
一共 t 行,每行一个数 Sum。
Sample Input
4
1 3 5 7
2 4 6 8
1 1 9 9
9 9 1 1
1 3 5 7
2 4 6 8
1 1 9 9
9 9 1 1
Sample Output
9322587654
9025304064
1065645568
0
9025304064
1065645568
0
HINT
1<=t<=40000,1<=L1<R1<=10^5,1<=L2<=R2<=10^5
题解:
http://www.cnblogs.com/clrs97/p/4824806.html
code:
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 typedef long long int64; 8 char ch; 9 bool ok; 10 void read(int &x){ 11 ok=0; 12 for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1; 13 for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar()); 14 if (ok) x=-x; 15 } 16 const int maxn=100005; 17 const int mod=1E9; 18 const int inf=2147483647; 19 int n,q,l1,r1,l2,r2,stack[maxn],top; 20 int64 a[maxn],ans[maxn]; 21 int cnt; 22 struct Quer{ 23 int x,l,r,id,op; 24 }quer[maxn]; 25 bool cmp(const Quer &a,const Quer &b){return a.x<b.x;} 26 struct Data{ 27 int64 a,b,c,d; 28 void init(){a=1,b=c=d=0;} 29 }; 30 Data operator+(const Data &x,const Data &y){return (Data){x.a*y.a,x.b*y.a+y.b,y.c*x.a+x.c,y.c*x.b+x.d+y.d};} 31 struct seg{ 32 #define ls k<<1 33 #define rs (k<<1)+1 34 int len[maxn<<2]; 35 int64 v[maxn<<2],s[maxn<<2]; 36 Data tag[maxn<<2]; 37 void addtag(int k,Data t){s[k]=t.c*v[k]+t.d*len[k]+s[k],v[k]=t.a*v[k]+t.b*len[k],tag[k]=tag[k]+t;} 38 void pushdown(int k){addtag(ls,tag[k]),addtag(rs,tag[k]),tag[k].init();} 39 void update(int k){v[k]=v[ls]+v[rs],s[k]=s[ls]+s[rs];} 40 void build(int k,int l,int r){ 41 tag[k].init(),len[k]=r-l+1,v[k]=s[k]=0; 42 if (l==r) return; 43 int m=(l+r)>>1; 44 build(ls,l,m),build(rs,m+1,r); 45 } 46 void cover(int k,int l,int r,int x,int y,Data t){ 47 if (l==x&&r==y){addtag(k,t);return;} 48 int m=(l+r)>>1; pushdown(k); 49 if (y<=m) cover(ls,l,m,x,y,t); 50 else if (x<=m) cover(ls,l,m,x,m,t),cover(rs,m+1,r,m+1,y,t); 51 else cover(rs,m+1,r,x,y,t); 52 update(k); 53 } 54 void cover(int x,int y,int64 v){cover(1,1,n,x,y,(Data){0,v,0,0}),addtag(1,(Data){1,0,1,0});} 55 int64 query(int k,int l,int r,int x,int y){ 56 if (l==x&&r==y) return s[k]; 57 int m=(l+r)>>1; pushdown(k); 58 if (y<=m) return query(ls,l,m,x,y); 59 else if (x<=m) return query(ls,l,m,x,m)+query(rs,m+1,r,m+1,y); 60 else return query(rs,m+1,r,x,y); 61 } 62 int64 query(int x,int y){return query(1,1,n,x,y);} 63 }T; 64 int main(){ 65 read(q); 66 for (int i=1;i<=q;i++){ 67 read(l1),read(r1),read(l2),read(r2),n=max(n,r1),n=max(n,r2); 68 quer[++cnt]=(Quer){r2,l1,r1,i,1},quer[++cnt]=(Quer){l2-1,l1,r1,i,-1}; 69 } 70 sort(quer+1,quer+cnt+1,cmp); 71 for (int i=1,t1=1023,t2=1025;i<=n;i++,t1=1LL*t1*1023%mod,t2=1LL*t2*1025%mod) a[i]=t1^t2; 72 T.build(1,1,n); 73 a[0]=inf,stack[top=1]=0; 74 for (int i=1,j=1;i<=n;i++){ 75 while (top&&a[stack[top]]<=a[i]) top--; 76 T.cover(stack[top]+1,i,a[i]); 77 while (quer[j].x<i) j++; 78 for (;quer[j].x==i;j++) ans[quer[j].id]+=T.query(quer[j].l,quer[j].r)*quer[j].op; 79 stack[++top]=i; 80 } 81 T.build(1,1,n); 82 a[0]=-inf,stack[top=1]=0; 83 for (int i=1,j=1;i<=n;i++){ 84 while (top&&a[stack[top]]>=a[i]) top--; 85 T.cover(stack[top]+1,i,a[i]); 86 while (quer[j].x<i) j++; 87 for (;quer[j].x==i;j++) ans[quer[j].id]-=T.query(quer[j].l,quer[j].r)*quer[j].op; 88 stack[++top]=i; 89 } 90 for (int i=1;i<=q;i++) printf("%lld\n",ans[i]); 91 return 0; 92 }