[关闭]
@suixinhita 2017-10-24T09:41:43.000000Z 字数 4915 阅读 1179

10.21周六例行测试

反正...一旦开始了挂挂挂系列,就一时半会停不下来吧...


T1

此处输入图片的描述

没谁是傻的吧...所以我们很清楚要用循环节了。
找出循环节之后,我们就可以搞事情了。
我们首先明确地知道,中间的循环节里面,每一个循环节显然都是出一个数的。
然后我们把最前面和最后面的摘出来跑一下。
中间循环节直接补上就可以了。

  1. //有的数据可以卡掉这个程序。
  2. #include<map>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #define ll long long
  6. using namespace std;
  7. const int N=1e5+5;
  8. int a[N],A,B,C,D;
  9. int q[N],dp[N],cnt;
  10. ll n,ans,an[N];
  11. map<int,int> M;
  12. void solve()
  13. {
  14. int len=1,i=1;
  15. ll p=min((ll)N-1,n);
  16. for(i=1;i<=p;++i)
  17. {
  18. if(i!=1) a[i]=(A*a[i-1]*a[i-1]%D+B*a[i-1]+C)%D;
  19. if(M[a[i]]!=0)
  20. {
  21. len=i-M[a[i]];break;
  22. }
  23. else M[a[i]]=i;
  24. }
  25. for(int j=i+1;j<=i+len-1;++j)
  26. a[j]=(A*a[j-1]*a[j-1]%D+B*a[j-1]+C)%D;
  27. ll k=n-(ll)i+1-(((n-(ll)i+1)/(ll)len))*(ll)len;
  28. int cnt=i+len-1;
  29. for(int j=1;j<=k;++j)
  30. {
  31. int f=i+j-1;
  32. a[++cnt]=a[f];
  33. }
  34. for(int j=1;j<=cnt;++j)
  35. {
  36. dp[j]=1;
  37. for(int k=1;k<j;++k)
  38. if(a[k]<=a[j]) dp[j]=max(dp[j],dp[k]+1);
  39. an[j]=max(an[j-1],(ll)dp[j]);
  40. }
  41. int maxx=0;
  42. ans=(n-(ll)cnt)/(ll)len+(ll)dp[cnt];
  43. if(p==n) ans=an[i];
  44. printf("%lld\n",ans);
  45. }
  46. int main()
  47. {
  48. freopen("lis.in","r",stdin);
  49. freopen("lis.out","w",stdout);
  50. scanf("%lld",&n);
  51. scanf("%d%d%d%d%d",&a[1],&A,&B,&C,&D);
  52. solve();
  53. return 0;
  54. }

T2

此处输入图片的描述


这道题是我这段时间最尴尬的题,毕竟考场就知道该怎么写,结果剩下10min没调出来,gg.


其实看看数据返回很容易猜到,直接对于最小的取模,算出每一个模数需要的最小的地方就可以了。
这个就是个最短路。
注意:对于 的情况,我们直接苟一波bfs

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define ll long long
  6. using namespace std;
  7. const ll N=1e5+5;
  8. const ll inf=0x3f3f3f3f;
  9. struct data{
  10. int c,u;
  11. };
  12. ll V[N],dis[55][N],dist[N*30];
  13. bool ind[55][N];
  14. int L,C,ret[N],m,n,Q;
  15. void bfs()
  16. {
  17. memset(dist,0x7f,sizeof(dist));
  18. queue<int> q;
  19. dist[0]=0;
  20. q.push(0);
  21. while(!q.empty())
  22. {
  23. int u=q.front();q.pop();
  24. if(dist[u]>=C) continue;
  25. for(int i=1;i<=n;++i)
  26. {
  27. ll v=u+V[i];
  28. if((dist[v]<dist[u]+1))
  29. {
  30. dist[v]=dist[u]+1;
  31. q.push(v);
  32. }
  33. }
  34. }
  35. for(int i=1;i<=n;++i) if(dist[i]>C) dist[i]=inf;
  36. }
  37. void spfa()
  38. {
  39. queue<data> q;
  40. memset(dis,0x7f,sizeof(dis));
  41. dis[0][0]=0,ind[0][0]=1;
  42. data k;k.u=0,k.c=0;
  43. q.push(k);
  44. while(!q.empty())
  45. {
  46. data x=q.front();q.pop();
  47. int u=x.u,c=x.c;data f;f=x;
  48. for(int i=1;i<=n;++i)
  49. {
  50. //printf("L %lld\n",L);
  51. int v=(u+ret[i])%Q;
  52. // printf("%lld %lld\n",V[i],L);
  53. if(V[i]>=L) f.c=c+1;
  54. /* if(u==6&&(i==2||i==3))
  55. {
  56. puts("GG"),printf("%lld %lld\n",v,f.c),printf("%lld L %lld\n",V[i],L);
  57. }
  58. printf("%lld %lld\n",V[i],L);
  59. */ if(f.c>C) continue;
  60. if(dis[f.c][v]>dis[c][u]+V[i])
  61. {
  62. f.u=v;
  63. dis[f.c][v]=dis[c][u]+V[i];
  64. if(!ind[f.c][v]) q.push(f),ind[f.c][v]=1;
  65. }
  66. }
  67. ind[c][u]=0;
  68. }
  69. for(int i=0;i<Q;++i)
  70. for(int c=0;c<=C;++c)
  71. dis[0][i]=min(dis[0][i],dis[c][i]);
  72. }
  73. bool query(ll w)
  74. {
  75. ll p=w%Q;
  76. if(dis[0][p]>w) return 0;
  77. return 1;
  78. }
  79. int main()
  80. {
  81. // freopen("1.txt","r",stdin);
  82. // freopen("11.txt","w",stdout);
  83. ll k;
  84. scanf("%d%d",&n,&m);
  85. for(int i=1;i<=n;++i) scanf("%lld",&V[i]);
  86. sort(V+1,V+1+n);
  87. Q=V[1];
  88. for(int i=1;i<=n;++i) ret[i]=V[i]%Q;
  89. scanf("%d%d",&L,&C);
  90. //printf("------------------------\n%lld\n",L);
  91. if(V[1]>L) bfs();
  92. else spfa();
  93. for(int i=1;i<=m;++i)
  94. {
  95. scanf("%lld",&k);
  96. if(query(k)) puts("Yes");
  97. else puts("No");
  98. }
  99. return 0;
  100. }

T3

此处输入图片的描述


裸树剖,于是开心的没写对...


就是,一旦修改了一个节点,就可以直接修改一个子树和他上面的所有其他值(见图)
此处输入图片的描述

所以我就不多说了。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=1e6+5;
  5. struct data{
  6. int to,next;
  7. }e[N];
  8. int head[N],gs;
  9. void add(int fr,int to)
  10. {
  11. e[++gs].to=to,e[gs].next=head[fr],head[fr]=gs;
  12. }
  13. int num[N],n,m,v[N];
  14. struct node{
  15. int mx,tag;
  16. };
  17. class st
  18. {
  19. private:
  20. node t[N<<3];
  21. int a,b,delt;
  22. void update(int x)
  23. {
  24. int ls=x<<1,rs=x<<1^1;
  25. if(t[ls].mx<t[rs].mx) t[x].mx=t[rs].mx;
  26. else t[x].mx=t[ls].mx;
  27. }
  28. void pushdown(int x)
  29. {
  30. int ls=x<<1,rs=x<<1^1;
  31. if(t[ls].tag<t[x].tag) t[ls].tag=t[x].tag;
  32. if(t[rs].tag<t[x].tag) t[rs].tag=t[x].tag;
  33. if(t[ls].mx<t[ls].tag) t[ls].mx=t[ls].tag;
  34. if(t[rs].mx<t[rs].tag) t[rs].mx=t[rs].tag;
  35. // t[x].tag=t[x].tagp=0;
  36. }
  37. void change(int now,int l,int r)
  38. {
  39. pushdown(now);
  40. if(a<=l&&r<=b)
  41. {
  42. t[now].mx=max(t[now].mx,delt);
  43. t[now].tag=max(t[now].tag,delt);
  44. return ;
  45. }
  46. int mid=l+r>>1;
  47. if(a<=mid) change(now<<1,l,mid);
  48. if(mid<b) change(now<<1^1,mid+1,r);
  49. update(now);
  50. }
  51. int query(int now,int l,int r)
  52. {
  53. pushdown(now);
  54. if(a<=l&&r<=b)
  55. return t[now].mx;
  56. int mid=l+r>>1;
  57. int an=-1;
  58. if(a<=mid) an=max(an,query(now<<1,l,mid));
  59. if(mid<b) an=max(an,query(now<<1^1,mid+1,r));
  60. return an;
  61. }
  62. public:
  63. void CHANGE(int l,int r,int x)
  64. {
  65. a=l,b=r,delt=x;
  66. change(1,1,n);
  67. }
  68. int QUERY(int l,int r)
  69. {
  70. a=l,b=r;
  71. return query(1,1,n);
  72. }
  73. }T;
  74. int size[N],fa[N],dep[N],son[N],top[N],pos[N],ed[N],cnt;
  75. bool once[N],used[N];
  76. void dfs1(int u)
  77. {
  78. size[u]=1;
  79. for(int i=head[u];i;i=e[i].next)
  80. {
  81. int v=e[i].to;
  82. if(v==fa[u]) continue;
  83. fa[v]=u,dep[v]=dep[u]+1;
  84. dfs1(v);size[u]+=size[v];
  85. if(size[v]>size[son[u]]) son[u]=v;
  86. }
  87. }
  88. void dfs2(int u,int tp)
  89. {
  90. top[u]=tp;pos[u]=++cnt,num[cnt]=v[u];
  91. if(son[u]) dfs2(son[u],tp);
  92. for(int i=head[u];i;i=e[i].next)
  93. {
  94. int v=e[i].to;
  95. if(v!=son[u]&&v!=fa[u]) dfs2(v,v);
  96. }
  97. ed[u]=cnt;
  98. }
  99. int query(int p)
  100. {
  101. return T.QUERY(pos[p],pos[p]);
  102. }
  103. void change(int x)
  104. {
  105. if(once[x]) return ;
  106. once[x]=1;
  107. T.CHANGE(pos[x],ed[x],v[x]);
  108. while(x)
  109. {
  110. if(fa[x])
  111. {
  112. if(pos[fa[x]]<=pos[x]-1) T.CHANGE(pos[fa[x]],pos[x]-1,v[fa[x]]);
  113. if(ed[fa[x]]>=ed[x]+1) T.CHANGE(ed[x]+1,ed[fa[x]],v[fa[x]]);
  114. }
  115. if(used[x]) break;
  116. used[x]=1;
  117. x=fa[x];
  118. }
  119. }
  120. int main()
  121. {
  122. // freopen("lca.in","r",stdin);
  123. // freopen("lca.out","w",stdout);
  124. int x,y,k;
  125. char s[10];
  126. scanf("%d%d",&n,&m);
  127. for(int i=1;i<=n;++i) scanf("%d",&v[i]);
  128. for(int i=1;i<n;++i)
  129. {
  130. scanf("%d%d",&x,&y);
  131. add(x,y),add(y,x);
  132. }
  133. dfs1(1);
  134. dfs2(1,1);
  135. for(int i=1;i<=m;++i)
  136. {
  137. scanf("%s%d",s+1,&x);
  138. if(s[1]=='Q')
  139. {
  140. int ans=query(x);
  141. printf("%d\n",ans==0?-1:ans);
  142. }
  143. else change(x);
  144. }
  145. return 0;
  146. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注