昨天00.35的CF,4点才上床,今天打的昏沉沉的,WA了无数发。 题目还是满漂亮的。 尚有几题待补。

C .Complete Naebbirac's sequence

题意:给定N个数,他们在1到K之间,现在1到K的出现次数的不完全相同的,现在让你进行一次操作,使得他们相同。 操作是加一个数到集合; 或者删去一个数; 或同时一个数,删一个数。

思路:枚举三种情况即可。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define rep(i,a,b) for(int i=a;i<=b;i++)
  4. using namespace std;
  5. const int maxn=;
  6. int a[maxn],num[maxn],N,M;
  7. bool checkdel()
  8. {
  9. int cnt=,x=;
  10. if((N-)%M==) {
  11. rep(i,,M) if(num[i]==(N-)/M+) x=i;
  12. else if(num[i]==(N-)/M) cnt++;
  13. }
  14. else return false;
  15. if((cnt==M-)&&x) {
  16. printf("-%d\n",x);
  17. return true;
  18. }
  19. return false;
  20. }
  21. bool checkadd()
  22. {
  23. bool F=true; int x=,cnt=;
  24. if((N+)%M!=) return false;
  25. rep(i,,M) if(num[i]==(N+)/M) cnt++;
  26. else if(num[i]==(N+)/M-)x=i;
  27. if((cnt==M-)&&x){
  28. printf("+%d\n",x);
  29. return true;
  30. }
  31. return false;
  32. }
  33. bool checkadc()
  34. {
  35. bool F=true; int cnt=,x=,y=;
  36. if(N%M!=) return false;
  37. rep(i,,M) {
  38. if(num[i]==N/M) cnt++;
  39. else if(num[i]>N/M) x=i;
  40. else if(num[i]<N/M) y=i;
  41. }
  42. if(cnt==M-&num[x]==num[y]+) {
  43. printf("-%d +%d\n",x,y); return true;
  44. }
  45. return false;
  46. }
  47. int main()
  48. {
  49. scanf("%d%d",&M,&N);
  50. rep(i,,N) scanf("%d",&a[i]),num[a[i]]++;
  51. if(checkadd()) return ;
  52. if(checkadc()) return ;
  53. if(checkdel()) return ;
  54. puts("*");
  55. return ;
  56. }

D .Daunting device

题意:N个格子排出一排,开始格子颜色都是1;现在有M个操作: N,M<1e5

或,把区间[L,R]颜色改为c;   或,查询一共有多少格子颜色为c。  最后求颜色最多的数量。

数据是随机的,且强制在线。

思路:ODT裸题。维护相同颜色的区间。注意split的时候先split(R+1),再split(L);因为这个我wa20了;

这里有写。 大概就是会改变指针啥的,我对iterator不了解,所以不知道,记下来好了。

开始想的分块也能做,但是我感觉还带个log。N*sqrt*log,数据水的话没准可以。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define rep(i,a,b) for(int i=a;i<=b;i++)
  4. using namespace std;
  5. struct in{
  6. int L,R,v;
  7. in(){}
  8. in(int LL,int RR,int vv):L(LL),R(RR),v(vv){}
  9. friend bool operator<(in a,in b){
  10. if(a.L==b.L) return a.R<b.R;
  11. return a.L<b.L;
  12. }
  13. };
  14. set<in>s;
  15. #define IT set<in>::iterator
  16. int num[],ans;
  17. IT split(int pos)
  18. {
  19. IT it=s.lower_bound(in(pos,-,-));
  20. if(it!=s.end()&&(*it).L==pos) return it;
  21. it--; //if(pos>it->R) return s.end();
  22. int l=(*it).L,r=(*it).R,v=(*it).v;
  23. s.erase(it);
  24. s.insert(in(l,pos-,v));
  25. return s.insert(in(pos,r,v)).first;
  26. }
  27. void Assign(int L,int R,int X)
  28. {
  29. IT it2=split(R+),it1=split(L);
  30. for(IT it=it1;it!=it2;it++) {
  31. num[(*it).v]-=((*it).R-(*it).L+);
  32. }
  33. s.erase(it1,it2);
  34. s.insert(in(L,R,X));
  35. num[X]+=R-L+;
  36. }
  37. int main()
  38. {
  39. int N,L,C,P,X,A,B,S;
  40. scanf("%d%d%d",&L,&C,&N);
  41. s.insert(in(,L-,)); num[]=L;
  42. rep(i,,N){
  43. scanf("%d%d%d%d",&P,&X,&A,&B); A%=L; B%=L;
  44. S=num[P]%L;
  45. int l=(A+1LL*S*S%L)%L,r=(A+1LL*(S+B)*(S+B)%L)%L;
  46. Assign(min(l,r),max(l,r),X);
  47. }
  48. rep(i,,C) ans=max(ans,num[i]);
  49. printf("%d\n",ans);
  50. return ;
  51. }

E .Enigma

题意:给定一个字符串c[]和整数N,,或者是'?',或者是数字, '?'表示你可以替换为数字。 让你求字典序最小的c,满足他是N的倍数, |c|,N<1000;无解输出"*";

思路:显然是DP,dp[i][j]表示前i位%N是否可以为j; 开始时,dp[0][0]=1; 然后做背包,最后倒着来,就可以得到最小字典序了。O(N^2);

注意第一位不能为0;

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define rep(i,a,b) for(int i=a;i<=b;i++)
  4. #define rep2(i,a,b) for(int i=a;i>=b;i--)
  5. using namespace std;
  6. const int maxn=;
  7. char c[maxn]; int dp[maxn][maxn],N,L,fac[maxn];
  8. int main()
  9. {
  10. scanf("%s%d",c+,&N);
  11. L=strlen(c+);
  12. fac[]=%N; rep(i,,L) fac[i]=fac[i-]*%N;
  13. dp[L+][]=;
  14. rep2(i,L,){
  15. if(c[i]=='?'){
  16. rep(k,,)
  17. rep(j,,N-)
  18. dp[i][(j+k*fac[L-i])%N]|=dp[i+][j];
  19. }
  20. else {
  21. rep(j,,N-)
  22. dp[i][(j+(c[i]-'')*fac[L-i])%N]|=dp[i+][j];
  23. }
  24. }
  25. if(!dp[][]) puts("*");
  26. else{
  27. int now=;
  28. rep(i,,L){
  29. if(c[i]!='?'){
  30. putchar(c[i]);
  31. now=((now-(c[i]-'')*fac[L-i])%N+N)%N;
  32. }
  33. else{
  34. rep(j,,){
  35. if(i==&&j==) continue;
  36. if(dp[i+][((now-j*fac[L-i])%N+N)%N]) {
  37. printf("%d",j);
  38. now=((now-j*fac[L-i])%N+N)%N;
  39. break;
  40. }
  41. }
  42. }
  43. }
  44. }
  45. return ;
  46. }

F .Fundraising

题意:现在有N个慈善家,每个人有ai和bi属性,以及准备捐的款ci。有矛盾的慈善家不能同时出场,两个人有矛盾,当前仅当(ai-aj)*(bi-bj)<0;问怎么安排出场捐款最大。

思路:典型的一维排序,一维用线段树或者树状数组更新DP值。

注意有两个人的a和b完全相同的情况,我们把ci小的那个人删去。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define rep(i,a,b) for(int i=a;i<=b;i++)
  4. using namespace std;
  5. const int maxn=;
  6. struct in{
  7. int b,f;ll d;
  8. friend bool operator <(in w,in v){
  9. if(w.b!=v.b) return w.b<v.b;
  10. return w.f>v.f;
  11. }
  12. }s[maxn];
  13. ll Mx[maxn],res[maxn],ans; int b[maxn],tot;
  14. void update(int Now,int L,int R,int pos,ll val)
  15. {
  16. if(L==R){Mx[Now]=max(Mx[Now],val); return ;}
  17. int Mid=(L+R)>>;
  18. if(pos<=Mid) update(Now<<,L,Mid,pos,val);
  19. else update(Now<<|,Mid+,R,pos,val);
  20. Mx[Now]=max(Mx[Now<<|],Mx[Now<<]);
  21. }
  22. ll query(int Now,int L,int R,int l,int r)
  23. {
  24. if(l<=L&&r>=R) return Mx[Now];
  25. int Mid=(L+R)>>; ll res=;
  26. if(l<=Mid) res=max(res,query(Now<<,L,Mid,l,r));
  27. if(r>Mid) res=max(res,query(Now<<|,Mid+,R,l,r));
  28. return res;
  29. }
  30. int main()
  31. {
  32. int N; scanf("%d",&N);
  33. rep(i,,N){
  34. scanf("%d%d%lld",&s[i].b,&s[i].f,&s[i].d);
  35. b[++tot]=s[i].f;
  36. }
  37. sort(b+,b+tot+); tot=unique(b+,b+tot+)-(b+);
  38. rep(i,,N) s[i].f=lower_bound(b+,b+tot+,s[i].f)-b;
  39. sort(s+,s+N+);
  40. rep(i,,N-) {
  41. if(s[i].f==s[i+].f&&s[i].b==s[i+].b) s[i+].d+=s[i].d,s[i].d=;
  42. }
  43. sort(s+,s+N+);
  44. rep(i,,N) {
  45. int j=i;
  46. while(j+<=N&&s[j].b==s[j+].b) j++;
  47. rep(k,i,j) {
  48. if(s[k].f>)res[k]=query(,,tot,,s[k].f-);
  49. res[k]+=s[k].d;
  50. ans=max(ans,res[k]);
  51. }
  52. rep(k,i,j)
  53. update(,,tot,s[k].f,res[k]);
  54. i=j;
  55. }
  56. printf("%lld\n",Mx[]);
  57. return ;
  58. }

H .Hard choice

by .pb 应该是个水题,懒得看了

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. int a,b,c,x,y,z;
  5. template<class T>
  6. inline void read(T&a){
  7. char c=getchar();
  8. for(a=;(c<''||c>'')&&c!='-';c=getchar());
  9. bool f=;if(c=='-')f=,c=getchar();
  10. for(;c>=''&&c<='';c=getchar())a=a*+c-'';
  11. if(f)a=-a;
  12. }
  13. int main(){
  14. read(a),read(b),read(c),read(x),read(y),read(z);
  15. printf("%d\n",max(,x-a)+max(y-b,)+max(z-c,));
  16. return ;
  17. }

I .Imperial roads

题意:给定N点M边带权连通图,现在Q次询问,每次问在必选某条边的情况下,最小生成树的大小。

思路:先建一个MST,大小为sum, 如果询问边已经在树上,那么答案是sum; 否则,ans=sum-len+maxedge(u->lca->v);

即是用环里最大替换掉。。。老掉牙的基础题了,可以用树剖或者倍增求路径最大边权。

  1. #include<bits/stdc++.h>
  2. #define pii pair<int,int>
  3. #define rep(i,a,b) for(int i=a;i<=b;i++)
  4. #define rep2(i,a,b) for(int i=a;i>=b;i--)
  5. #define ll long long
  6. using namespace std;
  7. const int maxn=;
  8. struct in{
  9. int u,v,len;
  10. friend bool operator<(in a,in b){ return a.len<b.len; }
  11. }s[maxn];
  12. int fa[maxn],dep[maxn],f[maxn][],Mx[maxn][];
  13. int Laxt[maxn],Next[maxn<<],To[maxn<<],Len[maxn<<],cnt;
  14. map<pii,int>mp;
  15. void add(int u,int v,int w){
  16. Next[++cnt]=Laxt[u]; Laxt[u]=cnt;To[cnt]=v;Len[cnt]=w;
  17. }
  18. int find(int x){
  19. if(x==fa[x]) return x;
  20. return fa[x]=find(fa[x]);
  21. }
  22. void dfs(int u,int pre)
  23. {
  24. f[u][]=pre; dep[u]=dep[pre]+;
  25. for(int i=Laxt[u];i;i=Next[i]){
  26. if(To[i]!=pre){
  27. dfs(To[i],u);
  28. Mx[To[i]][]=Len[i];
  29. }
  30. }
  31. }
  32. int LCA(int u,int v)
  33. {
  34. if(dep[u]<dep[v]) swap(u,v);
  35. rep2(i,,) if(dep[f[u][i]]>=dep[v]) u=f[u][i];
  36. if(u==v) return u;
  37. rep2(i,,) if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
  38. return f[u][];
  39. }
  40. int query(int u,int v)
  41. {
  42. int Lca=LCA(u,v),res=;
  43. rep2(i,,) if(dep[f[u][i]]>=dep[Lca]) {
  44. res=max(res,Mx[u][i]);u=f[u][i];
  45. }
  46. rep2(i,,) if(dep[f[v][i]]>=dep[Lca]) {
  47. res=max(res,Mx[v][i]);v=f[v][i];
  48. }
  49. return res;
  50. }
  51. int main()
  52. {
  53. int N,M,Q,u,v,sum=;
  54. scanf("%d%d",&N,&M);
  55. rep(i,,N) fa[i]=i;
  56. rep(i,,M){
  57. scanf("%d%d%d",&s[i].u,&s[i].v,&s[i].len);
  58. if(s[i].u>s[i].v) swap(s[i].u,s[i].v);
  59. mp[pii(s[i].u,s[i].v)]=s[i].len;
  60. }
  61. sort(s+,s+M+);
  62. rep(i,,M){
  63. int fu=find(s[i].u),fv=find(s[i].v);
  64. if(fu!=fv){
  65. mp[pii(s[i].u,s[i].v)]=;
  66. fa[fu]=fv; add(s[i].u,s[i].v,s[i].len);
  67. add(s[i].v,s[i].u,s[i].len); sum+=s[i].len;
  68. }
  69. }
  70. dfs(,);
  71. rep(i,,)
  72. rep(j,,N){
  73. f[j][i]=f[f[j][i-]][i-];
  74. Mx[j][i]=max(Mx[j][i-],Mx[f[j][i-]][i-]);
  75. }
  76. scanf("%d",&Q);
  77. rep(i,,Q){
  78. scanf("%d%d",&u,&v); if(u>v) swap(u,v);
  79. if(mp[pii(u,v)]==) printf("%d\n",sum);
  80. else printf("%d\n",sum+mp[pii(u,v)]-query(u,v));
  81. }
  82. return ;
  83. }

J .Jumping frog

题意:给定一个石头和水坑组成的环,顺时针依次是0到N-1;现在问对于K=[1,N-1],有多少个K满足,至少有一个点作为起点,每次顺时针跳到第K个点上,直到回到出发点,这个过程中不会跳到水坑中。

思路:对于K,我们直到他遍历的点和起点的距离的N/gcd(N,K)的倍数。 所以我们可枚举N/gcd(N,K);这个数是N的因子,数量比较少,对于每个因子,我们去暴力找即可。

还可以优化:如果k满足,那么k的倍数也满足。

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=a;i<=b;i++)
  3. using namespace std;
  4. const int maxn=;
  5. char c[maxn]; int fac[maxn],vis[maxn],tot,N,ans;
  6. bool judge(int bg,int L)
  7. {
  8. int Now=bg;
  9. while(true){
  10. if(c[Now]=='P') return false;
  11. Now=Now+L;
  12. if(Now>=N) Now-=N;
  13. if(Now==bg) break;
  14. }
  15. return true;
  16. }
  17. bool check(int L)
  18. {
  19. rep(i,,L-)
  20. if(judge(i,L)) return true;
  21. return false;
  22. }
  23. int main()
  24. {
  25. scanf("%s",c); N=strlen(c);
  26. rep(i,,N-) if(N%i==) fac[++tot]=i;
  27. rep(i,,tot) if(check(fac[i])) vis[fac[i]]=;
  28. rep(i,,N-) ans+=vis[__gcd(i,N)];
  29. printf("%d\n",ans);
  30. return ;
  31. }

Gym 101889:2017Latin American Regional Programming Contest(寒假自训第14场)的更多相关文章

  1. Gym.102006:Syrian Collegiate Programming Contest(寒假自训第11场)

    学习了“叙利亚”这个单词:比较温和的一场:几何的板子eps太小了,坑了几发. A .Hello SCPC 2018! 题意:给定一个排列,问它是否满足,前面4个是有序的,而且前面4个比后面的都小. 思 ...

  2. Gym.101908 Brazil Subregional Programming Contest(寒假自训第六场)

    这几天睡眠时间都不太够,室友晚上太会折腾了,感觉有点累,所以昨天的题解也没写,看晚上能不能补起来. B . Marbles 题意:给定N组数(xi,yi),玩家轮流操作,每次玩家可以选择其中一组对其操 ...

  3. 训练20191007 2017-2018 ACM-ICPC Latin American Regional Programming Contest

    2017-2018 ACM-ICPC Latin American Regional Programming Contest 试题地址:http://codeforces.com/gym/101889 ...

  4. 2017-2018 ACM-ICPC Latin American Regional Programming Contest PART (11/13)

    $$2017-2018\ ACM-ICPC\ Latin\ American\ Regional\ Programming\ Contest$$ \(A.Arranging\ tiles\) \(B. ...

  5. 2017-2018 ACM-ICPC Latin American Regional Programming Contest

    题面pdfhttps://codeforc.es/gym/101889/attachments/download/7471/statements-2017-latam-regional.pdf zyn ...

  6. 2017-2018 ACM-ICPC Latin American Regional Programming Contest GYM101889

    挺有意思的一套题,题也没有啥毒瘤了,本来是队切的结果种种原因大家全挂机了. 只补了百人题,一共7个,其他的暂时先不补了,,也不会嘛qwq H:签到 #include <bits/stdc++.h ...

  7. 2017-2018 ACM-ICPC Latin American Regional Programming Contest D.Daunting device

    题意:一个数组n个操作每次先查询p颜色的数量然后求出区间,区间染色成x,然后求最大染色数 题解:odt裸题,多维护一个color个数数组就好了 //#pragma comment(linker, &q ...

  8. Gym.101955: Asia Shenyang Regional Contest(寒假自训第10场)

    C.Insertion Sort 题意:Q次询问,每次给出N,M,Mod,问你有多少种排列,满足前面M个数字排序之后整个序列的LIS>=N-1. 思路:我们把数字看成[1,M],[N-M+1,N ...

  9. 2017-2018 ACM-ICPC Latin American Regional Programming Contest Solution

    A - Arranging tiles 留坑. B - Buggy ICPC 题意:给出一个字符串,然后有两条规则,如果打出一个辅音字母,直接接在原字符串后面,如果打出一个元音字母,那么接在原来的字符 ...

随机推荐

  1. 利用神经网络进行网络流量识别——特征提取的方法是(1)直接原始报文提取前24字节,24个报文组成596像素图像CNN识别;或者直接去掉header后payload的前1024字节(2)传输报文的大小分布特征;也有加入时序结合LSTM后的CNN综合模型

    国外的文献汇总: <Network Traffic Classification via Neural Networks>使用的是全连接网络,传统机器学习特征工程的技术.top10特征如下 ...

  2. hosts.allow和hosts.deny支持哪些服务

    一.背景简介 在linux上多用iptables来限制ssh和telnet,编缉hosts.allow和hosts.deny感觉比较麻烦比较少用. aix没有iptables且和linux有诸多不同, ...

  3. docker安装使用教程(Kali2.0)

    一.apt安装 apt直接安装是最好的,因为apt源中的其他docker相关组件,也是与docker匹配的版本. apt-get install docker docker-compose 二.手动安 ...

  4. laravel中对模型和路由做缓存,提高性能

    模型缓存命令: php think optimize:schema 路由缓存命令: php think optimize:route

  5. 批量设置样式json版

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. UVa LA 3695 - Distant Galaxy 前缀和,状态拆分,动态规划 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  7. ngnix笔记

    ngnix可通过-s 参数控制,如quit正常退出:reload重载配置文件,具体参考:http://nginx.org/en/docs/switches.html ngnix的指令解释请参考这里:h ...

  8. Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制?

    目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...

  9. Android 删除图片等资源文件 通知系统更新,重新扫描

    public void delPic(String path){ File delFile = new File(path); if (delFile.exists()) { delFile.dele ...

  10. Python基础学习(第4天)

    Python进阶 第1课:词典(dictionary) 1.词典可以存储多个元素,存储多个元素的对象称为容器(container) 第2课:文本文件的读取写入 1.打开一个文件,用对象来代表这个文件 ...