B:Zeratul与Xor

题目描述

Xor(按位异或),对应C++中的“^”运算符。

Zeratul给出了一个数列A[n](n≤105),要做q(q≤105)组动作,这些动作包括:

1  a:数列中所有的元素异或上a。a非负,且不会超过int的范围。

2  b:向数列尾部添加一个新的数b。b非负,且不会超过int的范围

3  k:查询当前的数列中第k小的数,并输出这个数。保证k不会超过当前数列的长度。

输入

第一行包括两个元素n,q(1≤n≤105,1≤q≤1)。

第二行包括n个数,代表初始的数列。数列中的所有元素非负,且不会超过int的范围。

接下来q行,代表q组动作,含义见描述。

输出

对于每组需要输出的动作,输出一行代表答案。输入数据保证动作中至少有一组需要输出的动作。

输出时每行末尾的多余空格,不影响答案正确性

样例输入

  1. 3 3
  2. 1 2 3
  3. 1 2
  4. 2 2
  5. 3 3

样例输出

  1. 2
    字典树+dfs,区间第k小就是第(n-k+1)大
    异或满足结合律
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <queue>
  7. #include <stack>
  8. #include <cstdlib>
  9. #include <iomanip>
  10. #include <cmath>
  11. #include <cassert>
  12. #include <ctime>
  13. #include <map>
  14. #include <ext/rope>
  15. #include <set>
  16. using namespace std;
  17. #pragma comment(linker, "/stck:1024000000,1024000000")
  18. #pragma GCC diagnostic error "-std=c++11"
  19. #define lowbit(x) (x&(-x))
  20. #define max(x,y) (x>=y?x:y)
  21. #define min(x,y) (x<=y?x:y)
  22. #define MAX 100000000000000000
  23. #define MOD 1000000007
  24. #define esp 1e-9
  25. #define pi acos(-1.0)
  26. #define ei exp(1)
  27. #define PI 3.1415926535897932384626433832
  28. #define ios() ios::sync_with_stdio(true)
  29. #define INF 1044266560
  30. #define mem(a) (memset(a,0,sizeof(a)))
  31. int dcmp(double x){return fabs(x)<esp?:x<?-:;}
  32. typedef long long ll;
  33. const int maxn=1e7+;
  34. int tree[maxn][],pos=;
  35. int val[maxn],n,m,x,p,ans=;
  36. void insert(int n,int root)
  37. {//求第k大,从最高位开始判断,倒着插
  38. for(int i=;i>=;i--)
  39. {
  40. int x=n&(<<i)?:;
  41. if(tree[root][x]==-)
  42. tree[root][x]=++pos;
  43. root=tree[root][x];
  44. val[root]++;
  45. }
  46. }
  47. //异或取相反
  48. int query(int root,int bit,int k,int now)
  49. {
  50. if(bit==-) return ;
  51. int x=now&(<<bit)?:;
  52. if(x==)//相反数为1
  53. {
  54. if(tree[root][x^]!=- && val[tree[root][x^]]>=k)
  55. return (<<bit)+query(tree[root][x^],bit-,k,now);//此位为1,并且数量足够可取,1位加
  56. else{
  57. if(tree[root][x^]!=-) return query(tree[root][x],bit-,k-val[tree[root][x^]],now);//1位不够,0位补充,0位不加
  58. else return query(tree[root][x],bit-,k,now);//0位
  59. }
  60. }
  61. else//相反数为0
  62. {
  63. if(tree[root][x^]!=- && val[tree[root][x^]]>=k)
  64. return query(tree[root][x^],bit-,k,now);//0位,不加
  65. else{
  66. if(tree[root][x^]!=-) return (<<bit)+query(tree[root][x],bit-,k-val[tree[root][x^]],now);//1位,加
  67. else return (<<bit)+query(tree[root][x],bit-,k,now);//1位,加
  68. }
  69. }
  70. }
  71. int main()
  72. {
  73. scanf("%d%d",&n,&m);
  74. memset(tree,-,sizeof(tree));
  75. for(int i=;i<n;i++){
  76. scanf("%d",&x);
  77. insert(x,);
  78. }
  79. while(m--)
  80. {
  81. scanf("%d%d",&p,&x);
  82. if(p==) ans^=x;
  83. else if(p==) insert(ans^x,),n++;
  84. else printf("%d\n",query(,,n-x+,ans)^ans);//区间第k小就是第(n-k+1)大
  85. }
  86. return ;
  87. }

C. Alice和Bob的Nim游戏

题目描述

众所周知,Alice和Bob非常喜欢博弈,而且Alice永远是先手,Bob永远是后手。

Alice和Bob面前有3堆石子,Alice和Bob每次轮流拿某堆石子中的若干个石子(不可以是0个),拿到所有石子中最后一个石子的人获胜。这是一个只有3堆石子的Nim游戏。

Bob错误的认为,三堆石子的Nim游戏只需要少的两堆的石子数量加起来等于多的那一堆,后手就一定会胜利。所以,Bob把三堆石子的数量分别设为 {k,4k,5k}(k>0)。

现在Alice想要知道,在k 小于 2^n 的时候,有多少种情况先手一定会获得胜利。

输入

一个整数n(1≤n≤2×109)。

输出

输出先手胜利的可能情形数。答案对109+7取模。

输出时每行末尾的多余空格,不影响答案正确性

样例输入

  1. 3

样例输出

  1. 2
    我们可以求出先手必胜局面k^4k^5k=0;所以,所有后手获胜的k必须满足二进制位形如1001010011的形式(kk左移两位1不重合)
    fn)表示小于2^n(即二进制第n位为0)的满足上述条件的k的个数,则fn)= fn-1)+ fn-3)+ fn-4)+ 2
    矩阵快速幂
    f[n] 1 0 1 1 1 f[n-1]
    f[n-1] 1 0 0 0 0 f[n-2]
    f[n-2] 0 1 0 0 0 f[n-3]
    f[n-3] 0 0 1 0 0 f[n-4]
    2 0 0 0 0 1 2
    f[1]=1,f[2]=3,f[3]=5,f[4]=8;
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <queue>
  7. #include <stack>
  8. #include <cstdlib>
  9. #include <iomanip>
  10. #include <cmath>
  11. #include <cassert>
  12. #include <ctime>
  13. #include <map>
  14. #include <ext/rope>
  15. #include <set>
  16. using namespace std;
  17. #pragma comment(linker, "/stck:1024000000,1024000000")
  18. #pragma GCC diagnostic error "-std=c++11"
  19. #define lowbit(x) (x&(-x))
  20. #define max(x,y) (x>=y?x:y)
  21. #define min(x,y) (x<=y?x:y)
  22. #define MAX 100000000000000000
  23. #define MOD 1000000007
  24. #define esp 1e-9
  25. #define pi acos(-1.0)
  26. #define ei exp(1)
  27. #define PI 3.1415926535897932384626433832
  28. #define ios() ios::sync_with_stdio(true)
  29. #define INF 1044266560
  30. #define mem(a) (memset(a,0,sizeof(a)))
  31. int dcmp(double x){return fabs(x)<esp?:x<?-:;}
  32. typedef long long ll;
  33. ll n;
  34. struct matrix
  35. {
  36. ll a[][];
  37. matrix(){
  38. memset(a,,sizeof(a));
  39. }
  40. };
  41. matrix multiply(matrix ans,matrix pos)
  42. {
  43. matrix res;
  44. for(int i=;i<;i++)
  45. for(int j=;j<;j++)
  46. for(int k=;k<;k++)
  47. res.a[i][j]=(res.a[i][j]+ans.a[i][k]*pos.a[k][j])%MOD;
  48. return res;
  49. }
  50. matrix matrix_pow(ll n)
  51. {
  52. matrix ans,pos;
  53. pos.a[][]=pos.a[][]=pos.a[][]=pos.a[][]=;
  54. pos.a[][]=pos.a[][]=pos.a[][]=pos.a[][]=;
  55. for(int i=;i<;i++)
  56. ans.a[i][i]=;
  57. while(n)
  58. {
  59. if(n&) ans=multiply(ans,pos);
  60. n>>=;
  61. pos=multiply(pos,pos);
  62. }
  63. return ans;
  64. }
  65. ll quick_pow(ll x,ll n)
  66. {
  67. ll ans=;
  68. while(n)
  69. {
  70. if(n&) ans=(ans*x)%MOD;
  71. n>>=;
  72. x=(x*x)%MOD;
  73. }
  74. return ans%MOD;
  75. }
  76. int main()
  77. {
  78. scanf("%lld",&n);
  79. if(n<=) return *printf("0\n");
  80. else if(n==) return *printf("2\n");
  81. else if(n==) return *printf("7\n");
  82. matrix pos=matrix_pow(n-);
  83. ll ans=(pos.a[][]*+pos.a[][]*+pos.a[][]*+pos.a[][]+pos.a[][]*)%MOD;
  84. printf("%lld\n",(quick_pow(,n)-+MOD-ans+MOD)%MOD);
  85. return ;
  86. }

D. 薇尔莉特的委托

薇尔莉特是一名非常敬业的自动手记人偶,经常需要上门为客人写信,所以她经常穿梭在大陆的各个城市之间,完成委托。

薇尔莉特生活的是一片刚刚结束战乱的大陆,连接各个城市的只有几条铁路线,其中一些还经常被反叛军残党破坏,所以尽管她是一位非常敬业的人偶,有时候工作上也会感到力不从心。

薇尔莉特每天都会接到许多来自不同的地方的委托,她可以在黎明时分乘坐敞篷飞机来到大陆上任何一个城市,但是接下来,她就只能乘坐火车去完成其他城市的委托了。

大陆上有n座城市,有m条连接两个城市的铁路,薇尔莉特会告诉你m行铁路的信息,每行两个数字x,y代表第i条铁路连接的两个城市的编号,并且她是按一定顺序告诉你的(据说是少佐告诉她的顺序)。

每天黎明,薇尔莉特开始工作前,反叛军都会破坏掉一些铁路。反叛军残党的首领是个强迫症,他知道薇尔莉特告诉你的铁路线的顺序,所以他决定破坏薇尔莉特告诉你的第L条到第R条铁路,共(R-L+1)条。

每天深夜,薇尔莉特结束工作后,政府都会检修铁路,把所有被破坏的铁路修好

为了最大程度上满足客人的需要,薇尔莉特想请你帮她计算一下,她每天工作时间最多能去多少个城市完成委托。特别的,完成委托和路上的时间可以忽略,所以你只需求出大陆抽象出的图上,最大的连通块有多少个点即可。

输入

第一行两个整数n,m,意义见描述第4段

接下来的m行每行两个整数x,y,意义见描述第4段

本题中铁路是双向的

接下来一行一个整数d,表示天数。

接下来的d行,每行两个整数L,R,表示反叛军当天要破坏第L条到第R条铁路。

数据保证:1≤n≤103,1≤m≤104,1≤x,y≤n,1≤L,R≤m,1≤d≤2×104

输出

d行,每行一个整数,表示当天薇尔莉特最多能完成多少个城市的委托(即最大连通块的点数)。

SOURCE:codeforces

输出时每行末尾的多余空格,不影响答案正确性

样例输入

  1. 6 6
  2. 1 2
  3. 5 4
  4. 2 3
  5. 3 1
  6. 3 6
  7. 4 6
  8. 6
  9. 1 3
  10. 2 5
  11. 1 6
  12. 5 5
  13. 2 4
  14. 4 4

样例输出

  1. 4
  2. 2
  3. 1
  4. 3
  5. 3
  6. 6
    双向并查集,好题,给个赞
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <queue>
  7. #include <stack>
  8. #include <cstdlib>
  9. #include <iomanip>
  10. #include <cmath>
  11. #include <cassert>
  12. #include <ctime>
  13. #include <map>
  14. #include <set>
  15. using namespace std;
  16. #pragma comment(linker, "/stck:1024000000,1024000000")
  17. #pragma GCC diagnostic error "-std=c++11"
  18. #define lowbit(x) (x&(-x))
  19. #define max(x,y) (x>=y?x:y)
  20. #define min(x,y) (x<=y?x:y)
  21. #define MAX 100000000000000000
  22. #define MOD 1000000007
  23. #define esp 1e-9
  24. #define pi acos(-1.0)
  25. #define ei exp(1)
  26. #define PI 3.1415926535897932384626433832
  27. #define ios() ios::sync_with_stdio(true)
  28. #define INF 0x3f3f3f3f
  29. #define mem(a) (memset(a,0,sizeof(a)))
  30. int dcmp(double x){return fabs(x)<esp?:x<?-:;}
  31. typedef long long ll;
  32. struct dsu{
  33. int f[];
  34. void init(){
  35. for(int i=;i<=;i++)
  36. f[i]=i;
  37. }
  38. int find(int x){
  39. return f[x]==x?x:f[x]=find(f[x]);
  40. }
  41. void join(int x,int y){
  42. int xx=find(x);
  43. int yy=find(y);
  44. if(xx!=yy) f[xx]=yy;
  45. }
  46. }l[],r[];
  47. int u[],v[],n,m,k,vis[];
  48. void solve(dsu l,dsu r,int n){
  49. for(int i=;i<=n;i++)
  50. l.join(i,r.find(i));
  51. int ans=-;
  52. memset(vis,,sizeof(vis));
  53. for(int i=;i<=n;i++){
  54. int x=l.find(i);
  55. vis[x]++;
  56. ans=max(ans,vis[x]);
  57. }
  58. printf("%d\n",ans);
  59. }
  60. int main()
  61. {
  62. scanf("%d%d",&n,&m);
  63. for(int i=;i<=m;i++)
  64. scanf("%d%d",&u[i],&v[i]);
  65. l[].init();
  66. r[m+].init();
  67. for(int i=;i<=m;i++)
  68. {//前缀并查集
  69. l[i]=l[i-];
  70. l[i].join(u[i],v[i]);
  71. }
  72. for(int i=m;i;i--)
  73. {//后缀并查集
  74. r[i]=r[i+];
  75. r[i].join(u[i],v[i]);
  76. }
  77. scanf("%d",&k);
  78. while(k--){
  79. int x,y;
  80. scanf("%d%d",&x,&y);
  81. solve(l[x-],r[y+],n);
  82. }
  83. return ;
  84. }

G. 算个欧拉函数给大家助助兴

题目描述

木南有一天学习了欧拉函数,知道了对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目。那么他定义f(n)为有多少个小于等于n的数可以整除n。

例如f(4)=3。(可以被1,2,4整除)。

那么你可以写个程序计算一下f(n)吗?

输入

输入一个n  n≤1018

输出

输出f(n)

输出时每行末尾的多余空格,不影响答案正确性

样例输入

  1. 999999999999999989

样例输出

  1. 2
    求一根数有多少个因子,大数素因子分解
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <queue>
  7. #include <stack>
  8. #include <cstdlib>
  9. #include <iomanip>
  10. #include <cmath>
  11. #include <cassert>
  12. #include <ctime>
  13. #include <map>
  14. #include <set>
  15. #include <bitset>
  16. using namespace std;
  17. #pragma comment(linker, "/stck:1024000000,1024000000")
  18. #define lowbit(x) (x&(-x))
  19. #define max(x,y) (x>=y?x:y)
  20. #define min(x,y) (x<=y?x:y)
  21. #define MAX 100000000000000000
  22. #define MOD 1000000007
  23. #define pi acos(-1.0)
  24. #define ei exp(1)
  25. #define PI 3.1415926535897932384626433832
  26. #define set_bit(x,ith,bool) ((bool)?((x)|(1<<(ith))):((x)&(~(1<<ith))))
  27. #define ios() ios::sync_with_stdio(true)
  28. #define INF 0x3f3f3f3f
  29. #define mem(a) (memset(a,0,sizeof(a)))
  30. typedef unsigned long long ull;
  31. typedef long long ll;
  32. const int s=;
  33. char ch[];
  34. ll mult_mod(ll a,ll b,ll c)
  35. {
  36. a%=c;
  37. b%=c;
  38. ll ret=;
  39. ll tmp=a;
  40. while(b)
  41. {
  42. if(b&){
  43. ret+=tmp;
  44. if(ret>c) ret-=c;
  45. }
  46. tmp<<=;
  47. if(tmp>c) tmp-=c;
  48. b>>=;
  49. }
  50. return ret;
  51. }
  52. ll pow_mod(ll a,ll n,ll mod)
  53. {
  54. ll ans=;
  55. ll tmp=a%mod;
  56. while(n)
  57. {
  58. if(n&) ans=mult_mod(ans,tmp,mod);
  59. tmp=mult_mod(tmp,tmp,mod);
  60. n>>=;
  61. }
  62. return ans;
  63. }
  64. bool check(ll a,ll n,ll x,ll t)
  65. {
  66. ll ret=pow_mod(a,x,n);
  67. ll last=ret;
  68. for(int i=;i<=t;i++)
  69. {
  70. ret=mult_mod(ret,ret,n);
  71. if(ret== && last!= && last!=n-) return true;
  72. last=ret;
  73. }
  74. if(ret!=) return true;
  75. else return false;
  76. }
  77. bool miller_pabin(ll n)
  78. {
  79. if(n<) return false;
  80. if(n==) return true;
  81. if((n&)==) return false;
  82. ll x=n-;
  83. ll t=;
  84. while((x&)==) {x>>=;t++;}
  85. srand(time(NULL));
  86. for(int i=;i<s;i++){
  87. ll a=rand()%(n-)+;
  88. if(check(a,n,x,t)) return false;
  89. }
  90. return true;
  91. }
  92. ll factor[];
  93. int tol=;
  94. ll gcd(ll a,ll b)
  95. {
  96. ll t;
  97. while(b)
  98. {
  99. t=a;
  100. a=b;
  101. b=t%b;
  102. }
  103. if(a>=) return a;
  104. else return -a;
  105. }
  106. ll pollard_rho(ll x,ll c)
  107. {
  108. ll i=,k=;
  109. srand(time(NULL));
  110. ll x0=rand()%(x-)+;
  111. ll y=x0;
  112. while()
  113. {
  114. i++;
  115. x0=(mult_mod(x0,x0,x)+c)%x;
  116. ll d=gcd(y-x0,x);
  117. if(d!= && d!=x) return d;
  118. if(y==x0) return x;
  119. if(i==k){y=x0;k+=k;}
  120. }
  121. }
  122. void findfac(ll n,ll k)
  123. {
  124. if(n==) return ;
  125. if(miller_pabin(n))
  126. {
  127. factor[tol++]=n;
  128. return ;
  129. }
  130. ll p=n;
  131. ll c=k;
  132. while(p>=n) p=pollard_rho(p,c--);
  133. findfac(p,k);
  134. findfac(n/p,k);
  135. }
  136. int main()
  137. {
  138. ll n;
  139. scanf("%lld",&n);
  140. if(miller_pabin(n)) printf("2\n");
  141. else
  142. {
  143. findfac(n,);
  144. ll ans=;
  145. for(int i=;i<tol;i++)
  146. {
  147. //printf("%lld ",factor[i]);
  148. ll pos=;
  149. while(n> && (n%factor[i]==))
  150. {
  151. pos++;
  152. n/=factor[i];
  153. }
  154. // printf("%lld %lld\n",factor[i],pos);
  155. if(pos) ans*=(pos+);
  156. }
  157. printf("%lld\n",ans);
  158. }
  159. return ;
  160. }

M. Big brother said the calculation

题目描述

(我们永远的)大哥有很多的小弟(n个)。每一个小弟有一个智力值。现在小弟们聚集在了大哥身旁,排成了一队,等待大哥的检阅。n个小弟的智力值是一个1到n的排列。

大哥在检阅小弟时,每次会选择一些相邻的小弟,让他们按照自己的智力值从小到大或从大到小顺序重新排队(没有被选择的小弟位置不变),以便他排除其中的二五仔。

在大哥检阅完小弟之后,老仙突然来了。他十分想为难一下大哥,所以他问大哥其中某一个小弟的智力值是多少。大哥十分的慌,并不能回答这个问题,所以让你来帮他解决这个问题。如果你能够解决,大哥可能会赠与你守护者的三叉戟和并教你他的换家绝学。

输入

第一行3个整数n,q,k,表示小弟的数目,大哥检阅小弟时让一些小弟重新排队的次数,以及最后老仙问他的是第几个小弟的智力值。

第二行n(1≤n≤105)个整数,表示每个小弟的智力值,保证符合题意,是1到n的一个排列。

接下来q(1≤q≤105)行,每行3个整数a,b,t(1≤a≤b≤n,0≤t≤1),表示他选择了第a个到第b个小弟(a,b均包含)进行重新排列。若t=0,则为从小到大;若t=1,则为从大到小。

输出

输出一个整数,代表在检阅之后第k个小弟的智力值是多少。

输出时每行末尾的多余空格,不影响答案正确性

样例输入

  1. 5 2 4
  2. 1 4 3 2 5
  3. 1 3 0
  4. 3 5 1

样例输出

  1. 4
    线段树+二分
    首先,题目确定是关于n的一个排列,那么二分k处可能取的值,然后构建线段树时,大于他标记为1,小于他标记为0,每次查找要更新的区间有多少个一,在全部标记为0
    操作为1是把这些1放到此区间左边,操作为0放到此区间右边,然后查找时,若k处为1,说明这里的数一定大于二分出来的数,不满足,继续二分。
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <queue>
  7. #include <stack>
  8. #include <cstdlib>
  9. #include <iomanip>
  10. #include <cmath>
  11. #include <cassert>
  12. #include <ctime>
  13. #include <map>
  14. #include <ext/rope>
  15. #include <set>
  16. using namespace std;
  17. #pragma comment(linker, "/stck:1024000000,1024000000")
  18. #pragma GCC diagnostic error "-std=c++11"
  19. #define lowbit(x) (x&(-x))
  20. #define max(x,y) (x>=y?x:y)
  21. #define min(x,y) (x<=y?x:y)
  22. #define MAX 100000000000000000
  23. #define MOD 1000000007
  24. #define esp 1e-9
  25. #define pi acos(-1.0)
  26. #define ei exp(1)
  27. #define PI 3.1415926535897932384626433832
  28. #define ios() ios::sync_with_stdio(true)
  29. #define INF 1044266560
  30. #define mem(a) (memset(a,0,sizeof(a)))
  31. int dcmp(double x){return fabs(x)<esp?:x<?-:;}
  32. typedef long long ll;
  33. const int maxn=;
  34. int n,m,a[maxn],operation[maxn],k;
  35. int li[maxn],ri[maxn];
  36. struct tree{
  37. int l,r;
  38. int sum,lazy;
  39. }tree[maxn<<];
  40. void pushdown(int root){
  41. if(tree[root].lazy!=-){
  42. tree[root<<].lazy=tree[root].lazy;
  43. tree[root<<|].lazy=tree[root].lazy;
  44. tree[root<<].sum=tree[root].lazy*(tree[root<<].r-tree[root<<].l+);
  45. tree[root<<|].sum=tree[root].lazy*(tree[root<<|].r-tree[root<<|].l+);
  46. tree[root].lazy=-;
  47. }
  48. }
  49. void pushup(int root){
  50. tree[root].sum=tree[root<<].sum+tree[root<<|].sum;
  51. }
  52. void build(int l,int r,int root,int val)
  53. {
  54. tree[root].l=l;tree[root].r=r;
  55. tree[root].lazy=-;
  56. if(l==r){
  57. tree[root].sum=(a[l]>val)?:;
  58. return ;
  59. }
  60. int mid=l+r>>;
  61. build(l,mid,root<<,val);
  62. build(mid+,r,root<<|,val);
  63. pushup(root);
  64. }
  65. void update(int L,int R,int val,int root)
  66. {
  67. if(L<=tree[root].l && R>=tree[root].r){
  68. tree[root].sum=val*(tree[root].r-tree[root].l+);
  69. tree[root].lazy=val;
  70. return ;
  71. }
  72. pushdown(root);
  73. int mid=tree[root].l+tree[root].r>>;
  74. if(L<=mid) update(L,R,val,root<<);
  75. if(R>mid) update(L,R,val,root<<|);
  76. pushup(root);
  77. }
  78. int query(int L,int R,int root){
  79. if(L<=tree[root].l && R>=tree[root].r){
  80. return tree[root].sum;
  81. }
  82. pushdown(root);
  83. int mid=tree[root].l+tree[root].r>>;
  84. int ans=;
  85. if(L<=mid) ans+=query(L,R,root<<);
  86. if(R>mid) ans+=query(L,R,root<<|);
  87. return ans;
  88. }
  89. int main()
  90. {
  91. scanf("%d%d%d",&n,&m,&k);
  92. for(int i=;i<=n;i++)
  93. scanf("%d",&a[i]);
  94. for(int i=;i<m;i++)
  95. scanf("%d%d%d",&li[i],&ri[i],&operation[i]);
  96. int l=,r=n;
  97. while(l<r)
  98. {
  99. int mid=l+r>>;
  100. build(,n,,mid);
  101. for(int i=;i<m;i++)
  102. {
  103. int L=li[i];
  104. int R=ri[i];
  105. int c=query(L,R,);
  106. update(L,R,,);
  107. if(operation[i] && L<=L+c-) update(L,L+c-,,);
  108. else if(!operation[i] && R>=R-c+) update(R-c+,R,,);
  109. }
  110. if(query(k,k,)) l=mid+;
  111. else r=mid;
  112. }
  113. printf("%d\n",l);
  114. return ;
  115. }

ACM训练联盟周赛(第一场)的更多相关文章

  1. 计蒜客 ACM训练联盟周赛 第一场 Christina式方格取数 思维

    助手Christina发明了一种方格取数的新玩法:在n*m的方格棋盘里,每个格子里写一个数.两个人轮流给格子染色,直到所有格子都染了色.在所有格子染色完后,计算双方的分数.对于任意两个相邻(即有公共边 ...

  2. 计蒜客 ACM训练联盟周赛 第一场 从零开始的神棍之路 暴力dfs

    题目描述 ggwdwsbs最近被Zeratul和Kyurem拉入了日本麻将的坑.现在,ggwdwsbs有13张牌,Kyurem又打了一张,加起来有14张牌.ggwdwsbs想拜托你帮他判断一下,这14 ...

  3. 计蒜客 ACM训练联盟周赛 第一场 Alice和Bob的Nim游戏 矩阵快速幂

    题目描述 众所周知,Alice和Bob非常喜欢博弈,而且Alice永远是先手,Bob永远是后手. Alice和Bob面前有3堆石子,Alice和Bob每次轮流拿某堆石子中的若干个石子(不可以是0个), ...

  4. 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)

    ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...

  5. ACM训练联盟周赛(第三场)

    A.Teemo's bad day Today is a bad day. Teemo is scolded badly by his teacher because he didn't do his ...

  6. 计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)

    M. Big brother said the calculation 通过线段树维护. 这个题和杭电的一道题几乎就是一样的题目.HDU5649.DZY Loves Sorting 题意就是一个n的排 ...

  7. ACM训练联盟周赛 A. Teemo's bad day

    65536K   Today is a bad day. Teemo is scolded badly by his teacher because he didn't do his homework ...

  8. ACM训练联盟周赛 K. Teemo's reunited

    Teemo likes to drink raspberry juice.  He even spent some of his spare time tomake the raspberry jui ...

  9. ACM训练联盟周赛 Teemo's formula

    Teemo has a formula and he want to calculate it quickly. The formula is . As the result may be very ...

随机推荐

  1. 好莱坞原则—Spring的IOC容器

    IOC容器的概念,之前在学习SSH的时候,就有接触过.但那时候也仅仅是知道这么个概念,认为它非常难理解.事实上并非它难理解,而是我并没有停下来好好对它总结梳理过. IOC(Inversion of C ...

  2. android 退出系统

    /** * */ package com.szkingdom.android.phone.utils; import java.io.BufferedReader; import java.io.IO ...

  3. c语言中类型转换与赋值运算符、算术运算符、关系运算符、逻辑运算符。原码、反码、补码。小解。

    类型转换 自动转换 小范围的类型能够自动转换成大范围的类型.short->int->long->float->double 强制类型转换 (类型名)变量或数值 #include ...

  4. php和js区别

    php和js区别 两者在语法上类似,楼上说的对,js=javascript是工作在浏览器端的脚本语言,他所提交的数据是交给浏览器来处理的.但是现在的Ajax技术已经可以把js提交的数据交付到浏览器来处 ...

  5. jar 包的认识与处理、jar 文件 war 文件以及 ear 文件

    1. jar 包 将 jar 包解压,其实是该类(.java)编译好的(.class)文件. 包路径 package 多层嵌套的 packages META-INF 文件夹 2. 常用 jar 包及其 ...

  6. [TJOI2017] DNA 解题报告 (hash+二分)

    题目链接:https://www.luogu.org/problemnew/show/P3763 题目大意: 给定原串S0,询问S0有多少个子串和给定串S相差不到3个字母 题解: 我们枚举S0的子串, ...

  7. Android 数据存取

    Android提供了Preference(配置),File(文件),SQLite数据和网络几种数据存取方式 SharedPreference提供了一种轻量级的数据存取方法,应用场合主要是比较少的配置信 ...

  8. STM8S103之时钟设置

    最大时钟(指的是system clock):外部晶振24MHz,内部高速RC16MHz 三个时钟源:外部晶振.内部高速RC(上电默认) +内部低速RC 几个时钟:master clock(即sytem ...

  9. 在javascript中对于this指向的再次理解

    总所周知,function () {}函数体内的this对象指向的是调用该函数的对象,那么我们看一下这个例子 <script> var length = 3; function fn () ...

  10. 叁、js中的css

    一.子选择器:用来选择一个父元素直接的子元素,不包括子元素的子元素,它的符号为“>” 注:ie6不支持子代选择器. <!DOCTYPE html PUBLIC "-//W3C// ...