一句话题意:

A:给出两个长为\(n\),\(m\)的的数组,每个数在\(1\)到\(9\)之间,求出一个最小的数使得至少有一位出现在一个数组中,且至少有一位出现在另一个数组中。\(n,m\leq9\)

B:给出一个长度为\(n\)的数组\(a\),将它分成\(k\)段,最大化每一段最小值的最大值。\(1\leq{k}\leq{n}\leq10^5,-10^9\leq{a_i}\leq10^9\)

C:\(q\)个询问将自然数\(n\)最多能分成多少个合数的和。\(q\leq{10^5},1\leq{n}\leq{10^9}\)

D:交互题。有一个排列\(p\)但你不知道,你只知道它的长度\(n\),然后还有一个排列\(b\)满足\(\forall{i}\in[1,n],p_{b_i}=i\),你每次可以询问\(p_i\ xor\ b_j\)的值,不能询问超过\(2\times{n}\)次,然后注意到即使询问\(n^2\)次这个数组也不一定只有唯一解,因此你需要输出这个数组的合法解的个数和任意一组解。\(n\leq5000\),排列从\(0\)开始标号。

E:给出平面上的\(n\)个点,每个点可以选择什么事儿都不干,画一条垂线或画一条水平线,如果出现重叠算作是一根线,问可能出现的图形的方案数对\(10^9+7\)取模。\(n\leq{10^5},-10^9\leq{x_i,y_i}\leq10^9\)


题解:

A:直接贪心,答案的位数肯定小于等于\(2\),然后注意特判一下答案是一位数的情况。

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. int n,m,mna,mnb;
  8. int a[100],b[100];
  9. bool visa[100],visb[100];
  10. inline int read(){
  11. int x=0,f=1; char ch=getchar();
  12. for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
  13. for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
  14. return x*f;
  15. }
  16. inline void print(int x){
  17. if (x<0){putchar('-'); x=-x;}
  18. if (x>=10) print(x/10);
  19. putchar(x%10+'0');
  20. }
  21. int main(){
  22. n=read(),m=read();
  23. for (int i=1;i<=n;i++) a[i]=read(),visa[a[i]]=1;
  24. for (int i=1;i<=m;i++) b[i]=read(),visb[b[i]]=1;
  25. for (int i=1;i<=9;i++) if (visa[i]&&visb[i]){printf("%d\n",i); return 0;}
  26. for (int i=1;i<=9;i++) if (visa[i]){mna=i; break;}
  27. for (int i=1;i<=9;i++) if (visb[i]){mnb=i; break;}
  28. printf("%d%d\n",min(mna,mnb),max(mna,mnb));
  29. return 0;
  30. }

B:当\(k=1\)时直接输出最小值,当\(k\geq3\)时直接输出最大值,否则枚举从哪分开记一个前缀后缀\(min\)即可,当然也可以直接输出\(max(a_1,a_n)\)

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. #define maxn 100005
  8. const int inf=2e9;
  9. int n,k,mx=-inf,mn=inf,ans=-inf;
  10. int a[maxn],pre[maxn],suf[maxn];
  11. inline int read(){
  12. int x=0,f=1; char ch=getchar();
  13. for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
  14. for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
  15. return x*f;
  16. }
  17. inline void print(int x){
  18. if (x<0){putchar('-'); x=-x;}
  19. if (x>=10) print(x/10);
  20. putchar(x%10+'0');
  21. }
  22. int main(){
  23. n=read(),k=read();
  24. for (int i=1;i<=n;i++) a[i]=read(),mx=max(mx,a[i]),mn=min(mn,a[i]);
  25. if (k==1){printf("%d\n",mn); return 0;}
  26. if (k>=3){printf("%d\n",mx); return 0;}
  27. pre[0]=inf; for (int i=1;i<=n;i++) pre[i]=min(pre[i-1],a[i]);
  28. suf[n+1]=inf; for (int i=n;i;i--) suf[i]=min(suf[i+1],a[i]);
  29. for (int i=1;i<n;i++) ans=max(ans,max(pre[i],suf[i+1]));
  30. printf("%d\n",ans);
  31. return 0;
  32. }

C:首先把不合法的判掉,然后肯定是分成若干个\(4\)更优,然后各种特判细节详见代码。

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. int n,m;
  8. inline int read(){
  9. int x=0,f=1; char ch=getchar();
  10. for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
  11. for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
  12. return x*f;
  13. }
  14. inline void print(int x){
  15. if (x<0){putchar('-'); x=-x;}
  16. if (x>=10) print(x/10);
  17. putchar(x%10+'0');
  18. }
  19. int main(){
  20. for (int T=read();T;T--){
  21. n=read();
  22. if (n<=3){puts("-1"); continue;}
  23. if (n%4==0) printf("%d\n",n/4);
  24. else if (n%4==1){
  25. if (n==5) puts("-1");
  26. else printf("%d\n",n/4-1);
  27. }
  28. else if (n%4==2) printf("%d\n",n/4);
  29. else{
  30. if (n==7||n==11) puts("-1");
  31. else printf("%d\n",n/4-1);
  32. }
  33. }
  34. return 0;
  35. }

D:别被交互题给吓懵逼了,反正对于我这种从来没做过交互题的菜鸡就直接跳了,结果搞清楚套路才发现这就是一道思博题。

询问就直接询问\(p[0]\)对\(b\)数组每一个元素的异或值以及\(b[0]\)对\(p\)数组每一个元素的异或值,然后直接枚举\(p[0]\)就能算出\(b\)数组进而算出\(p\)数组,然后判一判是否合法就完了。。。反正可以\(n^2\)以及这是cf的机子瞎捷豹暴力就好了。。。。

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. #define maxn 5005
  8. int n,m,cnt,flag=1;
  9. int a[maxn],b[maxn],c[maxn],d[maxn],ans[maxn];
  10. inline int read(){
  11. int x=0,f=1; char ch=getchar();
  12. for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
  13. for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
  14. return x*f;
  15. }
  16. inline void print(int x){
  17. if (x<0){putchar('-'); x=-x;}
  18. if (x>=10) print(x/10);
  19. putchar(x%10+'0');
  20. }
  21. int main(){
  22. n=read();
  23. for (int i=0;i<n;i++) printf("? 0 %d\n",i),fflush(stdout),a[i]=read();
  24. for (int i=0;i<n;i++) printf("? %d 0\n",i),fflush(stdout),b[i]=read();
  25. for (int pps=0;pps<n;pps++){
  26. for (int i=0;i<n;i++) c[i]=a[i]^pps;
  27. for (int i=0;i<n;i++) d[i]=b[i]^c[0];
  28. if (pps!=d[0]) goto end;
  29. for (int i=0;i<n;i++) if (d[c[i]]!=i) goto end;
  30. if (flag) flag=0,memcpy(ans,d,sizeof(d)); ++cnt;
  31. end:;
  32. }
  33. puts("!"); printf("%d\n",cnt);
  34. for (int i=0;i<n;i++) printf("%d ",ans[i]); puts("");
  35. return 0;
  36. }

E:首先离散化还是必须的,然后我们把一个点能作的两条直线看成是一个图中的一个点,然后把它们俩之间连一条边,显然这个图会有许许多多的连通块,然后连通块之间互不影响,考虑对每一个连通块计数,最后乘起来就好了。

首先可以把题意转化成这么样的一个东西:连通块的每条边都是无向边,现在每条边可以定方向,要么是\(u\to{v}\),要么是\(v\to{u}\),要么不管它,然后问最后入度不为\(0\)的点的集合的方案数。

首先考虑如果连通块是树的情况怎么求首先设连通块的大小为\(n\),树的话首先不可能每个点都被选,因为一共才\(n-1\)条边,然后除此之外任意的情况都存在,证明的话就是考虑任意一个大小为\(n-1\)的集合都合法,因为我们可以把剩下的那个点作为根,然后每一条边都定向为父亲指向儿子即可,然后这些集合的任意一个子集也是合法的,因为边我可以不定向,因而得证。也就是说树的情况答案就是\(2^n-1\)

然后如果一旦存在环,那么答案就是\(2^n\),这个也很简单证,一定可以构造出一种方案使得每个点都被选上,假设这个图比树多了一条边\(<u,v>\),我们只需要忽视这条边然后以\(u\)为根按照树的情况定向,然后这条边定向为\(v\to{u}\)即可。也就是说不是树那么答案就是\(2^n\)

然后用并查集维护即可。

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. #define maxn 100005
  8. const int mod=1e9+7;
  9. int n,m,cnt_x,cnt_y,ans=1;
  10. int vx[maxn],vy[maxn];
  11. struct point{int x,y;}p[maxn];
  12. inline int read(){
  13. int x=0,f=1; char ch=getchar();
  14. for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
  15. for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
  16. return x*f;
  17. }
  18. inline void print(int x){
  19. if (x<0){putchar('-'); x=-x;}
  20. if (x>=10) print(x/10);
  21. putchar(x%10+'0');
  22. }
  23. struct union_find_set{
  24. int fa[maxn*2],size[maxn*2]; bool cir[maxn*2];
  25. void initialize(){for (int i=1;i<=2*n;i++) fa[i]=i;}
  26. int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
  27. void merge(int x,int y){
  28. x=find(x),y=find(y);
  29. if (x==y) cir[x]=1; else fa[x]=y,cir[y]|=cir[x];
  30. }
  31. }u;
  32. int power(int a,int k){
  33. int ret=1;
  34. for (;k;k>>=1,a=1ll*a*a%mod) if (k&1) ret=1ll*ret*a%mod;
  35. return ret;
  36. }
  37. int main(){
  38. n=read(); u.initialize();
  39. for (int i=1;i<=n;i++){
  40. p[i].x=read(),p[i].y=read();
  41. vx[++cnt_x]=p[i].x,vy[++cnt_y]=p[i].y;
  42. }
  43. sort(vx+1,vx+cnt_x+1); int tmp_x=unique(vx+1,vx+cnt_x+1)-vx-1;
  44. for (int i=1;i<=n;i++) p[i].x=lower_bound(vx+1,vx+tmp_x+1,p[i].x)-vx;
  45. sort(vy+1,vy+cnt_y+1); int tmp_y=unique(vy+1,vy+cnt_y+1)-vy-1;
  46. for (int i=1;i<=n;i++) p[i].y=lower_bound(vy+1,vy+tmp_y+1,p[i].y)-vy;
  47. for (int i=1;i<=n;i++) u.merge(p[i].x,p[i].y+n);
  48. for (int i=1;i<=tmp_x;i++) ++u.size[u.find(i)];
  49. for (int i=1;i<=tmp_y;i++) ++u.size[u.find(i+n)];
  50. for (int i=1;i<=(n<<1);i++) if (u.size[i]){
  51. ans=1ll*ans*(power(2,u.size[i])-(!u.cir[i]))%mod;
  52. }
  53. printf("%d\n",(ans+mod)%mod);
  54. return 0;
  55. }

Codeforces Round #440(Div.2)的更多相关文章

  1. Codeforces Round #581(Div. 2)

    Codeforces Round #581(Div. 2) CF 1204 A. BowWow and the Timetable 题解:发现,$4$的幂次的二进制就是一个$1$后面跟偶数个$0$. ...

  2. Codeforces Round #334(div.2)(新增不用二分代码) B

    B. More Cowbell time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. Codeforces Round #334(div.2) A

    A. Uncowed Forces time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  4. codeforces Round #389(Div.2)C Santa Claus and Robot(思维题)

    题目链接:http://codeforces.com/contest/752/problem/C 题意:给出一系列机器人的行动方向(机器人会走任意一条最短路径),问最少标记几个点能让机器人按这个 路径 ...

  5. Codeforces Round #626 (Div. 2) B. Count Subrectangles

    题目连接:https://codeforces.com/contest/1323/problem/B 题意:给一个大小为n的a数组,一个大小为m的b数组,c数组是二维数组c[i][j]=a[i]*b[ ...

  6. Codeforces Round #342 (Div 2) 解题报告

    除夕夜之有生之年CF第一场 下午从奶奶家回到姥姥家,一看还有些时间,先吃点水果陪姥姥姥爷聊了会儿,再一看表,5:20....woc已经开场20分钟了...于是抓紧时间乱搞.. **A. Guest F ...

  7. Codeforces Round 1153(div. 2)

    这场奇差.ABCD四题.179名. 但是E在现场有213个人做出. 描述一下我在35分钟做完D后的心路历程. 首先看到这道E,第一下想到的是把所有的横向和竖向的整列(行)求出相连的个数. 然后想如何能 ...

  8. Codeforces Round #345 (Div 2)

    最后两题是orzCJK学长帮忙代打的,不过总算是到蓝名了(上次睡迟了,只剩半个小时,结果作大死点开题目看,结果rating掉了100多),还有论代码风格的重要性!!!(没写空格被学长各种D) A题 题 ...

  9. Codeforces Round #622(Div 2)C2. Skyscrapers (hard version)

    题目链接 : C2. Skyscrapers (hard version) 题目描述 : 与上一道题类似,只是数据范围变大, 5e5, 如果用我们原来的方法,铁定是超时的. 考察点 : 单调栈,贪心, ...

随机推荐

  1. [C++]#if !defined 的作用

    当你用VC的菜单新增一个类,你会发现自动生成的代码总是类似下面的样子: #if !defined(AFX_XXXX__INCLUDED_) #define  AFX_XXXX__INCLUDED_ 具 ...

  2. S运算符&&和|| 及其优先级

    a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回aa || b : 将a, b转换为Boolean类型, 再执行逻辑或, tru ...

  3. 1305: [CQOI2009]dance跳舞

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4169  Solved: 1804[Submit][Status][Discuss] Descripti ...

  4. java util - 在java代码中执行javascript代码工具 rhino-1.7.7.jar

    需要 rhino-1.7.7.jar 包 代码示例: package cn.java.mozilla.javascript; import org.mozilla.javascript.Context ...

  5. Python知识点入门笔记——特色数据类型(集合)

    集合是一种不重复的无序集 集合用花括号来定义{} 集合和字典一样,里面的顺序是无序的,{1,2,3}和{3,2,1}是相等的 集合的元素不可重复,也就是说{1,2,2,3}是不存在的,应该写为{1,2 ...

  6. day 85 Vue学习七之vue-cookie

      Vue学习七之vue-cookie   通过vue如何操作cookie呢 参考链接:https://www.jianshu.com/p/535b53989b39 第一步:安装vue-cookies ...

  7. B1061 判断题 (15分)

    B1061 判断题 (15分) 判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人 ...

  8. 配置Spring.NET

    先引入关键的程序集 Common.Logging.dll Spring.Core.dll 在配置文件配置中: <configSections> ...... <sectionGrou ...

  9. python项目中输出指定颜色的日志

    起因 在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中.而一般的应用服务器,第三方库,甚至服务器的一些通告也会在终端中显示,这样就搅乱了我们想 ...

  10. Redis实现之压缩列表

    压缩列表 压缩列表(ziplist)是列表键和哈希键的底层实现之一,当一个列表键只包含少量列表项,并且每个列表项要嘛是整数值,要嘛是比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现. ...