码迷,mamicode.com
首页 > 其他好文 > 详细

uoj46玄学

时间:2017-07-11 09:32:44      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:name   root   ++   merge   for   ace   pac   getchar   etc   

复杂度辣鸡没人权

疯狂爆oj

感觉要被众多uoj用户骂了

  1 #include <bits/stdc++.h>
  2 #define ll long long
  3 #define LS ls[now]?ls[now]:(tr[++NODE]=stru(),ls[now]=NODE)
  4 #define RS rs[now]?rs[now]:(tr[++NODE]=stru(),rs[now]=NODE)
  5 #define mid (l+r>>1)
  6 using namespace std;
  7 int MOD,NODE,KEY,n,m,opt,l,r,x,y;
  8 int root[800001];
  9 int ls[20000001],rs[20000001],st[800001],L[800001],R[800001],X[800001],Y[800001];
 10 struct stru
 11 {
 12     long long k,b;
 13     stru()
 14     {
 15         k=1;b=0;
 16     }
 17     stru(int K,int B)
 18     {
 19         k=K;b=B;
 20     }
 21  } tr[20000001],alb[800001];
 22 stru merge(stru x,stru y)
 23 {
 24     return stru(x.k*y.k%MOD,(x.b*y.k+y.b)%MOD);
 25 }
 26 bool is(stru p)
 27 {
 28     return(p.k!=1 || p.b!=0);
 29 }
 30 void add(int now,int l,int r,int x,int y,int p,int q)
 31 {
 32     if(l==x && r==y)
 33     {
 34         tr[now]=merge(tr[now],stru(p,q));
 35         return;
 36     }
 37     if(is(tr[now]))
 38     {
 39         tr[LS]=merge(tr[LS],tr[now]);
 40         tr[RS]=merge(tr[RS],tr[now]);
 41         tr[now]=stru();
 42     }
 43     if(x<=mid) add(LS,l,mid,x,min(mid,y),p,q);
 44     if(y>mid) add(RS,mid+1,r,max(mid+1,x),y,p,q);
 45 }
 46 int read()
 47 {
 48     int x=0;char c=getchar();
 49     while (c<0||c>9)c=getchar();
 50     while (c>=0&&c<=9)x=x*10+c-0,c=getchar();
 51     return x;
 52 }
 53 int main()
 54 {
 55     KEY=read();
 56     n=read();MOD=read();
 57     for(int i=1;i<=n;i++)
 58         st[i]=read();
 59     m=read();
 60     int N=5000;
 61     int lastans=0;
 62     for(int i=1,j=0,J=0;i<=m;i++)
 63     {
 64         opt=read();l=read();r=read();x=read();
 65         if(KEY&1)
 66             l^=lastans,r^=lastans;
 67         if(opt==1)
 68         {
 69             y=read();
 70             L[++j]=l;R[j]=r;X[j]=x;Y[j]=y;
 71             if(j%N==1)
 72                 root[++J]=++NODE;
 73             add(root[J],1,n,l,r,x,y);
 74         }
 75         if(opt==2)
 76         {
 77             if(KEY&1)
 78                 x^=lastans;
 79             int k,K;ll ret=st[x];
 80             for(k=l;k%N!=1 && k<=r;k++)
 81             if(L[k]<=x && x<=R[k])
 82                 ret=(ret*X[k]+Y[k])%MOD;
 83             if(k<=r)
 84             {
 85                 for(K=k/N+1;K*N<=r;K++)
 86                 { 
 87                     int now=root[K],l=1,r=n,top=0;
 88                     while(l<r)
 89                     {
 90                         if(is(tr[now])) 
 91                             alb[++top]=tr[now];
 92                         if(x<=mid)
 93                             now=LS,r=mid;
 94                         else
 95                             now=RS,l=mid+1;
 96                     } 
 97                     stru tem=tr[now];
 98                     for(int i=top;i;i--)
 99                         tem=merge(tem,alb[i]);
100                 //    tem=que(root[])
101                     ret=(tem.k*ret+tem.b)%MOD;
102                 } 
103                 for(k=(K-1)*N+1;k<=r;k++)
104                 if(L[k]<=x && x<=R[k])
105                     ret=(ret*X[k]+Y[k])%MOD;    
106             }
107             printf("%d\n",ret);
108         //    puts("OK");
109             lastans=ret;
110          } 
111     }
112     return 0;
113 }

 

uoj46玄学

标签:name   root   ++   merge   for   ace   pac   getchar   etc   

原文地址:http://www.cnblogs.com/wanglichao/p/7148791.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!