zoukankan      html  css  js  c++  java
  • 洛谷P2023 [AHOI2009]维护序列

    数据比线段树2要毒瘤,一直60分的原因是:

    1.long long 没开

    2.没有边做边%或者像我P3373一样写了个看着像的边做边%

    3.要看注释的话可以跳到P3373

    上代码

      1 #include<iostream>
      2 #include<cmath> 
      3 #include<cstdio>
      4 #include<cstring>
      5 #include<queue>
      6 #define lson i*2,l,mid
      7 #define rson i*2+1,mid+1,r
      8 using namespace std;
      9 
     10 struct tree{
     11     long long mul;
     12     long long add;
     13     long long sum;
     14     long long l,r; 
     15 }t[400860];
     16 
     17 long long n,m,a[100860],p;
     18 
     19 void build_tree(long long i,long long l,long long r)
     20 {
     21     t[i].l=l;
     22     t[i].r=r;
     23     t[i].mul=1;
     24     t[i].sum=0;
     25     t[i].add=0; 
     26     if(l==r)
     27     {
     28         t[i].sum=a[l]%p;
     29         return ;
     30     }
     31     long long mid=(l+r)/2;
     32     build_tree(lson);
     33     build_tree(rson);
     34     t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;
     35 }
     36 
     37 void pushdown2(long long i)
     38 {
     39     t[i*2].mul=t[i].mul%p*t[i*2].mul%p;
     40     t[i*2+1].mul=t[i].mul%p*t[i*2+1].mul%p;
     41     t[i*2].add=(t[i*2].add%p*t[i].mul%p+t[i].add)%p;
     42     t[i*2+1].add=(t[i*2+1].add%p*t[i].mul%p+t[i].add)%p;
     43     t[i*2].sum=(t[i].mul%p*t[i*2].sum%p+t[i].add%p*(t[i*2].r-t[i*2].l+1))%p;
     44     t[i*2+1].sum=(t[i].mul%p*t[i*2+1].sum+t[i].add%p*(t[i*2+1].r-t[i*2+1].l+1))%p;
     45     t[i].add=0;
     46     t[i].mul=1;
     47 }
     48 void pushdown(long long i)
     49 {
     50     t[i*2].mul=t[i].mul%p*t[i*2].mul%p;
     51     t[i*2+1].mul=t[i*2+1].mul%p*t[i].mul%p;
     52     t[i*2].add=(t[i*2].add%p*t[i].mul%p+t[i].add)%p;
     53     t[i*2+1].add=(t[i*2+1].add%p*t[i].mul%p+t[i].add)%p;
     54     t[i*2].sum=(t[i].mul%p*t[i*2].sum%p+t[i].add%p*(t[i*2].r-t[i*2].l+1))%p;
     55     t[i*2+1].sum=(t[i].mul%p*t[i*2+1].sum%p+t[i].add%p*(t[i*2+1].r-t[i*2+1].l+1))%p;
     56     t[i].add=0;
     57     t[i].mul=1;
     58 }
     59 void mul_tree(long long i,long long l,long long r,long long x,long long y,long long a)
     60 {
     61     if(l>=x&&r<=y)
     62     {
     63         t[i].sum*=a%p;
     64         t[i].sum%=p; 
     65         t[i].mul*=a%p;
     66         t[i].mul%=p; 
     67         t[i].add*=a%p;
     68         t[i].mul%=p; 
     69         return ;
     70     }
     71     pushdown(i);
     72     long long mid=(l+r)/2;
     73     if(x<=mid) mul_tree(lson,x,y,a);
     74     if(y>mid) mul_tree(rson,x,y,a);
     75     t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;
     76 }
     77 void add_tree(long long i,long long l,long long r,long long x,long long y,long long a)
     78 {
     79     if(l>=x&&r<=y)
     80     {
     81         //t[i].mul*=a%p;    
     82         t[i].add+=a%p;
     83         t[i].add%=p;
     84         t[i].sum+=(t[i].r-t[i].l+1)*a%p;
     85         t[i].sum%=p;
     86         return ;
     87     }
     88     pushdown(i);
     89     long long mid=(l+r)/2;
     90     if(x<=mid) add_tree(lson,x,y,a);
     91     if(y>mid) add_tree(rson,x,y,a);
     92     t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;
     93  } 
     94  
     95 long long query_tree(long long i,long long l,long long r,long long a,long long b)
     96 {
     97      if(l>=a&&r<=b)
     98      {
     99          return t[i].sum%p;
    100     }
    101     long long mid=(l+r)/2;
    102     long long ans=0;
    103     pushdown(i);
    104     if(a<=mid) ans+=query_tree(lson,a,b)%p;
    105     if(b>mid) ans+=query_tree(rson,a,b)%p;
    106     return ans%p;
    107     
    108 }
    109 int main()
    110 {
    111     scanf("%lld %lld ",&n,&p);
    112     long long i,j;
    113     for(i=1;i<=n;i++)
    114     scanf("%lld ",&a[i]); 
    115     scanf("%lld ",&m);
    116     build_tree(1,1,n);
    117     for(i=1;i<=m;i++)
    118     {
    119         long long k;
    120         long long t1,t2,t3;
    121         scanf("%lld ",&k);
    122         if(k==1)
    123         {
    124             scanf("%lld %lld %lld ",&t1,&t2,&t3);
    125             mul_tree(1,1,n,t1,t2,t3);    
    126             //printf("%lld \n",query_tree(1,1,n,t1,t2)%p);
    127         }
    128         if(k==2)
    129         {
    130             scanf("%lld %lld %lld ",&t1,&t2,&t3);
    131             add_tree(1,1,n,t1,t2,t3);
    132             //printf("%lld \n",query_tree(1,1,n,t1,t2)%p);
    133         }
    134         if(k==3)
    135         {
    136             scanf("%lld %lld ",&t1,&t2);
    137             printf("%lld \n",query_tree(1,1,n,t1,t2)%p);
    138         }
    139      } 
    140      return 0;
    141 }
  • 相关阅读:
    使用SHA256WithRSA来签名和验签(.NET/C#)
    对2个hex(16进制)字符串进行异或操作
    Java DESede 加解密("DESede/ECB/PKCS5Padding")
    获取公钥证书的DN(Distinguished Name)
    Java DES 加解密("DES/EBC/NoPadding")
    Porting .Net RSA xml keys to Java
    Linux使用Shell脚本实现ftp的自动上传下载
    Lombok 安装、入门
    一段对16进制字符串进行异或的代码
    一个封装的使用Apache HttpClient进行Http请求(GET、POST、PUT等)的类。
  • 原文地址:https://www.cnblogs.com/zsx6/p/10347083.html
Copyright © 2011-2022 走看看