Preface

在一个月黑风高的夜晚我这个蒟蒻正踌躇着打什么比赛好

是继续做一场AGC,还是去刷一场CF

然后,一道金光闪过(滑稽),我们的红太阳bzt给我指明了方向:

你太菜了,我知道有一场很水的比赛,你快来做吧

然后我就点进比赛,看到了排行榜上Minamoto旁大大的AK二字,不禁心生敬意

同时对于它一人狂得两题一血,身穿两条小裙子的事迹有不免心生敬佩

然后我就开始了刷水之旅(被水题狂虐)

以下题目按照编号顺序排列(怎么感觉在说废话)


A 完全k叉树

一眼发现可以处理出这棵树的深度和最后一层的节点数,然后分类讨论路径的拼法即可

要注意细节,同时还有\(k=1\)的情况要特判

  1. #include<cstdio>
  2. using namespace std;
  3. int t,n,k;
  4. int main()
  5. {
  6. for (scanf("%d",&t);t;--t)
  7. {
  8. scanf("%d%d",&k,&n); int dep=0; long long cur=1,lst=1;
  9. if (k==1) { printf("%d\n",n-1); continue; }
  10. if (n==1) { puts("0"); continue; }
  11. while (cur<n) ++dep,cur=cur+(lst*=k);
  12. cur-=lst; int left=n-cur;
  13. if (left>(lst/k)) printf("%d\n",dep<<1); else printf("%d\n",(dep<<1)-1);
  14. }
  15. return 0;
  16. }

B 距离产生美

比A题简单,发现原序列的数据范围是\(10^5\),\(k\le 10^9\),所以我们要修改就直接改到\(10^{18}\)即可

随便DP一下即可

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #define RI register int
  5. using namespace std;
  6. const int N=100005;
  7. int n,k,a[N],f[N][2];
  8. int main()
  9. {
  10. RI i; for (scanf("%d%d",&n,&k),i=1;i<=n;++i)
  11. {
  12. scanf("%d",&a[i]); if (abs(a[i]-a[i-1])>=k)
  13. f[i][0]=min(f[i-1][0],f[i-1][1]); else f[i][0]=f[i-1][1];
  14. f[i][1]=min(f[i-1][0],f[i-1][1])+1;
  15. }
  16. return printf("%d",min(f[n][0],f[n][1])),0;
  17. }

C 烤面包片

首先我们肯定容易发现,对于\(x! \operatorname{mod} y\),若\(x>=y\)值一定为\(0\)

然后我们掏出计算器一算就发现\(4!!\)已经大到天上去了(好吧也就\(10^{24}\)级别)

所以我们要考虑的只有\(n=0,1,2,3\)的情况,注意下细节即可(PS:\(0!=1\))

  1. #include<cstdio>
  2. #define RI register int
  3. using namespace std;
  4. int n,mod;
  5. int main()
  6. {
  7. scanf("%d%d",&n,&mod); if (n==0||n==1||n==2) return printf("%d",(n?n:1)%mod),0;
  8. if (n>3) return puts("0"),0; int ret=1;
  9. for (RI i=1;i<=720;++i) ret=1LL*ret*i%mod; return printf("%d",ret),0;
  10. }

D 茶颜悦色

首先我们转化问题,把一个点化为一个矩形,表示若把正方形的某个定点放置在这个矩形内能覆盖到这个点

所以现在问题就变成了平面矩形覆盖次数最多的点,直接扫描线+树状数组即可

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #define RI register int
  5. #define CI const int&
  6. using namespace std;
  7. const int N=400005;
  8. struct line
  9. {
  10. int x,y1,y2,tp;
  11. inline line(CI X=0,CI Y1=0,CI Y2=0,CI Tp=0)
  12. {
  13. x=X; y1=Y1; y2=Y2; tp=Tp;
  14. }
  15. friend inline bool operator < (const line& A,const line& B)
  16. {
  17. return A.x<B.x;
  18. }
  19. }l[N]; int n,k,x,y,rst[N],num,ans;
  20. class Segment_Tree
  21. {
  22. private:
  23. struct segment
  24. {
  25. int mx,tag;
  26. }node[N<<2];
  27. #define M(x) node[x].mx
  28. #define T(x) node[x].tag
  29. #define TN CI now=1,CI l=1,CI r=num
  30. inline void apply(CI now,CI mv)
  31. {
  32. M(now)+=mv; T(now)+=mv;
  33. }
  34. inline void pushup(CI now)
  35. {
  36. M(now)=max(M(now<<1),M(now<<1|1));
  37. }
  38. inline void pushdown(CI now)
  39. {
  40. if (T(now)) apply(now<<1,T(now)),apply(now<<1|1,T(now)),T(now)=0;
  41. }
  42. public:
  43. inline void modify(CI beg,CI end,CI mv,TN)
  44. {
  45. if (beg<=l&&r<=end) return apply(now,mv); int mid=l+r>>1; pushdown(now);
  46. if (beg<=mid) modify(beg,end,mv,now<<1,l,mid);
  47. if (end>mid) modify(beg,end,mv,now<<1|1,mid+1,r); pushup(now);
  48. }
  49. inline int query(void)
  50. {
  51. return M(1);
  52. }
  53. #undef M
  54. #undef T
  55. #undef TN
  56. }SEG;
  57. inline int find(CI x)
  58. {
  59. return lower_bound(rst+1,rst+num+1,x)-rst;
  60. }
  61. int main()
  62. {
  63. RI i,j,k; for (scanf("%d%d",&n,&k),i=1;i<=n;++i)
  64. {
  65. scanf("%d%d",&x,&y); x<<=1; y<<=1; rst[i]=y-k; rst[n+i]=y+k;
  66. l[i]=line(x-k,y-k,y+k,1); l[n+i]=line(x+k+1,y-k,y+k,-1);
  67. }
  68. sort(rst+1,rst+(n<<1)+1); num=unique(rst+1,rst+(n<<1)+1)-rst-1;
  69. for (i=1;i<=(n<<1);++i) l[i].y1=find(l[i].y1),l[i].y2=find(l[i].y2);
  70. for (sort(l+1,l+(n<<1)+1),i=1;i<=(n<<1);i=j+1)
  71. {
  72. for (j=i;j<(n<<1)&&l[j+1].x==l[i].x;++j);
  73. for (k=i;k<=j;++k) SEG.modify(l[k].y1,l[k].y2,l[k].tp);
  74. ans=max(ans,SEG.query());
  75. }
  76. return printf("%d",ans),0;
  77. }

E 飞行棋

有点套路的期望题。首先我们考虑倒推,即用\(f_i\)表示距离终点\(i\)步时的期望步数

显然\(f_0=0\),然后我们考虑对于\(f_i(i\in [1,k])\),它们的答案是什么

发现对于它们任何一个位置,直接走到终点的概率就是\(\frac{1}{k}\),否则就会落入另一个状态

而我们发现这些状态的问题和原问题等价,我们可以很容易地从概率推出它们的期望都是\(k\)

PS:如果你不想观察出这个结论的话你也可以大力列出方程然后高斯消元

然后我们发现接下来的转移由于没有走到终点再走回的这样一个过程,转移就比较单一,即为\(f_i=\frac{1}{k}\cdot \sum_{j=i-k}^{i-1} f_j+1\),我们可以容易的使用矩阵快速幂来优化复杂度到\(O(k^3\cdot\log n)\)

  1. #include<cstdio>
  2. #include<cstring>
  3. #define RI register int
  4. #define CI const int&
  5. using namespace std;
  6. const int N=25,mod=1e9+7;
  7. long long d,k; int invk;
  8. inline void inc(int& x,CI y)
  9. {
  10. if ((x+=y)>=mod) x-=mod;
  11. }
  12. inline int quick_pow(int x,int p=mod-2,int mul=1)
  13. {
  14. for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
  15. }
  16. struct Matrix
  17. {
  18. int mat[N][N],n,m;
  19. inline Matrix(CI N=0,CI M=0)
  20. {
  21. n=N; m=M; memset(mat,0,sizeof(mat));
  22. }
  23. inline int* operator [] (CI x) { return mat[x]; }
  24. friend inline Matrix operator * (Matrix A,Matrix B)
  25. {
  26. Matrix C(A.n,B.m); for (RI i=0;i<C.n;++i)
  27. for (RI j=0;j<C.m;++j) for (RI k=0;k<A.m;++k)
  28. inc(C[i][j],1LL*A[i][k]*B[k][j]%mod); return C;
  29. }
  30. friend inline Matrix operator ^ (Matrix A,long long p)
  31. {
  32. Matrix T(A.n,A.m); for (RI i=0;i<A.n;++i) T[i][i]=1;
  33. for (;p;p>>=1,A=A*A) if (p&1) T=T*A; return T;
  34. }
  35. };
  36. int main()
  37. {
  38. scanf("%lld%lld",&d,&k); Matrix S(k+1,1),P(k+1,k+1);
  39. RI i; for (invk=quick_pow(k%mod),i=0;i<k;++i) S[i][0]=k; S[k][0]=1;
  40. for (i=0;i<k-1;++i) P[i][i+1]=1; for (i=0;i<k;++i) P[k-1][i]=invk;
  41. P[k-1][k]=P[k][k]=1; P=P^(d-k); S=P*S; return printf("%d",S[k-1][0]),0;
  42. }

F 三元组

我们考虑把\(\min,\max\)去掉,那么我们强制\(a_i+a_j\)是\(\min\),这样题目就变成求\(2\cdot(a_i+a_j)\le b_i+b_j\)的\(c_i\cdot c_j\)的和

把式子拆开并移项就得到了\((2\cdot a_i-b_i)+(2\cdot a_j-b_j)\le 0\),这个我们记\(2\cdot a_i-b_i\)为\(d_i\),然后把\(d_i\)排序后two points扫一下用前(后)缀和算答案即可

若\(b_i+b_j\)是\(\min\)的话就交换所有\(a_i,b_i\)再做一次即可

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #define RI register int
  5. #define CI const int&
  6. using namespace std;
  7. const int N=100005,mod=1e9+7;
  8. struct data
  9. {
  10. int a,b,c,v;
  11. friend inline bool operator < (const data& A,const data& B)
  12. {
  13. return A.v<B.v;
  14. }
  15. }p[N]; int n,suf[N],ans;
  16. inline void inc(int& x,CI y)
  17. {
  18. if ((x+=y)>=mod) x-=mod;
  19. }
  20. inline int calc(int ret=0)
  21. {
  22. RI i,j; for (i=1;i<=n;++i) p[i].v=p[i].b-2*p[i].a;
  23. for (sort(p+1,p+n+1),i=n;i;--i) suf[i]=suf[i+1],inc(suf[i],p[i].c);
  24. for (i=n,j=1;i;--i)
  25. {
  26. while (j<=n&&p[i].v+p[j].v<0) ++j;
  27. if (j<=n) inc(ret,1LL*p[i].c*suf[max(i,j)]%mod);
  28. }
  29. return ret;
  30. }
  31. int main()
  32. {
  33. RI i; for (scanf("%d",&n),i=1;i<=n;++i)
  34. scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
  35. for (ans=calc(),i=1;i<=n;++i) swap(p[i].a,p[i].b);
  36. return inc(ans,calc()),printf("%d",ans),0;
  37. }

G 篮球校赛

律师函警告(不是)

首先我们很容易发现我们对于\(5\)个位置每个位置挑出前\(5\)的队员然后最优解一定在它们之中(否则要它有什么用?)

然后还愣着干什么,直接\(O(5^5)\)甚至\(O(2^{25})\)大暴力就过了啊

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #define RI register int
  5. #define CI const int&
  6. using namespace std;
  7. const int N=100005;
  8. struct data
  9. {
  10. int val,id,tp;
  11. friend inline bool operator < (const data& A,const data& B)
  12. {
  13. return A.val>B.val;
  14. }
  15. }a[5][N],t[30]; int n,cnt; long long ans; bool cs[N];
  16. inline void DFS(CI nw=1,CI ct=0,CI st=0,const long long& sum=0)
  17. {
  18. if (nw>cnt) { if (ct==5) ans=max(ans,sum); return; }
  19. if (!cs[t[nw].id]&&!((st>>t[nw].tp)&1))
  20. cs[t[nw].id]=1,DFS(nw+1,ct+1,st|(1<<t[nw].tp),sum+t[nw].val),cs[t[nw].id]=0; DFS(nw+1,ct,st,sum);
  21. }
  22. int main()
  23. {
  24. RI i,j; for (scanf("%d",&n),i=1;i<=n;++i)
  25. for (j=0;j<5;++j) scanf("%d",&a[j][i].val),a[j][i].id=i,a[j][i].tp=j;
  26. for (i=0;i<5;++i) for (sort(a[i]+1,a[i]+n+1),j=1;j<=5;++j) t[++cnt]=a[i][j];
  27. return DFS(),printf("%lld",ans),0;
  28. }

H 分配学号

首先容易发现最后修改的学号序列在排序后是唯一的,只不过有些人可以被改动到的数字不一样

我们考虑先扫一遍求出目标序列,然后将原序列和目标序列都排序,然后two points维护下每个数能从多少个数变过来,然后乘起来就好了

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define RI register int
  4. using namespace std;
  5. const int N=100005,mod=1e9+7;
  6. int n,ans=1; long long a[N],tar[N];
  7. int main()
  8. {
  9. RI i,j; for (scanf("%d",&n),i=1;i<=n;++i) scanf("%lld",&a[i]);
  10. for (sort(a+1,a+n+1),i=1;i<=n;++i)
  11. if (a[i]<=tar[i-1]) tar[i]=tar[i-1]+1; else tar[i]=a[i];
  12. for (sort(tar+1,tar+n+1),i=j=1;i<=n;++i)
  13. {
  14. while (j<=n&&a[j]<=tar[i]) ++j;
  15. ans=1LL*ans*(j-i)%mod;
  16. }
  17. return printf("%d",ans),0;
  18. }

I Gree的心房

整场比赛最水的题,容易发现最少步数一定是\(n+m-2\),所以判断\(k\)和它的关系即可

注意起点和终点不能被占用了以及计算剩下多少个无用位置时要开long long

  1. #include<cstdio>
  2. using namespace std;
  3. int n,m,k;
  4. int main()
  5. {
  6. scanf("%d%d%d",&n,&m,&k); long long left=1LL*n*m-(n+m-1);
  7. if (k>left) puts("-1"); else printf("%d",n+m-2); return 0;
  8. }

Postscript

当我做完这场比赛,看着自己每道题都WA上三四遍的提交,再看着现场AK并拿两题一血的bzt,我流下了蒟蒻的泪水

Comet OJ CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)的更多相关文章

  1. [CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)]飞行棋

    题目链接:https://www.cometoj.com/contest/59/problem/E?problem_id=2714 求期望并且一堆转移基本上就是期望dp了(叉腰 照常的设dp[i]表示 ...

  2. Comet OJ 夏季欢乐赛 篮球校赛

    Comet OJ 夏季欢乐赛 篮球校赛 题目传送门 题目描述 JWJU注重培养学生的"唱,跳,rap,篮球"能力.于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台 ...

  3. Comet OJ 夏季欢乐赛 Gree的心房

    Comet OJ 夏季欢乐赛 Gree的心房 题目传送门 题目描述 据说每一个走进Gree哥哥心房的小姑娘都没有能够再走出来-- 我们将Gree哥哥的心房抽象成一个n \times mn×m的地图,初 ...

  4. Comet OJ 夏季欢乐赛 分配学号

    Comet OJ 夏季欢乐赛 H 分配学号 题目传送门 题目描述 今天,是JWJU给同学们分配学号的一天!为了让大家尽可能的得到自己想要的学号,鸡尾酒让大家先从 [1,10^{18}][1,1018] ...

  5. Comet OJ 2019 夏季欢乐赛题解

    Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...

  6. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)D

    题面 一开始想到一个 O(N^2) 做法,先把x排序,然后顺次枚举x最大的点,看向前最多可以保留多少点 (也就是先不管正方形的上下长度限制,先考虑左右的限制).然后再对这些点做一遍类似的..(等等这么 ...

  7. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)F

    题面 F比较友善(相较于E),我们发现如果i和j是满足条件的两个下标,那么: a[i]-2*b[i] + a[j]-2*b[j] >=0 或者 b[i]-2*a[i] + b[j]-2*a[j] ...

  8. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)E

    题面 这个题暴好啊,考了很多东西. 首先设f(x)为离终点还有x步要走的期望步数,我们可以发现 : 1.x>=k时,x可以转移到的点的下标都<x. 2.x<k时,则可能走回到x或者下 ...

  9. CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)H

    题面 被神葱安利安利了本题. 我们贪心的想,如果有那么一坨相等的学号,那么肯定是保留一个人学号不变,其余的再推到学号+1的位置(准备与那个位置的其他人合并)处理. 虽然a[i]可大至1e18,不过如果 ...

随机推荐

  1. nacos 的服务注册与发现

    nacos的服务注册于发现. 这个要求服务统一注册到注册中心,然后调用的时候就不需要通过ip来调用,直接通过服务名即可. 服务提供者 pom.xml配置,需要spring-cloud-starter- ...

  2. Pytorch创建模型的多种方法

    目录 Method 1 Method 2 Method 3 Method 4 Reference 网络结构: conv --> relu --> pool --> FC -- > ...

  3. 前端笔记之Vue(五)TodoList实战&拆分store&跨域&练习代理跨域

    一.TodoList 1.1安装依赖 安装相关依赖: npm install --save-dev webpack npm install --save-dev babel-loader babel- ...

  4. c#汉字转拼音首字母全拼支持多音字

    1.首先在NuGet安装pingyinConverter 2.下载-安装-引用ChineseChar.dll到项目中 官网了解:http://www.microsoft.com/zh-cn/downl ...

  5. glibc编译安装

    glibc是gnu发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc.glibc除了封装linux操作系统所提供的系统服务外,它本身也提供 ...

  6. [转]Apache Doris资料汇总

    参考资料 https://www.toutiao.com/i6709706901770207748/?tt_from=weixin&utm_campaign=client_share& ...

  7. node.js如何批量赋值

    1. 数组解析赋值 let a = 1; let b = 2; let c = 3; 等同于 let [a, b, c] = [1, 2, 3]; 默认值 let [a, b = "B&qu ...

  8. RocketMQ(4)---RocketMQ核心配置讲解

    RocketMQ核心配置讲解 RocketMQ的核心配置在broker.conf配置文件里,下面我们来分析下它. 一.broker.conf配置 下面只列举一些常用的核心配置讲解. 1.broker. ...

  9. python处理oracle数据库的返回数据

    上代码: import SqlHelper.ORACLE as ORA import pandas as pd if __name__ == '__main__': #连接数据库 ms = ORA.O ...

  10. 计时 答题 demo

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...