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

Sample Output

9322587654
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 }

 

posted @ 2016-04-23 11:37  chenyushuo  阅读(252)  评论(0编辑  收藏  举报