zoukankan      html  css  js  c++  java
  • 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
    ",ans[i]);
    91     return 0;
    92 }
  • 相关阅读:
    【Python】格式化输出json
    【flask】处理表单数据
    【flask】使用Flask-WTF处理表单
    【html】合并单元格,并居中显示文本
    testng失败重跑
    Maven安装以及使用
    使用extentreports美化testng报告2,增加监听
    使用extentreports美化报告
    获取在控制台输入命令后的结果
    mysql的慢查询实战+sql优化
  • 原文地址:https://www.cnblogs.com/chenyushuo/p/5424241.html
Copyright © 2011-2022 走看看