Codeforces 990

比赛链接

真特么菜啊 后一个多小时无所事事。。

要多做CF的题啊,也许没有那么难但是就是容易想不到,代码也不难写。

A.Commentary Boxes

  1. //15ms 0KB
  2. //整除一下就行,但是第一次把n,m弄反了。。3次看错题mmp,还写了个二分。
  3. #include <cmath>
  4. #include <cstdio>
  5. #include <cctype>
  6. #include <algorithm>
  7. #define gc() getchar()
  8. typedef long long LL;
  9. LL n,m,A,B;
  10. int main()
  11. {
  12. scanf("%I64d%I64d%I64d%I64d",&n,&m,&A,&B);
  13. LL l=0,r=n/m+1,mid,res=1;
  14. while(l<=r)
  15. if((mid=l+r>>1)<=(double)n/m) res=mid,l=mid+1;
  16. else r=mid-1;
  17. LL ans=std::min(B*(n-res*m),A*((res+1)*m-n));
  18. printf("%I64d",ans);
  19. return 0;
  20. }

B.Micro-World

  1. //31ms 1376KB
  2. //注意重复就好了
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. const int N=2e5+5;
  8. int n,K,A[N],val[N];
  9. inline int read()
  10. {
  11. int now=0;register char c=gc();
  12. for(;!isdigit(c);c=gc());
  13. for(;isdigit(c);now=now*10+c-'0',c=gc());
  14. return now;
  15. }
  16. int main()
  17. {
  18. n=read(), K=read();
  19. int res=n;
  20. for(int i=1; i<=n; ++i) A[i]=read();//,++val[A[i]];
  21. std::sort(A+1,A+1+n);
  22. int cnt=1; val[1]=1;
  23. for(int i=2; i<=n; ++i)
  24. if(A[i]!=A[i-1]) A[++cnt]=A[i], val[cnt]=1;
  25. else ++val[cnt];
  26. for(int i=2; i<=cnt; ++i)
  27. if(A[i]<=A[i-1]+K) res-=val[i-1];
  28. printf("%d",res);
  29. return 0;
  30. }

C.Bracket Sequences Concatenation Problem

  1. //46ms 2472KB
  2. //注意一下非法情况。
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <cstring>
  6. #include <algorithm>
  7. #define gc() getchar()
  8. const int N=3e5+5;
  9. int n,val[N],rval[N];
  10. char s[N];
  11. bool Check1(int l)
  12. {
  13. int n=0;
  14. for(int i=1; i<=l&&n>=0; ++i)
  15. if(s[i]=='(') ++n;
  16. else --n;
  17. return n>=0;
  18. }
  19. bool Check2(int l)
  20. {
  21. int n=0;
  22. for(int i=l; ~i&&n>=0; --i)//这我为什么写的~i?还没WA...
  23. if(s[i]==')') ++n;
  24. else --n;
  25. return n>=0;
  26. }
  27. int main()
  28. {
  29. scanf("%d",&n);
  30. long long res=0;
  31. for(int i=1; i<=n; ++i)
  32. {
  33. scanf("%s",s+1);
  34. int l=strlen(s+1), cnt=0;
  35. for(int j=1; j<=l; ++j)
  36. if(s[j]=='(') ++cnt;
  37. else --cnt;
  38. if(cnt==0)
  39. if(Check1(l)) res+=val[0]*2+1, ++val[0];
  40. else ;
  41. else if(cnt>0)
  42. if(Check1(l)) res+=rval[cnt], ++val[cnt];
  43. else ;
  44. else if(Check2(l)) res+=val[-cnt], ++rval[-cnt];
  45. }
  46. printf("%I64d",res);
  47. return 0;
  48. }

赛后

D.Graph And Its Complement(思路 构造)

首先要画出图发现a,b必有一个为1。。

假设当前图只有n个点,没有边,即a=n,b=1,那么想要让b≠1,即补集中至少有一个点孤立出来,那么这个点要在原图中与其它所有点连边。

好现在b=2,a=1了。

或者这样想,原图有a个连通块,肯定先让每个连通块中的点两两有边。这样在补集中每个点一定与所有不在同一连通块的点有边。

这样所有点又连起来了,即a=a,b=1。

这样每次找俩当前不连通的点就可以使a+1;若是b≠1反过来就行了。

注意在n=2/3时a,b不能同时为1,否则一定可以构造出合法解。

  1. //31ms 800KB
  2. #include <cstdio>
  3. #include <algorithm>
  4. const int N=1005;
  5. int n,A,B;
  6. char mp[N][N];
  7. int main()
  8. {
  9. scanf("%d%d%d",&n,&A,&B);
  10. if(A!=1&&B!=1) return puts("NO"),0;
  11. if((n==2||n==3)&&A==1&&B==1) return puts("NO"),0;
  12. puts("YES");
  13. const char a=A==1?'0':'1', b=a=='1'?'0':'1';//注意b是与a相对!(A=B=1的情况)
  14. for(int i=1; i<=n; ++i)
  15. for(int j=i; j<=n; ++j)
  16. if(i!=j) mp[i][j]=mp[j][i]=b;
  17. else mp[i][j]='0';
  18. for(int i=1, lim=n-std::max(A,B); i<=lim; ++i)
  19. mp[i][i+1]=mp[i+1][i]=a;
  20. for(int i=1; i<=n; ++i) mp[i][n+1]='\0', puts(mp[i]+1);
  21. return 0;
  22. }

E.Post Lamps(贪心)

假设已知要选择哪种灯i。那么从0开始走,每次走i,如果i可放置,那么一定会在i放置而不回去;否则要退回到最近的可放置位置。这其实显然啊。。

\(n/1+n/2+n/3+...+n/n≈O(n\ln n)\),复杂度没问题啊。

  1. //280ms 9600KB
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. //#define gc() getchar()
  6. #define MAXIN 1000000
  7. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  8. const int N=1e6+5;
  9. const long long INF=1e17;
  10. int n,m,K,A[N],move[N];
  11. bool block[N];
  12. char IN[MAXIN],*SS=IN,*TT=IN;
  13. inline int read()
  14. {
  15. int now=0;register char c=gc();
  16. for(;!isdigit(c);c=gc());
  17. for(;isdigit(c);now=now*10+c-'0',c=gc());
  18. return now;
  19. }
  20. int main()
  21. {
  22. n=read(),m=read(),K=read();
  23. int delta=0;
  24. for(int p,i=1; i<=m; ++i)
  25. {
  26. block[p=read()]=1;
  27. move[p]=move[p-1]+1;
  28. delta=std::max(delta,move[p]);
  29. }
  30. if(delta>=K||block[0]) {puts("-1"); return 0;}
  31. for(int i=1; i<=K; ++i) A[i]=read();
  32. long long res=INF;
  33. for(int i=delta+1; i<=K; ++i)
  34. {
  35. int now=0; long long sum=0;
  36. while(now<n)
  37. if(block[now]) now-=move[now];
  38. else now+=i, sum+=A[i];
  39. res=std::min(res,sum);
  40. }
  41. printf("%I64d",res==INF?-1ll:res);
  42. return 0;
  43. }

F.Flow Control(思路)

题目相当于:给定一张图,每个点有一个权值,每条边可以传递任意权值,问能否使每个点的权值为0,并输出边上传递的权值。

无解的情况显然是点权和不为0。否则一定有解。

权值是可以传递的啊!只要从随便一个点开始DFS,不重复走(走出一棵树),如果它的某子树下还有多余的权值,那么这些一定能补到另一棵子树去;某棵不够也能由其它子树补充。

其它边0就行了。

  1. //
  2. #include <cstdio>
  3. #include <cctype>
  4. #define gc() getchar()
  5. const int N=2e5+5;
  6. int n,m,Enum,H[N],nxt[N<<1],to[N<<1],val[N],Ans[N<<1];//Ans:2N!
  7. bool vis[N];
  8. inline int read()
  9. {
  10. int now=0,f=1;register char c=gc();
  11. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  12. for(;isdigit(c);now=now*10+c-'0',c=gc());
  13. return now*f;
  14. }
  15. inline void AddEdge(int u,int v)
  16. {
  17. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
  18. to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
  19. }
  20. int DFS(int x)
  21. {
  22. vis[x]=1;
  23. int sum=val[x];
  24. for(int v,i=H[x]; i; i=nxt[i])
  25. if(!vis[to[i]])
  26. {
  27. v=DFS(to[i]), sum+=v;
  28. if(i&1) Ans[i^1]=-v;
  29. else Ans[i]=v;
  30. }
  31. return sum;
  32. }
  33. int main()
  34. {
  35. n=read();
  36. int sum=0;
  37. for(int i=1; i<=n; ++i) sum+=(val[i]=read());
  38. if(sum) return puts("Impossible"),0;
  39. m=read(), Enum=1;
  40. for(int u,i=1; i<=m; ++i) u=read(),AddEdge(u,read());
  41. DFS(1), puts("Possible");//连通。否则可以用并查集判sum。
  42. for(int i=1; i<=m; ++i) printf("%d\n",Ans[i<<1]);
  43. return 0;
  44. }

G.GCD Counting(思路)

一条gcd=g的路径,其上所有点的权值都至少是g的倍数,即它们是连续的。这样,一个大小为x的连通块且其中点权都为g的倍数,其对Ans[g]的贡献为C(x,2)+x。

这显然算多了。对于2x,3x,...x都会统计,枚举倍数都减掉就可以了。

我们可以对每个点点权分解约数,在其约数的vector中存下它们。然后枚举每个约数g,把每个可行连通块DFS一遍分别统计答案。

或者在点权的vector中存点,在枚举约数时弄出是其倍数的点。

这样复杂度会有问题?反正能过。复杂度O(n*约数个数),2e5内的数的最大约数个数也就100+。

Rank1是用并查集代替了DFS吧。。不过好像也是一样的。

  1. //3400ms 16100KB
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <vector>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. const int N=2e5+3;
  8. int n,tot,A[N],Enum,H[N],nxt[N<<1],to[N<<1];
  9. long long ans[N];
  10. bool ok[N];
  11. std::vector<int> pt[N];
  12. inline int read()
  13. {
  14. int now=0;register char c=gc();
  15. for(;!isdigit(c);c=gc());
  16. for(;isdigit(c);now=now*10+c-'0',c=gc());
  17. return now;
  18. }
  19. inline void AddEdge(int u,int v)
  20. {
  21. to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
  22. to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
  23. }
  24. void DFS(int x)
  25. {
  26. ok[x]=0, ++tot;
  27. for(int i=H[x]; i; i=nxt[i])
  28. if(ok[to[i]]) DFS(to[i]);
  29. }
  30. int main()
  31. {
  32. n=read();
  33. int mx=0;
  34. for(int v,i=1; i<=n; ++i) pt[v=read()].push_back(i), mx=std::max(mx,v);
  35. for(int i=1; i<n; ++i) AddEdge(read(),read());
  36. for(int i=1; i<=mx; ++i)
  37. {
  38. int t=0;
  39. for(int j=i; j<=mx; j+=i)
  40. for(int k=0,v,lim=pt[j].size(); k<lim; ++k)
  41. v=pt[j][k], ok[v]=1, A[++t]=v;
  42. for(int j=1; j<=t; ++j)
  43. if(ok[A[j]])
  44. {
  45. tot=0, DFS(A[j]);
  46. ans[i]+=(1ll*tot*(tot-1)>>1)+tot;
  47. }
  48. }
  49. for(int i=mx-1; i; --i)
  50. if(ans[i])
  51. for(int j=i+i; j<=mx; j+=i) ans[i]-=ans[j];
  52. for(int i=1; i<=mx; ++i)
  53. if(ans[i]) printf("%d %I64d\n",i,ans[i]);
  54. return 0;
  55. }

Educational Codeforces Round 45 (Div 2) (A~G)的更多相关文章

  1. Educational Codeforces Round 47 (Div 2) (A~G)

    目录 Codeforces 1009 A.Game Shopping B.Minimum Ternary String C.Annoying Present D.Relatively Prime Gr ...

  2. Educational Codeforces Round 46 (Div 2) (A~G)

    目录 Codeforces 1000 A.Codehorses T-shirts B.Light It Up C.Covered Points Count(差分) D.Yet Another Prob ...

  3. Educational Codeforces Round 84 (Div. 2)

    Educational Codeforces Round 84 (Div. 2) 读题读题读题+脑筋急转弯 = =. A. Sum of Odd Integers 奇奇为奇,奇偶为偶,所以n,k奇偶性 ...

  4. Educational Codeforces Round 45 (Rated for Div. 2) G - GCD Counting

    G - GCD Counting 思路:我猜测了一下gcd的个数不会很多,然后我就用dfs回溯的时候用map暴力合并就好啦. 终判被卡了MLE.....  需要每次清空一下子树的map... #inc ...

  5. Educational Codeforces Round 45 (Rated for Div. 2) C、D

      C. Bracket Sequences Concatenation Problem time limit per test 2 seconds memory limit per test 256 ...

  6. Educational Codeforces Round 45 (Rated for Div. 2) E - Post Lamps

    E - Post Lamps 思路:一开始看错题,以为一个地方不能重复覆盖,我一想值这不是sb题吗,直接每个power check一下就好....复杂度nlogn 然后发现不是,这样的话,对于每个po ...

  7. Educational Codeforces Round 45 (Rated for Div. 2) F - Flow Control

    F - Flow Control 给你一个有向图,要求你给每条边设置流量,使得所有点的流量符合题目给出的要求. 思路:只有在所有点的流量和为0时有解,因为增加一条边的值不会改变所有点的总流量和, 所以 ...

  8. Educational Codeforces Round 45 (Rated for Div. 2)

    A bracket sequence is a string containing only characters "(" and ")". A regular ...

  9. Educational Codeforces Round 58 Div. 2 自闭记

    明明多个几秒就能场上AK了.自闭. A:签到. #include<iostream> #include<cstdio> #include<cmath> #inclu ...

随机推荐

  1. spring-boot-通用mapper

    数据源依赖 druid官方文档:https://github.com/alibaba/druid/wiki/常见问题 <dependency> <groupId>mysql&l ...

  2. SolrJ API 官方文档最佳实践

    以下内容译自Solr Wiki官方文档,版权没有,随意转载. Solrj 是一个访问solr的Java客户端.它提供了一个java接口用于添加更新和查询solr索引.本页面介绍SolrJ最新版本1.4 ...

  3. Linux USB驱动学习总结(三)---- USB鼠标的加载、初始化和通信过程

    1.usbmouse的定义:usb鼠标既包含usb设备(usb_device)的属性也包含input输入设备(input_dev)的属性 struct usb_mouse { ];///USB鼠标设备 ...

  4. python 结构化数据解析

    # -*- coding: utf-8 -*- # @Time : 2018/8/31 14:32 # @Author : cxa # @File : glomtest.py # @Software: ...

  5. [HBase]region split流程

    1. 简介 HBase 的最小管理单位为region,region会按照region 分裂策略进行分裂. 基于CDH5.4.2 2. 总览

  6. VBA笔记-参考教程

    参考教程1: http://www.cnblogs.com/wuzhiblog/tag/VBA/ 1. VBA中字符换行 VBA中字符换行显示需要使用换行符来完成.下面是常用的换行符          ...

  7. JS正则表达式方法

    使用正则表达式的主要有match,exec,test 1.正则表达式方法test测试给定的字符串是否满足正则表达式,返回值是bool类型的,只有真和假. var user_code = $(" ...

  8. PHP性能调优---php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)

    虽然通过nginx accesslog可以记录用户访问某个接口或者网页所消耗的时间,但是不能清晰地追踪到具体哪个位置或者说函数慢,所以通过php-fpm慢日志,slowlog设置可以让我们很好的看见哪 ...

  9. PHP性能调优---PHP调试工具Xdebug安装配置教程

    说到PHP代码调试,对于有经验的PHPer,通过echo.print_r.var_dump函数,或PHP开发工具zend studio.editplus可解决大部分问题,但是对于PHP入门学习的童鞋来 ...

  10. CodeIgniter典型的表单提交验证代码

    view内容: <?php echo form_open('user/reg'); ?> <h5>用户名</h5> <input type="tex ...