点此进入比赛

\(T1\):八百标兵奔北坡

这应该是一道较水的送分题吧。

理论上来说,正解应该是DP。但是,.前缀和优化暴力就能过。

放上我比赛时打的暴力代码吧(\(hl666\)大佬说这种做法的均摊复杂度为\(O(logn)\),总复杂度应为\(O(nlogn)\),可以接受):

  1. #include<bits/stdc++.h>
  2. #define max(x,y) ((x)>(y)?(x):(y))
  3. #define min(x,y) ((x)<(y)?(x):(y))
  4. #define N 1000
  5. #define M 1000
  6. using namespace std;
  7. int n,m,Q,sum[N+5][M+5],a[N+5][M+5];
  8. inline char tc()
  9. {
  10. static char ff[100000],*A=ff,*B=ff;
  11. return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
  12. }
  13. inline void read(int &x)
  14. {
  15. x=0;int f=1;char ch;
  16. while(!isdigit(ch=tc())) if(ch=='-') f=-1;
  17. while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  18. x*=f;
  19. }
  20. inline void write(int x)
  21. {
  22. if(x<0) putchar('-'),x=-x;
  23. if(x>9) write(x/10);
  24. putchar(x%10+'0');
  25. }
  26. inline bool check(int x,int y1,int y2)//利用前缀和,判断出第x行y1~y2范围内是否有山
  27. {
  28. return sum[x][min(y2,m)]-sum[x][max(y1-1,0)];
  29. }
  30. int main()
  31. {
  32. register int i,j;
  33. for(read(n),read(m),read(Q),i=1;i<=n;++i)
  34. for(j=1;j<=m;++j)
  35. read(a[i][j]);
  36. for(i=1;i<=n;++i)
  37. for(j=1;j<=m;sum[i][j]+=sum[i][j-1],++j)//统计每一行的前缀和
  38. if(a[i][j]>=max(max(a[i-1][j],a[i+1][j]),max(a[i][j-1],a[i][j+1]))),sum[i][j]=1;//若当前坐标有一坐山,则令sum[i][j]为1
  39. while(Q--)
  40. {
  41. int x,y;bool could=false;read(x),read(y);
  42. for(i=x;i;--i)
  43. if(check(i,y-x+i,y+x-i))//判断是否可行
  44. {
  45. write(x-i),putchar('\n'),could=true;//可以就输出答案,并标记有答案
  46. break;
  47. }
  48. if(!could) puts("Pool Babingbaboom!");//若标记无答案,则输出"Pool Babingbaboom!"
  49. }
  50. return 0;
  51. }

\(T2\):灰化肥,会挥发

这道题一看到数据范围就会想到状压\(DP\)吧!(当然,也不乏有某些大佬会想到用模拟退火来做)

设用\(f[i][j]\)来表示在第\(i\)个谷仓,经过的谷仓集合为\(j\)时走过的最短路径,则$$f[i][j]=max(f[i][j],f[k][(j)xor (1<<(i-1))]+w[k][i])$$其中\(w[k][i]\)表示\(k\)与\(i\)的距离。

我们可以BFS预处理出两两仓库间的距离,然后\(DP\)即可

注:只可惜,我在比赛过程中不停爆0,比赛结束之后,请教\(hl666\)大佬才知道洛谷数据有\(BUG\),有字符串的题目不能打读优,结果白白爆\(0\),也算是一个教训吧!可怜我打了两个多小时的代码

代码如下:

  1. #include<bits/stdc++.h>
  2. #define R 500
  3. #define C 500
  4. #define N 16
  5. using namespace std;
  6. int n,r,c,cnt=0,H,T,x[R*C+5],y[R*C+5],Step[R*C+5],To[30],w[N+5][N+5],vis[R+5][C+5]={0},f[N+5][(1<<N)+5];
  7. char ch[R+5][C+5];
  8. struct Warehouse//存储每个谷仓的信息
  9. {
  10. char Name;
  11. int x,y;
  12. }s[N+5];
  13. string S[N+5][(1<<N)+5];
  14. //不能打读优QwQ
  15. /*inline char tc()
  16. {
  17. static char ff[100000],*A=ff,*B=ff;
  18. return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
  19. }
  20. inline void read(int &x)
  21. {
  22. x=0;int f=1;char ch;
  23. while(!isdigit(ch=tc())) if(ch=='-') f=-1;
  24. while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  25. x*=f;
  26. }*/
  27. inline void write(int x)
  28. {
  29. if(x<0) putchar('-'),x=-x;
  30. if(x>9) write(x/10);
  31. putchar(x%10+'0');
  32. }
  33. inline void BFS(int Now)//BFS预处理
  34. {
  35. while(H<=T)
  36. {
  37. if(ch[x[H]][y[H]]>='A'&&ch[x[H]][y[H]]<='Z') w[Now][To[ch[x[H]][y[H]]-'A']]=Step[H];
  38. if(x[H]>1&&!vis[x[H]-1][y[H]]&&ch[x[H]-1][y[H]]!='*') vis[x[H]-1][y[H]]=1,x[++T]=x[H]-1,y[T]=y[H],Step[T]=Step[H]+1;//向上走
  39. if(x[H]<r&&!vis[x[H]+1][y[H]]&&ch[x[H]+1][y[H]]!='*') vis[x[H]+1][y[H]]=1,x[++T]=x[H]+1,y[T]=y[H],Step[T]=Step[H]+1;//向下走
  40. if(y[H]>1&&!vis[x[H]][y[H]-1]&&ch[x[H]][y[H]-1]!='*') vis[x[H]][y[H]-1]=1,x[++T]=x[H],y[T]=y[H]-1,Step[T]=Step[H]+1;//向左走
  41. if(y[H]<c&&!vis[x[H]][y[H]+1]&&ch[x[H]][y[H]+1]!='*') vis[x[H]][y[H]+1]=1,x[++T]=x[H],y[T]=y[H]+1,Step[T]=Step[H]+1;//向右走
  42. ++H;
  43. }
  44. }
  45. int main()
  46. {
  47. register int i,j,k;
  48. for(cin>>r>>c>>n,i=1;i<=r;++i)
  49. for(j=1;j<=c;++j)
  50. {
  51. cin>>ch[i][j];
  52. if(ch[i][j]>='A'&&ch[i][j]<='Z') s[To[ch[i][j]-'A']=++cnt]=(Warehouse){ch[i][j],i,j};//将每一个谷仓的位置与名称存储下来
  53. }
  54. for(i=1;i<=n;++i)//对每个谷仓进行预处理
  55. {
  56. memset(vis,0,sizeof(vis));
  57. vis[x[H=T=0]=s[i].x][y[0]=s[i].y]=1,Step[0]=0;
  58. BFS(i);
  59. }
  60. for(i=1;i<=n;++i) for(j=1;j<=(1<<n)-1;++j) f[i][j]=1e9;//DP预处理
  61. f[To[0]][1<<(To[0]-1)]=0,S[To[0]][1<<(To[0]-1)]="A";
  62. for(j=1;j<=(1<<n)-1;++j)
  63. for(i=1;i<=n;++i)
  64. {
  65. if(!(j&(1<<(i-1)))||!(j^(1<<(i-1)))) continue;
  66. for(k=1;k<=n;++k)
  67. if((i^k)&&(j&(1<<(k-1)))&&((f[k][j^(1<<(i-1))]+w[k][i]<f[i][j])||(f[k][j^(1<<(i-1))]+w[k][i]==f[i][j]&&S[k][j^(1<<(i-1))]+(s[i].Name)<S[i][j]))) f[i][j]=f[k][j^(1<<(i-1))]+w[k][i],S[i][j]=S[k][j^(1<<(i-1))]+(s[i].Name);
  68. }
  69. int Min=1e9;string ans;
  70. for(i=1;i<=n;++i)
  71. if(f[i][(1<<n)-1]<Min||(f[i][(1<<n)-1]==Min&&S[i][(1<<n)-1]<ans)) Min=f[i][(1<<n)-1],ans=S[i][(1<<n)-1];//统计答案
  72. return write(Min),putchar('\n'),cout<<ans,0;
  73. }

\(T3\):红鲤鱼与绿鲤鱼

很明显,这是一道简(fan)单(ren)的数学题。(\(ykh\)大佬\(3min\)切了此题)。

读题,我们可以发现,无论红鲤鱼的出现时间如何变化,罚时始终是一样的。所以,我们只需要管绿鲤鱼出现的时间,因为只有这个才会影响答案。

仔细考虑一下,我们可以推出下面这个式子:$$\frac{5(2A+B+1)+5C_{B+A-1}^{B-1}(A+B+1)\frac{A+B}{2}}{2}$$

然后,即可暴力去求答案。代码如下:

  1. #include<bits/stdc++.h>
  2. #define ULL unsigned long long
  3. #define YKH 998244853
  4. using namespace std;
  5. ULL n,m;
  6. inline char tc()
  7. {
  8. static char ff[100000],*A=ff,*B=ff;
  9. return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
  10. }
  11. inline void read(ULL &x)
  12. {
  13. x=0;ULL f=1;char ch;
  14. while(!isdigit(ch=tc())) if(ch=='-') f=-1;
  15. while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  16. x*=f;
  17. }
  18. inline void write(ULL x)
  19. {
  20. if(x<0) putchar('-'),x=-x;
  21. if(x>9) write(x/10);
  22. putchar(x%10+'0');
  23. }
  24. inline ULL Inv(ULL x,ULL y)
  25. {
  26. ULL res=1;
  27. while(y)
  28. {
  29. if(y&1) (res*=x)%=YKH;
  30. (x*=x)%=YKH,y>>=1;
  31. }
  32. return res;
  33. }
  34. int main()
  35. {
  36. read(n),read(m),n%=YKH;
  37. register ULL i;ULL ans1=((n+m+1)%YKH*(n+m)%YKH)%YKH*(Inv(2,YKH-2)%YKH)%YKH,ans2=1,t=1;
  38. for(i=n+1;i<n+m;++i) (ans2*=i%YKH)%=YKH;
  39. for(i=2;i<m;++i) (ans2*=Inv(i%YKH,YKH-2))%=YKH;
  40. for(i=n+1;i<=n+m;++i) (t*=i%YKH)%=YKH;
  41. for(i=2;i<=m;++i) (t*=Inv(i%YKH,YKH-2))%=YKH;
  42. (ans2*=5ll)%=YKH;
  43. ULL ans=((ans1*ans2)%YKH*(Inv(t%YKH,YKH-2)%YKH))%YKH;
  44. write((ans+5LL*(2LL*n%YKH+m+1)%YKH+YKH)%YKH);
  45. return 0;
  46. }

但是,我们会发现,这个代码会\(TLE\),只能得\(70\)分。怎么办呢?这时就要用卡常大法

终于,在我的不懈努力下, 我改到了\(95\)分。代码如下:

  1. #include<cstdio>
  2. #include<cctype>
  3. using namespace std;
  4. unsigned long long n,m;
  5. inline char tc()
  6. {
  7. static char ff[100000],*A=ff,*B=ff;
  8. return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
  9. }
  10. inline void read(unsigned long long &x)
  11. {
  12. x=0;char ch;
  13. while(!isdigit(ch=tc()));
  14. while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  15. }
  16. inline void write(unsigned long long x)
  17. {
  18. if(x>9) write(x/10);
  19. putchar(x%10+'0');
  20. }
  21. inline unsigned long long Inv(unsigned long long x,unsigned long long y)
  22. {
  23. unsigned long long res=1;
  24. while(y)
  25. {
  26. if(y&1) (res*=x)%=998244853;
  27. (x*=x)%=998244853,y>>=1;
  28. }
  29. return res;
  30. }
  31. int main()
  32. {
  33. read(n),read(m),n%=998244853;
  34. register unsigned long long i;unsigned long long ans1=((n+m+1)%998244853*(n+m)%998244853)%998244853*(Inv(2,998244851)%998244853)%998244853,ans2=1,t=1,x;
  35. for(i=n+1;i<n+m;++i) (ans2*=i)%=998244853,(t*=i)%=998244853;
  36. for(i=2;i<m;++i) (ans2*=x=Inv(i,998244851))%=998244853,(t*=x)%=998244853;
  37. (t*=(n+m)*(Inv(m,998244851))%998244853)%=998244853,(ans2+=ans2<<2)%=998244853;
  38. unsigned long long ans=((ans1*ans2)%998244853*(Inv(t%998244853,998244851)%998244853))%998244853;
  39. write((ans+(10*n%998244853+5*m+5)%998244853+998244853)%998244853);
  40. return 0;
  41. }

此时,我才发现,貌似是我的方法本身有问题。(虽然\(hl666\)跟我用同样的方法,他却AC了,大概是因为我天生自带大常数吧!)

冷静一会儿,我们便可以发现,原式可以转化为$$5(2A+B+1)+5B(A+B+1)$$即$$5AB+5B^2+10A+10B+5$$这样就可以快速求出答案了。(可惜我比赛时没想到)

代码如下:

  1. #include<cstdio>
  2. #include<cctype>
  3. using namespace std;
  4. unsigned long long n,m;
  5. inline char tc()
  6. {
  7. static char ff[100000],*A=ff,*B=ff;
  8. return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
  9. }
  10. inline void read(unsigned long long &x)
  11. {
  12. x=0;char ch;
  13. while(!isdigit(ch=tc()));
  14. while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  15. }
  16. inline void write(unsigned long long x)
  17. {
  18. if(x>9) write(x/10);
  19. putchar(x%10+'0');
  20. }
  21. inline unsigned long long Inv(unsigned long long x,unsigned long long y)
  22. {
  23. unsigned long long res=1;
  24. while(y)
  25. {
  26. if(y&1) (res*=x)%=998244853;
  27. (x*=x)%=998244853,y>>=1;
  28. }
  29. return res;
  30. }
  31. int main()
  32. {
  33. read(n),read(m),n%=998244853;
  34. register unsigned long long i;
  35. unsigned long long ans=((n+m+1)*(n+m)%998244853*(Inv(2,998244851)%998244853)%998244853)*5%998244853;
  36. unsigned long long res=ans*m%998244853*Inv(n+m,998244851)%998244853;
  37. write((res+(10*n%998244853+5*m+5)%998244853+998244853)%998244853);
  38. return 0;
  39. }

【洛谷】CYJian的水题大赛 解题报告的更多相关文章

  1. CYJian的水题大赛

    实在没忍住就去打比赛了然后一耗就是一天 最后Rank19还是挺好的(要不是乐多赛不然炸飞),这是唯一一套在Luogu上号称水题大赛的而实际上真的是水题大赛的比赛 好了我们开始看题 T1 八百标兵奔北坡 ...

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

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

  3. [洛谷U22157]刷水题(数位dp)(hash)

    题目背景 做正经题是不可能做正经题的,这辈子都不可能做正经题的,毒瘤题又不会做毒瘤题,就是水题这种东西,才维持了蒟蒻的信心: 题目描述 这里有N+1 道水题,编号分别为0 ~N+1 ,每道水题都有它自 ...

  4. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  5. [POJ 1000] A+B Problem 经典水题 C++解题报告 JAVA解题报告

        A+B Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 311263   Accepted: 1713 ...

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

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

  7. Mychael原创题 洛谷T23923 Mychaelの水题 【题解】

    原题链接 题目大意: 有来自三个地区的人各a,b,c位,他们排成了一排.请问有多少种不同类型的排法,使得相邻的人都来自不同的地区 \(a,b,c<=200\) 答案取模 题解 弱弱的标程解法 设 ...

  8. [洛谷P4626]一道水题 II

    题目大意:求$lcm(1,2,3,\cdots,n)\pmod{100000007}$,$n\leqslant10^8$ 题解:先线性筛出质数,然后求每个质数最多出现的次数,可以用$\log_in$来 ...

  9. 洛谷P1540 机器翻译 水题 模拟

    注意一下细节,尤其是更新minv时不要更新错. Code: #include<vector> #include<iostream> #include<cstdio> ...

随机推荐

  1. 洛谷P2828 Switching on the Lights(开关灯)

    P2828 Switching on the Lights(开关灯) 题目背景 来源:usaco-2015-dec Farm John 最近新建了一批巨大的牛棚.这些牛棚构成了一个N*N的矩形网络.( ...

  2. 【外部节点】json判断@表示正在处理的当前数组项或对象。过滤器还可用于$引用当前对象之外的属性

    $.store.book[?(@.price < $.expensive)] { "category" : "reference", "auth ...

  3. EcmaScript学习

    1.eval: ts: declare function eval(x: string): any; js: /** @param {*} x @return {Object} */ eval = f ...

  4. sysbench压力测试总结

    sysbench压力测试工具简介sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL.Orac ...

  5. 练习十一:兔子数量计算—斐波那契实例

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少? 通过数学分析我们知道,兔子的规律为数列1,1,2 ...

  6. python入门之进程与线程

    什么是进程.线程 进程:一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等,对各种资源管理的基本单位. 线程:操作系统最小的调度单位, 是一串指令的集合,进程中的 ...

  7. E. XOR and Favorite Number 莫队 2038: [2009国家集训队]小Z的袜子(hose)

    一直都说学莫队,直到现在才学,训练的时候就跪了   T_T,其实挺简单的感觉.其实训练的时候也看懂了,一知半解,就想着先敲.(其实这样是不好的,应该弄懂再敲,以后要养成这个习惯) 前缀异或也很快想出来 ...

  8. Hadoop实战:用Hadoop处理Excel通话记录

    项目需求 有博主与家庭成员之间的通话记录一份,存储在Excel文件中,如下面的数据集所示.我们需要基于这份数据,统计每个月每个家庭成员给自己打电话的次数,并按月份输出到不同文件夹. 数据集 下面是部分 ...

  9. Storm概念学习系列之Tuple元组(数据载体)

    不多说,直接上干货! Tuple元组 Tuple 是 Storm 的主要数据结构,并且是 Storm 中使用的最基本单元.数据模型和元组. Tuple 描述 Tuple 就是一个值列表, Tuple ...

  10. C# EF 生成1-20随机数,生成10个,不能重复 LINQ写法

    , ).Select(x => ).ToList(); foreach (var i in num) { Console.WriteLine(i); } 上面的函数碉堡天了