实在没忍住就去打比赛了然后一耗就是一天

最后Rank19还是挺好的(要不是乐多赛不然炸飞),这是唯一一套在Luogu上号称水题大赛的而实际上真的是水题大赛的比赛

好了我们开始看题


T1 八百标兵奔北坡

首先看到这道题你要先仔细想一想切比雪夫距离是什么

我们更加形象地理解一下就会知道这是一个等腰三角形(算了还是看图吧,对于红色的格子,所有黄色的格子对于它都在北面):

然后仔细看一下就发现每一个点可以设计一个DP的思想(类似于过河卒):

  • \(f_{i,j}=0(if\ (i,j)\ is\ a\ mountain.)\)
  • \(f_{i,j}=min(min(f_{i-1,j-1},f_{i-1,j}),f_{i-1,j+1})+1\)

CODE

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=1e3+5,fx[4]={0,1,0,-1},fy[4]={1,0,-1,0};
  6. int n,m,k,h[N][N],x,y,f[N][N];
  7. inline char tc(void)
  8. {
  9. static char fl[100000],*A=fl,*B=fl;
  10. return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
  11. }
  12. inline void read(int &x)
  13. {
  14. x=0; char ch; while (!isdigit(ch=tc()));
  15. while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  16. }
  17. inline void write(int x)
  18. {
  19. if (x>9) write(x/10);
  20. putchar(x%10+'0');
  21. }
  22. inline bool check(int x,int y)
  23. {
  24. for (register int i=0;i<4;++i)
  25. {
  26. int xx=x+fx[i],yy=y+fy[i];
  27. if (xx>=1&&xx<=n&&yy>=1&&yy<=m&&h[xx][yy]>=h[x][y]) return 0;
  28. }
  29. return 1;
  30. }
  31. inline int min(int a,int b)
  32. {
  33. return a<b?a:b;
  34. }
  35. int main()
  36. {
  37. //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
  38. register int i,j; read(n); read(m); read(k);
  39. for (i=1;i<=n;++i)
  40. for (j=1;j<=m;++j) read(h[i][j]);
  41. memset(f,63,sizeof(f));
  42. for (i=1;i<=n;++i)
  43. for (j=1;j<=m;++j)
  44. if (check(i,j)) f[i][j]=0; else f[i][j]=min(min(f[i-1][j-1],f[i-1][j]),f[i-1][j+1])+1;
  45. while (k--)
  46. {
  47. read(x); read(y);
  48. if (f[x][y]<n) write(f[x][y]),putchar('\n'); else puts("Pool Babingbaboom!");
  49. }
  50. return 0;
  51. }

当然我比赛时不是这么写的

对于每一行处理出山的前缀和,然后查询时暴力向上跳即可,期望复杂度为\(O(klogn)\),最坏复杂度为\(O(kn)\)

CODE

  1. // luogu-judger-enable-o2
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<cstring>
  5. using namespace std;
  6. const int N=1005,K=100005,fx[4]={0,1,0,-1},fy[4]={1,0,-1,0};
  7. int h[N][N],l[N][N],n,m,k,INF,x,y;
  8. bool vis[N][N];
  9. inline char tc(void)
  10. {
  11. static char fl[100000],*A=fl,*B=fl;
  12. return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
  13. }
  14. inline void read(int &x)
  15. {
  16. x=0; char ch; while (!isdigit(ch=tc()));
  17. while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  18. }
  19. inline void write(int x)
  20. {
  21. if (x>9) write(x/10);
  22. putchar(x%10+'0');
  23. }
  24. inline bool check(int x,int y)
  25. {
  26. for (register int i=0;i<4;++i)
  27. {
  28. int xx=x+fx[i],yy=y+fy[i];
  29. if (xx>=1&&xx<=n&&yy>=1&&yy<=m&&h[xx][yy]>h[x][y]) return 0;
  30. }
  31. return 1;
  32. }
  33. inline int max(int a,int b)
  34. {
  35. return a>b?a:b;
  36. }
  37. inline int min(int a,int b)
  38. {
  39. return a<b?a:b;
  40. }
  41. int main()
  42. {
  43. //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
  44. register int i,j; read(n); read(m); read(k);
  45. for (i=1;i<=n;++i)
  46. for (j=1;j<=m;++j)
  47. read(h[i][j]);
  48. for (i=1;i<=n;++i)
  49. for (j=1;j<=m;++j)
  50. l[i][j]=l[i][j-1]+check(i,j);
  51. while (k--)
  52. {
  53. read(x); read(y); bool flag=0;
  54. for (i=x;i>=1;--i)
  55. if ((l[i][y]-l[i][max(y-x+i-1,0)])||(l[i][min(y+x-i,m)]-l[i][y-1])) { write(x-i); putchar('\n'); flag=1; break; }
  56. if (!flag) puts("Pool Babingbaboom!");
  57. }
  58. return 0;
  59. }

T2 灰化肥,会挥发

这应该是一道状压板子题了(主要是做的时候状态不是很好莫名很烦,然后都没有想用String来存最优解,一算数组炸了就去写暴力了)

我们考虑状压,设\(f_{i,j}\)表示以第\(i\)(为了方便以\([0,n)\)编号)个仓库结尾且状态为\(j\)(为二进制下的01串)的最优解

然后对于两点间的距离我们大力BFS预处理即可(存到\(dis_{i,j}\)中)

然后稍加推到即可得出状态转移方程:

\(f_{i,j\oplus(1<<i)}=f_{k,j}+dis_{k.i}\)

其中\(\oplus\)表示异或,感觉这种转移实在是太基础了。

关于字典序的问题转移的时候直接一起搞即可(String在比较字典序是实在好用)

CODE

  1. // luogu-judger-enable-o2
  2. #include<cstdio>
  3. #include<iostream>
  4. #include<cctype>
  5. #include<algorithm>
  6. #include<cstring>
  7. #include<string>
  8. using namespace std;
  9. const int R=505,N=18,state=66000,fx[4]={0,1,-1,0},fy[4]={1,0,0,-1};
  10. char a[R][R],ch;
  11. int r,c,x[N],y[N],n,dis[R][R],q[R*R][2],step[R][R],tot,f[N][state],num,INF,MIN;
  12. bool vis[R][R];
  13. string g[N][state];
  14. inline void BFS(int id,int x,int y)
  15. {
  16. register int i,H=0,T=1; q[1][0]=x; q[1][1]=y; step[x][y]=0; vis[x][y]=1;
  17. while (H<T)
  18. {
  19. int xx=q[++H][0],yy=q[H][1];
  20. if (isalpha(a[xx][yy])) dis[id][a[xx][yy]-'A']=step[xx][yy];
  21. for (i=0;i<4;++i)
  22. {
  23. int xxx=xx+fx[i],yyy=yy+fy[i];
  24. if (xxx>0&&xxx<=r&&yyy>0&&yyy<=c&&a[xxx][yyy]!='*'&&!vis[xxx][yyy])
  25. step[xxx][yyy]=step[xx][yy]+1,q[++T][0]=xxx,q[T][1]=yyy,vis[xxx][yyy]=1;
  26. }
  27. }
  28. }
  29. int main()
  30. {
  31. register int i,j,k; cin>>r>>c>>n;
  32. for (i=1;i<=r;++i)
  33. for (j=1;j<=c;++j)
  34. {
  35. cin>>a[i][j];
  36. if (isalpha(a[i][j])) x[a[i][j]-'A']=i,y[a[i][j]-'A']=j;
  37. }
  38. memset(dis,63,sizeof(dis)); memset(f,63,sizeof(f));
  39. for (i=0;i<n;++i)
  40. memset(vis,0,sizeof(vis)),BFS(i,x[i],y[i]);
  41. tot=(1<<n)-1; f[0][1]=0; INF=f[0][0]; g[0][1]="A";
  42. for (j=1;j<=tot;++j)
  43. for (i=1;i<n;++i)
  44. {
  45. if (j&(1<<i)) continue;
  46. for (k=0;k<n;++k)
  47. if (k^i&&(j&(1<<k)))
  48. {
  49. if (f[k][j]==INF) continue;
  50. if (f[i][j^(1<<i)]>f[k][j]+dis[k][i]) f[i][j^(1<<i)]=f[k][j]+dis[k][i],ch=i+'A',g[i][j^(1<<i)]=g[k][j],g[i][j^(1<<i)]+=ch;
  51. if (f[i][j^(1<<i)]==f[k][j]+dis[k][i]&&g[i][j^(1<<i)]>g[k][j]) ch=i+'A',g[i][j^(1<<i)]=g[k][j],g[i][j^(1<<i)]+=ch;
  52. }
  53. }
  54. for (MIN=INF,i=1;i<n;++i)
  55. {
  56. if (f[i][tot]<MIN) MIN=f[i][tot],num=i;
  57. if (f[i][tot]==MIN&&g[i][tot]<g[num][tot]) num=i;
  58. }
  59. printf("%d\n",MIN); cout<<g[num][tot]; return 0;
  60. }

T3 红鲤鱼与绿鲤鱼

一道很神奇的数学题,%%%yekehe大佬5min切掉此题。

我们首先发现罚时的位置和最后一次AC都是要计算上去的,因此我们先加上去即可。

然后对答案有影响的只有那B条绿鲤鱼

然后我们固定第一个AC的位置,然后后面只有\(A+B-1\)个位置要填上\(B-1\)个AC

那还等什么,组合数大法好,接下来因为每一位对答案的贡献都是一样的,因此我们直接乘上去即可。

然后别忘了这是期望,还有除以总方案数\(C_{A+B}^B\)

然后我就开始暴力计算了,对于多个阶乘和逆元都一起做。

然后正常人这么写都GG了(常数太大

然后我就第一个不服了,之后开始了我一下午的卡常工作(都ZZ地没有再接下去想一步)

最后卡时间A了!(然后就被尊称为常数之王了)

一下总结几点卡常技巧:

  1. 快速幂里可以展开多做几次,这样可以减少while语句的出现次数
  2. 使用循环展开大法,推荐展开10次兼顾编译速度和运行速度
  3. unsigned long long比long long快将近1倍
  4. 手开O2,语音选C++11(这个很重要,编译优化快到死)

卡常CODE

  1. // luogu-judger-enable-o2
  2. #pragma G++ optimize (2)
  3. #include<cstdio>
  4. using namespace std;
  5. typedef unsigned long long ull;
  6. const ull mod=998244853,less=998244851;
  7. ull n,m;
  8. inline ull quick_pow(ull x,ull p)
  9. {
  10. ull tot=1;
  11. while (p)
  12. {
  13. if (p&1) tot=1LL*tot*x%mod;
  14. x=1LL*x*x%mod; p>>=1;
  15. if (p&1) tot=1LL*tot*x%mod;
  16. x=1LL*x*x%mod; p>>=1;
  17. if (p&1) tot=1LL*tot*x%mod;
  18. x=1LL*x*x%mod; p>>=1;
  19. }
  20. return tot;
  21. }
  22. int main()
  23. {
  24. register ull i; scanf("%lld %lld",&n,&m); n%=mod; static ull ans=1,t=1;
  25. for (i=1;i+9<m;i+=10)
  26. {
  27. t=t*quick_pow(i,less)%mod; t=t*quick_pow(i+1,less)%mod;
  28. t=t*quick_pow(i+2,less)%mod; t=t*quick_pow(i+3,less)%mod;
  29. t=t*quick_pow(i+4,less)%mod; t=t*quick_pow(i+5,less)%mod;
  30. t=t*quick_pow(i+6,less)%mod; t=t*quick_pow(i+7,less)%mod;
  31. t=t*quick_pow(i+8,less)%mod; t=t*quick_pow(i+9,less)%mod;
  32. }
  33. for (;i<m;++i) t=t*quick_pow(i,less)%mod;
  34. for (i=n+1;i+9<n+m;i+=10)
  35. {
  36. t=t*i%mod; t=t*(i+1)%mod;
  37. t=t*(i+2)%mod; t=t*(i+3)%mod;
  38. t=t*(i+4)%mod; t=t*(i+5)%mod;
  39. t=t*(i+6)%mod; t=t*(i+7)%mod;
  40. t=t*(i+8)%mod; t=t*(i+9)%mod;
  41. }
  42. for (;i<n+m;++i)
  43. t=t*i%mod; ans=5*t%mod;
  44. ans=ans*(n+m+1)%mod*(n+m)%mod*quick_pow(2,less)%mod;
  45. ans=ans*quick_pow(t*quick_pow(m,less)%mod*(n+m)%mod,less)%mod;
  46. return printf("%lld",((10*n+5*m+5)%mod+ans)%mod),0;
  47. }

然后如果你多想1min就可以发现上面的式子:

\(\frac{5(2A+B+1)+5\cdot C_{B+A−1}^{B-1}\cdot (A+B+1)\cdot \frac{(A+B)}{2}}{2}\)=\(5\cdot(2A+B+1)+5B\cdot(A+B+1)\)

然后直接\(O(1)\)求即可

CODE

  1. #pragma G++ optimize (2)
  2. #include<cstdio>
  3. using namespace std;
  4. typedef unsigned long long ull;
  5. const ull mod=998244853;
  6. ull n,m;
  7. inline ull quick_pow(ull x,ull p)
  8. {
  9. ull tot=1;
  10. while (p)
  11. {
  12. if (p&1) tot=1LL*tot*x%mod;
  13. x=1LL*x*x%mod; p>>=1;
  14. }
  15. return tot;
  16. }
  17. int main()
  18. {
  19. register ull i; scanf("%lld %lld",&n,&m); n%=mod; static ull ans=1;
  20. ans=ans*(n+m+1)%mod*(n+m)%mod*quick_pow(2,mod-2)%mod;
  21. ans=5*ans*quick_pow(n+m,mod-2)%mod*m%mod;
  22. return printf("%lld",((10*n+5*m+5)%mod+ans)%mod),0;
  23. }

CYJian的水题大赛的更多相关文章

  1. 【洛谷】CYJian的水题大赛【第二弹】解题报告

    点此进入比赛 T1: JerryC Loves Driving 第一题应该就是一道水分题(然而我只水了130分),我的主要做法就是暴力模拟,再做一些小小的优化(蠢得我自己都不想说了). My Code ...

  2. CYJian的水题大赛2 解题报告

    这场比赛是前几天洛谷上 暮雪﹃紛紛dalao的个人公开赛,当时基本上都在水暴力分......也没有好好写正解(可能除了T1) 过了几天颓废的日子之后,本蒟蒻觉得应该卓越一下了qwq,所以就打算写一个解 ...

  3. 【洛谷】CYJian的水题大赛 解题报告

    点此进入比赛 \(T1\):八百标兵奔北坡 这应该是一道较水的送分题吧. 理论上来说,正解应该是DP.但是,.前缀和优化暴力就能过. 放上我比赛时打的暴力代码吧(\(hl666\)大佬说这种做法的均摊 ...

  4. ytu 2558: 游起来吧!超妹!(水题,趣味数学题)

    2558: 游起来吧!超妹! Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3[Submit][Status][Web Board ...

  5. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  6. ACM :漫漫上学路 -DP -水题

    CSU 1772 漫漫上学路 Time Limit: 1000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  7. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  8. [poj2247] Humble Numbers (DP水题)

    DP 水题 Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The se ...

  9. gdutcode 1195: 相信我这是水题 GDUT中有个风云人物pigofzhou,是冰点奇迹队的主代码手,

    1195: 相信我这是水题 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 821  Solved: 219 Description GDUT中有个风云人 ...

随机推荐

  1. JavaScript按日期排序之灵活排序

    上代码: var dataContent = [ { ID: "1", hobbit: "去音乐", sport: "在篮球", movie ...

  2. Android View体系(四)从源码解析Scroller

    在Android View体系(二)实现View滑动的六种方法这篇文章中我们讲到了用Scroller来实现View的滑动,所以这篇文章我们就不介绍Scroller是如何使用的了,本篇就从源码来分析下S ...

  3. 学习使用TestNG进行数据驱动测试

    转自: https://mp.weixin.qq.com/s/8Bd8LEhiC2pu2VMcyNMGlQ 学习使用TestNG进行数据驱动测试 赵吃饭 51Testing软件测试网 前天   学习使 ...

  4. 高通移植mipi LCD的过程LK代码

    lk部分:(实现LCD兼容) 1. 函数定位 aboot_init()来到target_display_init(): 这就是高通原生lk LCD 兼容的关键所在.至于你需要兼容多少LCD 就在whi ...

  5. git命令设置简写(别名)

    ### git命令设置简写(别名) 前言:有时候在执行git命令比较多的情况下,每次敲git命令比较费时,同时有些命令比如cherry-pick这种比较长时更是费时,所以可以通过设置命令行简写来设置. ...

  6. asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFactory,DALMsSql'.

    asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFa ...

  7. DevExpress gridcontrol gridView主从表折叠/展开显示

    在使用报表的时候,有很多需要主从表一起显示,从表不需要另外弹窗显示明细,反而直接显示在主表下方.如图所示: 第一次做这个功能,主从表显示,从表列隐藏,从表单元格点击事件这三个功能点花费了很多时间,在网 ...

  8. Python程序的编写方式

    直接在Python的交互式环境编写代码 现在,了解了如何启动和退出Python的交互式环境,我们就可以正式开始编写Python代码了. 在写代码之前,请千万不要用“复制”-“粘贴”把代码从页面粘贴到你 ...

  9. Mysqldumpslow的用法汇总

    mysqldumpslow --help可显示其参数的使用 经常使用的参数: -s,是order的顺序 al   平均锁定时间 ar   平均返回记录时间 at   平均查询时间(默认) c    计 ...

  10. C#的深拷贝和浅拷贝

    也许会有人这样解释C# 中浅拷贝与深拷贝区别: 浅拷贝是对引用类型拷贝地址,对值类型直接进行拷贝. 不能说它完全错误,但至少还不够严谨.比如:string 类型咋说? 其实,我们可以通过实践来寻找答案 ...