[关闭]
@zhousq11 2018-05-18T09:49:14.000000Z 字数 13482 阅读 866

CDOJ 数据结构专题题解

ACM专题笔记


A题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. #define maxn 4000010
  5. #define mid ((l+r)>>1)
  6. #define lson rt<<1,l,mid
  7. #define rson rt<<1|1,mid+1,r
  8. LL int MAX[maxn];LL int MIN[maxn];
  9. LL int val[50000+10];
  10. LL int ans1=-0x7fffffff,ans2=0x7fffffff;
  11. LL tree[maxn];LL N,M;
  12. void renew(int x,LL v){
  13. while(x<=N){
  14. tree[x]+=v;
  15. x+=(x&(-x));
  16. }
  17. return;
  18. }
  19. LL query_tot(int x){
  20. LL ans=0;
  21. while(x){
  22. ans+=tree[x];
  23. x-=(x&(-x));
  24. }
  25. return ans;
  26. }
  27. void init(int n){
  28. cin>>N>>M;
  29. return;
  30. }
  31. void build(int P,int rt,int l,int r){
  32. if(l==r){
  33. MAX[rt]=val[l];
  34. MIN[rt]=val[l];
  35. return;
  36. }
  37. if(mid>=P)
  38. build(P,lson);
  39. if(mid<P)
  40. build(P,rson);
  41. MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);
  42. MIN[rt]=min(MIN[rt<<1],MIN[rt<<1|1]);
  43. return;
  44. }
  45. void query(int rt,int l,int r,int L,int R){
  46. //L,R is what we want.
  47. if (L<=l&&r<=R){
  48. ans1=max(ans1,MAX[rt]);
  49. ans2=min(ans2,MIN[rt]);
  50. return;
  51. }
  52. if(L<=mid){
  53. query(lson,L,R);
  54. }
  55. if(R>mid){
  56. query(rson,L,R);
  57. }
  58. }
  59. int main(){
  60. cin>>N>>M;
  61. int kase,P,left,right;LL x;
  62. while(M--){
  63. scanf("%d",&kase);
  64. switch(kase){
  65. case 0:
  66. scanf("%d%lld",&P,&x);
  67. x=x-val[P];
  68. renew(P,x);
  69. val[P]+=x;
  70. build(P,1,1,N);
  71. break;
  72. case 1:
  73. scanf("%d%d",&left,&right);
  74. query(1,1,N,left,right);
  75. LL ans=query_tot(right)-query_tot(left-1);
  76. if(left==right){
  77. printf("0\n");
  78. }else{
  79. //cout<<ans<<ans1<<ans2<<endl;
  80. printf("%lld\n",ans-ans1-ans2);
  81. }
  82. ans1=-0x7fffffff,ans2=0x7fffffff;
  83. cout<<ans2<<endl;
  84. break;
  85. }
  86. }
  87. }

B题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. #define maxn 1<<22
  5. #define mid ((l+r)>>1)
  6. #define lson rt<<1,l,mid
  7. #define rson rt<<1|1,mid+1,r
  8. LL num[maxn];
  9. int N,M;
  10. LL lazy[maxn];
  11. inline LL read_LL()
  12. {
  13. LL k=0,f=1;char ch=getchar();
  14. while(ch<'0'||ch>'9')
  15. {
  16. if(ch=='-')
  17. f=-1;
  18. ch=getchar();
  19. }
  20. while(ch>='0'&&ch<='9')
  21. {
  22. k=k*10+ch-'0';
  23. ch=getchar();
  24. }
  25. return k*f;
  26. }
  27. inline int read_int()
  28. {
  29. int k=0,f=1;char ch=getchar();
  30. while(ch<'0'||ch>'9')
  31. {
  32. if(ch=='-')
  33. f=-1;
  34. ch=getchar();
  35. }
  36. while(ch>='0'&&ch<='9')
  37. {
  38. k=k*10+ch-'0';
  39. ch=getchar();
  40. }
  41. return k*f;
  42. }
  43. void renew(LL x,int wh,int rt,int l,int r){
  44. if(l==r){
  45. num[rt]+=x;
  46. return;
  47. }
  48. if(mid<wh){
  49. num[rt]+=x;
  50. renew(x,wh,rson);
  51. }else{
  52. num[rt]+=x;
  53. renew(x,wh,lson);
  54. }
  55. return;
  56. }
  57. LL pushdown(LL k,int L,int R,int rt,int l,int r){
  58. if(L<=l&&r<=R){
  59. lazy[rt]+=k;
  60. return k*(r-l+1);
  61. }
  62. LL ans=0;
  63. if(mid<R)
  64. ans+=pushdown(k,L,R,rson);
  65. if(mid>=L)
  66. ans+=pushdown(k,L,R,lson);
  67. num[rt]+=ans;
  68. return ans;
  69. }
  70. LL query(int L,int R,int rt,int l,int r){
  71. if(lazy[rt]){
  72. lazy[rt<<1]+=lazy[rt];
  73. lazy[rt<<1|1]+=lazy[rt];
  74. num[rt]+=lazy[rt]*(r-l+1);
  75. lazy[rt]=0;
  76. }
  77. if(L<=l&&r<=R){
  78. return num[rt];
  79. }
  80. LL ans=0;
  81. //cout << L << R << rt << l << r << endl;
  82. if(mid<R)
  83. ans+=query(L,R,rson);
  84. if(mid>=L)
  85. ans+=query(L,R,lson);
  86. return ans;
  87. }
  88. void init(){
  89. cin>>N>>M;LL k;
  90. for(int i=1;i<=N;i++){
  91. k=read_LL();
  92. renew(k,i,1,1,N);
  93. }
  94. return;
  95. }
  96. void test(){
  97. for(int i=1;i<2*N;i++){
  98. cout<<num[i]<<' ';
  99. }
  100. cout<<endl;
  101. for(int i=1;i<2*N;i++){
  102. cout<<lazy[i]<<' ';
  103. }
  104. cout<<endl;
  105. return;
  106. }
  107. int main(){
  108. //init();
  109. int kase;int x,y;LL k;
  110. //test();
  111. cin>>N>>M;
  112. while(M--){
  113. kase=read_int();
  114. switch(kase){
  115. case 0:
  116. x=read_int();y=read_int();k=read_LL();
  117. pushdown(k,x,y,1,1,N);
  118. //test();
  119. break;
  120. default:
  121. x=read_int();y=read_int();k=read_LL();
  122. LL res=query(x,y,1,1,N);
  123. //test();
  124. printf("%lld\n",res);
  125. break;
  126. }
  127. }
  128. return 0;
  129. }

C题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define mid ((l+r)>>1)
  4. #define lson rt<<1,l,mid
  5. #define rson (rt<<1|1),mid+1,r
  6. const int maxn=1e6;
  7. int lstTree[4*maxn];
  8. int ans=0;
  9. void renew(int P,int val,int rt,int l,int r){
  10. if(l==r){
  11. lstTree[rt]=val;
  12. return;
  13. }
  14. if(P<=mid){
  15. renew(P,val,lson);
  16. }else{
  17. renew(P,val,rson);
  18. }
  19. lstTree[rt]=min(lstTree[rt<<1],lstTree[rt<<1|1]);
  20. return;
  21. }
  22. void query(int val,int rt,int l,int r){
  23. if(l==r){
  24. ans=l;
  25. return;
  26. }
  27. if(lstTree[rt<<1]<val){
  28. query(val,lson);
  29. }else{
  30. query(val,rson);
  31. }
  32. return;
  33. }
  34. int main(){
  35. int N;int c;
  36. cin>>N;
  37. for(int i=2;i<=N;i++){
  38. renew(i,-1,1,1,N);
  39. }
  40. for(int i=1;i<=N;i++){
  41. scanf("%d",&c);
  42. query(i-c,1,1,N);
  43. printf("%d",ans);
  44. if(i!=N)printf(" ");
  45. renew(ans,i,1,1,N);
  46. }
  47. return 0;
  48. }

E题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. map<string,int> M;
  4. set<pair<int,string> >S;
  5. int N;
  6. void insert(string x,int y){
  7. if(M.find(x)==M.end()){
  8. M.insert(pair<string,int>(x,y));
  9. S.insert(pair<int,string>(y,x));
  10. }
  11. return;
  12. }
  13. void erase(string ss){
  14. if(M.find(ss)==M.end()){
  15. return;
  16. }
  17. int num=M[ss];
  18. S.erase(pair<int,string>(num,ss));
  19. M.erase(ss);
  20. return;
  21. }
  22. void change(string ss,int x){
  23. if(M.find(ss)==M.end()){
  24. return;
  25. }
  26. int num=M[ss];
  27. S.erase(pair<int,string>(num,ss));
  28. S.insert(pair<int,string>(x,ss));
  29. M[ss]=x;
  30. return;
  31. }
  32. void output(int opt){
  33. if(S.size()==0){
  34. return;
  35. }
  36. if(opt==1){
  37. set<pair<int,string> >::iterator it=S.begin();
  38. cout<<it->second<<endl;
  39. }else{
  40. set<pair<int,string> >::iterator it=S.end();
  41. it--;
  42. cout<<it->second<<endl;
  43. }
  44. return;
  45. }
  46. int main(){
  47. cin>>N;int opt;
  48. while(N--){
  49. cin>>opt;
  50. string x;int y;
  51. switch(opt){
  52. case 1:cin>>x>>y; insert(x,y);break;
  53. case 2:cin>>x; erase(x); break;
  54. case 3:cin>>x>>y; change(x,y);break;
  55. case 4:cin>>y; output(y); break;
  56. }
  57. }
  58. return 0;
  59. }

G题

队列搞一搞就行。题目显然是先进先出,然后删除操作是删除队首的。所以就可以用队列搞出来。
“袁姐姐最漂亮!”

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. struct node{
  5. int id;
  6. int start_T;
  7. int last;
  8. };
  9. int N;deque<node>Q;int size;
  10. int main(){
  11. cin>>N;int opt;LL t;node X;int a,b;
  12. for(int i=0;i<N;i++){
  13. scanf("%d%lld",&opt,&t);
  14. switch(opt){
  15. case 1:
  16. scanf("%d%d",&a,&b);
  17. X.id=a;X.start_T=b;X.last=t;
  18. Q.push_back(X);
  19. size++;
  20. break;
  21. case 2:
  22. while(size){
  23. X=Q.front();
  24. if(t<X.start_T+X.last){
  25. break;
  26. }else{
  27. size--;
  28. Q.pop_front();
  29. }
  30. }
  31. if(size){
  32. Q.pop_front();
  33. size--;
  34. }
  35. break;
  36. case 3:
  37. while(size){
  38. X=Q.front();
  39. if(t<X.start_T+X.last){
  40. break;
  41. }else{
  42. Q.pop_front();
  43. size--;
  44. }
  45. }
  46. if(size){
  47. printf("%d\n",X.id);
  48. }else{
  49. printf("-1\n");
  50. }
  51. break;
  52. }
  53. }
  54. return 0;
  55. }

I题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int Dad[100000+10];
  4. int Num[100000+10];
  5. int N,M;
  6. int find(int i){
  7. int x=i;
  8. while(x!=Dad[x]){
  9. x=Dad[x];
  10. }
  11. while(i!=x){
  12. Dad[i]=x;
  13. i=Dad[i];
  14. }
  15. return i;
  16. }
  17. void merge(int a,int b){
  18. int x=find(a);
  19. int y=find(b);
  20. Num[x]=Num[x]+Num[y];
  21. Dad[y]=x;
  22. return;
  23. }
  24. void init(){
  25. cin>>N>>M;int v1,v2;
  26. for(int i=0;i<=N;i++){
  27. Dad[i]=i;Num[i]=1;
  28. }
  29. for(int i=0;i<M;i++){
  30. scanf("%d%d",&v1,&v2);
  31. if(find(v1)!=find(v2))
  32. merge(v1,v2);
  33. }
  34. return;
  35. }
  36. void query(){
  37. int Q;cin>>Q;int v;
  38. while(Q--){
  39. scanf("%d",&v);
  40. int x=find(v);
  41. printf("%d\n",Num[x]);
  42. }
  43. return;
  44. }
  45. int main(){
  46. init();
  47. query();
  48. return 0;
  49. }

J题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 100010
  4. int Dad[maxn*3];int N,K;
  5. void init(){
  6. cin>>N>>K;
  7. for(int i=1;i<=3*N;i++){
  8. Dad[i]=i;
  9. }
  10. return;
  11. }
  12. int find(int x){
  13. int i=x;
  14. while(Dad[i]!=i){
  15. i=Dad[i];
  16. }
  17. while(x!=i){
  18. Dad[x]=i;
  19. x=Dad[x];
  20. }
  21. return i;
  22. }
  23. void merge(int x,int y){
  24. int m=find(x);
  25. int n=find(y);
  26. Dad[n]=m;
  27. return;
  28. }
  29. void judge(){
  30. int kase,x,y;int num=0;
  31. while(K--){
  32. scanf("%d%d%d",&kase,&x,&y);
  33. if(x>N||y>N){
  34. printf("%d",num+1);
  35. break;
  36. }
  37. switch(kase){
  38. case 1:
  39. if(find(N+x)==find(y)||find(N+y)==find(x)){
  40. printf("%d",num+1);
  41. return;
  42. }else{
  43. merge(x,y);
  44. merge(N+x,N+y);
  45. merge(2*N+x,2*N+y);
  46. }
  47. break;
  48. case 2:
  49. if(find(x)==find(y)){
  50. printf("%d",num+1);
  51. return;
  52. }else{
  53. if(find(N+x)==find(y)){
  54. printf("%d",num+1);
  55. return;
  56. }else{
  57. merge(N+y,x);
  58. merge(2*N+x,y);
  59. merge(y+2*N,x+N);
  60. break;
  61. }
  62. }
  63. }
  64. num=(num+1)%3;
  65. }
  66. printf("-1");
  67. return;
  68. }
  69. int main(){
  70. init();
  71. judge();
  72. return 0;
  73. }

K题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 1000100
  4. int Dad[maxn*2];
  5. bool vis[maxn];
  6. int N,M;
  7. int find(int x){
  8. int i=x;
  9. while(x!=Dad[x]){
  10. x=Dad[x];
  11. }
  12. while(i!=x){
  13. Dad[i]=x;
  14. i=Dad[i];
  15. }
  16. return i;
  17. }
  18. void merge(int x,int y){
  19. int m=find(x);
  20. int n=find(y);
  21. Dad[m]=n;
  22. return;
  23. }
  24. void query(){
  25. string s;int v1,v2,kase;
  26. while(M--){
  27. cin>>s;
  28. if(s=="Q"){
  29. scanf("%d%d",&v1,&v2);
  30. if(find(v1)==find(v2)){
  31. printf("1\n");
  32. }else{
  33. if(find(N+v1)==find(v2)||find(N+v2)==find(v1)){
  34. printf("2\n");
  35. }else{
  36. printf("3\n");
  37. }
  38. }
  39. }else{
  40. scanf("%d%d%d",&v1,&v2,&kase);
  41. vis[v1]=true;vis[v2]=true;
  42. switch(kase){
  43. case 1:
  44. merge(v1,v2);
  45. merge(v1+N,v2+N);
  46. break;
  47. case 2:
  48. merge(v1+N,v2);
  49. merge(v2+N,v1);
  50. break;
  51. }
  52. }
  53. }
  54. return;
  55. }
  56. void init(){
  57. cin>>N>>M;
  58. for(int i=1;i<=2*N;i++){
  59. Dad[i]=i;
  60. }
  61. return;
  62. }
  63. int main(){
  64. init();
  65. query();
  66. return 0;
  67. }

L题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int Dad[100000+10];
  4. int N,M;
  5. pair<int,int> num[200000+10];
  6. int size;
  7. int find(int i){
  8. int x=i;
  9. while(Dad[i]!=i){
  10. i=Dad[i];
  11. }
  12. while(x!=i){
  13. Dad[x]=i;
  14. x=Dad[x];
  15. }
  16. return i;
  17. }
  18. void merge(int x,int y){
  19. int m=find(x);
  20. int n=find(y);
  21. Dad[m]=n;
  22. return;
  23. }
  24. void init(){
  25. cin>>N>>M;
  26. for(int i=1;i<=N;i++){
  27. Dad[i]=i;
  28. }
  29. return;
  30. }
  31. int main(){
  32. init();string ss;int v1,v2,opt;
  33. for(int j=0;j<M;j++){
  34. //cout<<j<<endl;
  35. cin>>ss;
  36. if(ss=="A"){
  37. scanf("%d%d%d",&v1,&v2,&opt);
  38. if(opt==1){
  39. merge(v1,v2);
  40. }else{
  41. num[size].first=v1;num[size].second=v2;
  42. size++;
  43. }
  44. }else{
  45. scanf("%d%d",&v1,&v2);
  46. if(find(v1)==find(v2)){
  47. printf("1\n");
  48. }else{
  49. int flag=0;
  50. for(int i=0;i<size;i++){
  51. int x=find(num[i].first);
  52. int y=find(num[i].second);
  53. if(x==find(v1)&&y==find(v2)){
  54. printf("2\n");
  55. flag=1;
  56. break;
  57. }
  58. if(y==find(v1)&&x==find(v2)){
  59. printf("2\n");
  60. flag=1;
  61. break;
  62. }
  63. }
  64. if(!flag){
  65. printf("3\n");
  66. }
  67. }
  68. }
  69. }
  70. return 0;
  71. }

M题

本质上是支持四个操作:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int N,block;
  4. int val[100005],bl[100005],atag[100005];
  5. set<int>st[105];
  6. void add(int a,int b,int c){
  7. for(int i=a;i<=min(bl[a]*block,b);i++){
  8. st[bl[a]].erase(val[i]);
  9. val[i]+=c;
  10. st[bl[a]].insert(val[i]);
  11. }
  12. if(bl[a]!=bl[b]){
  13. for(int i=(bl[b]-1)*block+1;i<=b;i++){
  14. st[bl[b]].erase(val[i]);
  15. val[i]+=c;
  16. st[bl[b]].insert(val[i]);
  17. }
  18. }
  19. for(int i=bl[a]+1;i<=bl[b]-1;i++)
  20. atag[i]+=c;
  21. }
  22. int query(int a,int b,int c){
  23. int ans=-1;
  24. for(int i=a;i<=min(bl[a]*block,b);i++){
  25. int value=val[i]+atag[bl[a]];
  26. if(value<c)ans=max(value,ans);
  27. }
  28. if(bl[a]!=bl[b])
  29. for(int i=(bl[b]-1)*block+1;i<=b;i++){
  30. int value=val[i]+atag[bl[b]];
  31. if(value<c)ans=max(value,ans);
  32. }
  33. for(int i=bl[a]+1;i<=bl[b]-1;i++)
  34. {
  35. int x=c-atag[i];
  36. set<int>::iterator it=st[i].lower_bound(x);
  37. if(it==st[i].begin())continue;
  38. --it;
  39. ans=max(ans,*it+atag[i]);
  40. }
  41. return ans;
  42. }
  43. int main(){
  44. scanf("%d",&N);block=1000;
  45. for(int i=1;i<=N;i++)
  46. scanf("%d",&val[i]);
  47. for(int i=1;i<=N;i++){
  48. bl[i]=(i-1)/block+1;
  49. st[bl[i]].insert(val[i]);
  50. }
  51. for(int i=1;i<=N;i++){
  52. int f,a,b,c;
  53. scanf("%d%d%d%d",&f,&a,&b,&c);
  54. if(f==0)add(a,b,c);
  55. if(f==1)printf("%d\n",query(a,b,c));
  56. }
  57. return 0;
  58. }

N题

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int N,block;
  4. int bl[50005];
  5. int val[50005],sum[50005],flag[50005];
  6. void solve_sqrt(int x){
  7. if(flag[x])
  8. return;
  9. flag[x]=1;sum[x]=0;
  10. for(int i=(x-1)*block+1;i<=x*block;i++){
  11. val[i]=sqrt(val[i]);
  12. sum[x]+=val[i];
  13. if(val[i]>1)
  14. flag[x]=0;
  15. }
  16. }
  17. void add(int a,int b,int c){
  18. for(int i=a;i<=min(bl[a]*block,b);i++){
  19. sum[bl[a]]-=val[i];
  20. val[i]=sqrt(val[i]);
  21. sum[bl[a]]+=val[i];
  22. }
  23. if(bl[a]!=bl[b])
  24. for(int i=(bl[b]-1)*block+1;i<=b;i++){
  25. sum[bl[b]]-=val[i];
  26. val[i]=sqrt(val[i]);
  27. sum[bl[b]]+=val[i];
  28. }
  29. for(int i=bl[a]+1;i<=bl[b]-1;i++)
  30. solve_sqrt(i);
  31. }
  32. int query(int a,int b){
  33. int ans=0;
  34. for(int i=a;i<=min(bl[a]*block,b);i++)
  35. ans+=val[i];
  36. if(bl[a]!=bl[b])
  37. for(int i=(bl[b]-1)*block+1;i<=b;i++)
  38. ans+=val[i];
  39. for(int i=bl[a]+1;i<=bl[b]-1;i++)
  40. ans+=sum[i];
  41. return ans;
  42. }
  43. int main(){
  44. cin>>N;
  45. block=sqrt(N);
  46. for(int i=1;i<=N;i++)
  47. scanf("%d",&val[i]);
  48. for(int i=1;i<=N;i++){
  49. bl[i]=(i-1)/block+1;
  50. sum[bl[i]]+=val[i];
  51. }
  52. for(int i=1;i<=N;i++){
  53. int f,a,b,c;
  54. scanf("%d%d%d%d",&f,&a,&b,&c);
  55. if(f==0)
  56. add(a,b,c);
  57. if(f==1)
  58. printf("%d\n",query(a,b));
  59. }
  60. return 0;
  61. }

Q题

区间更新,单点查询。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 50010
  4. #define LL long long
  5. LL Tree[maxn];
  6. int N;
  7. void renew(int pos,LL val){
  8. while(pos<=N){
  9. Tree[pos]+=val;
  10. pos+=(pos&(-pos));
  11. }
  12. return;
  13. }
  14. LL query(int pos){
  15. LL ans=0;
  16. while(pos){
  17. ans+=Tree[pos];
  18. pos-=(pos&(-pos));
  19. }
  20. return ans;
  21. }
  22. void init(){
  23. scanf("%d",&N);LL val,lst=0;
  24. for(int i=1;i<=N;i++){
  25. scanf("%lld",&val);
  26. val-=lst;
  27. lst+=val;
  28. renew(i,val);
  29. }
  30. return;
  31. }
  32. int main(){
  33. init();int opt,l,r;LL c;
  34. for(int i=1;i<=N;i++){
  35. scanf("%d%d%d%lld",&opt,&l,&r,&c);
  36. switch(opt){
  37. case 0:
  38. renew(l,c);
  39. renew(r+1,-c);
  40. break;
  41. case 1:
  42. printf("%lld\n",query(r));
  43. break;
  44. }
  45. }
  46. return 0;
  47. }

R题

代码运行时间:148ms

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=200000;
  4. int Tree[maxn+10];
  5. int Mod[1000];int N,M,S,Q;
  6. string city;string soldier;
  7. int Huan[30];int vis[30];
  8. void test(){
  9. for(int i=0;i<N;i++){
  10. cout<<vis[i]<<" "<<Huan[i]<<endl;
  11. }
  12. return;
  13. }
  14. void renew(int x,int val){
  15. while(x<=M){
  16. Tree[x]+=val;
  17. x+=(x&(-x));
  18. }
  19. return;
  20. }
  21. int query(int x){
  22. int val=0;
  23. while(x>0){
  24. val+=Tree[x];
  25. x-=(x&(-x));
  26. }
  27. return val;
  28. }
  29. void init(){
  30. cin>>N>>M>>city>>soldier;S=sqrt(M);
  31. for(int i=0;i<N;i++){
  32. if(vis[i]){
  33. continue;
  34. }
  35. int pos=i;int num=0;
  36. while(vis[pos]==0){
  37. vis[pos]=1;
  38. Huan[pos]=num;
  39. pos=city[pos]-'A';
  40. num++;
  41. }
  42. int j=i;
  43. while(j!=pos){
  44. vis[j]=-1;
  45. Huan[j]=0;
  46. j=city[j]-'A';
  47. }
  48. num=num-Huan[pos];
  49. while(vis[pos]==1){
  50. Huan[pos]=num;
  51. vis[pos]=2;
  52. pos=city[pos]-'A';
  53. }
  54. }
  55. return;
  56. }
  57. void multi(int x){
  58. if(x<=S){
  59. Mod[x]++;
  60. }else{
  61. for(int i=x;i<=M;i+=x){
  62. soldier[i-1]=city[soldier[i-1]-'A'];
  63. }
  64. }
  65. return;
  66. }
  67. void find(int x){
  68. int add=query(x);int num=min(S,x);
  69. if(x&1){
  70. for(int i=1;i<=num;i+=2){
  71. if(!(x%i)){
  72. add+=Mod[i];
  73. }
  74. }
  75. }else{
  76. for(int i=1;i<=num;i++){
  77. if(!(x%i)){
  78. add+=Mod[i];
  79. }
  80. }
  81. }
  82. int now=soldier[x-1]-'A';
  83. while(vis[now]==-1){
  84. if(add==0){
  85. printf("%c\n",now+'A');
  86. return;
  87. }else{
  88. now=city[now]-'A';
  89. add--;
  90. }
  91. }
  92. add=add%Huan[now];
  93. while(add){
  94. now=city[now]-'A';
  95. add--;
  96. }
  97. printf("%c\n",now+'A');
  98. return;
  99. }
  100. int main(){
  101. init();cin>>Q;int opt,l,r;
  102. while(Q--){
  103. scanf("%d",&opt);
  104. switch(opt){
  105. case 1:scanf("%d%d",&l,&r);renew(l,1);renew(r+1,-1);break;
  106. case 2:scanf("%d",&r);multi(r);break;
  107. case 3:scanf("%d",&r);find(r);break;
  108. }
  109. }
  110. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注