樱花满地集于我心,楪舞纷飞祈愿相随

前言

太菜了,人手切掉两个题,我竟然一道都不会。。

改 T3 的时候整个人的心态都崩掉了,一部分原因可能是语文素养不高导致我看不懂题解。

另一部分可能就是系太不太好,受不了打击。。。(又菜又玩不起

后来稍微又看了一下题才发现自己 T3 少看了 w 互不相同这个条件,难怪感觉题解越想越不对。。

T1 茅山道术

解题思路

动态规划

设 \(f_i\) 表示前 \(i\) 个的方案数,状态可以由 \(i-1\) 或者 \(i\) 位置的这个颜色的上一个出现位置转移过来,正确性显然。

假设位置 \(i\) 颜色上一次出现位置为 \(las_i\) 则 \(f_i=f_{i-1}+f_{las_i}\times[las_i\ne i-1]\),边界是 \(f_0=1\)

code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  11. return x*f;
  12. }
  13. const int N=1e6+10,M=2e3+10,mod=1e9+7;
  14. int n,ans,s[N],las[N],bef[N],f[N];
  15. signed main()
  16. {
  17. freopen("magic.in","r",stdin);
  18. freopen("magic.out","w",stdout);
  19. n=read();
  20. for(int i=1;i<=n;i++) s[i]=read();
  21. for(int i=1;i<=n;i++)
  22. {
  23. las[i]=bef[s[i]];
  24. bef[s[i]]=i;
  25. }
  26. f[0]=1;
  27. for(int i=1;i<=n;i++)
  28. {
  29. int j=las[i];
  30. f[i]=f[i-1];
  31. if(j) f[i]=(f[i]+f[j]*(j<i-1))%mod;
  32. }
  33. printf("%lld",f[n]);
  34. return 0;
  35. }

T2 泰拳警告

解题思路

枚举输赢局总数进行计算。

假设输赢局总数是 \(i\) 那么赢的局数一定要多于一半,对于一局我们把平局的方案数看作是 \(p\) 种,输赢的情况数各为 \(1\) 种,最后的答案除去 \((p+2)^n\) 就好了。

那么可以像官方题解一样看作 \((x+x^{-1})^i\) 次幂大于 \(0\) 其实也就是赢的局数大于输的局数,然后二项式展开。

通俗理解的话就是从 \(i\) 场中最少赢 \(\lfloor\dfrac{i+1}{2}\rfloor\) 场才算合法的情况,那么方案数也就是 \(t(i)=\sum\limits_{j=0}^iC_i^j\times[j\ge\lfloor\dfrac{i+1}{2}\rfloor]\)

对于偶数奇数分别计算,显然 \(i\) 为奇数的时候 \(t(i)=\dfrac{\sum\limits_{j=0}^i C_j^j}{2}\) 也就是 \(t(i)=2^{i-1}\)

对于偶数的时候只需要去掉中间的一项就好了 \(t(i)=2^{i-1}-\dfrac{C^{\frac{i}{2}}_{i}}{2}\)

然后对于剩下的平局就有 \(p^{n-i}\) 种方案,对于 \(n\) 局进行排列,并且去掉等效的局数内部的排序,因此我们需要在乘上 \(\dfrac{A_n^n}{A_i^i\times A_{n-i}^{n-i}}\)

code

一般观赏版

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  11. return x*f;
  12. }
  13. const int N=3e6+10,mod=998244353;
  14. int n,p,ans,fac[N],ifac[N];
  15. int power(int x,int y)
  16. {
  17. int temp=1;
  18. while(y)
  19. {
  20. if(y&1) temp=temp*x%mod;
  21. x=x*x%mod; y>>=1;
  22. }
  23. return temp;
  24. }
  25. int C(int x,int y){return fac[x]*ifac[y]%mod*ifac[x-y]%mod;}
  26. int A(int x,int y){return fac[x]*ifac[x-y]%mod;}
  27. signed main()
  28. {
  29. freopen("fight.in","r",stdin);
  30. freopen("fight.out","w",stdout);
  31. n=read(); p=read(); fac[0]=ifac[0]=1;
  32. for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
  33. ifac[n]=power(fac[n],mod-2);
  34. for(int i=n-1;i>=1;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
  35. for(int i=1;i<=n;i++)
  36. {
  37. int pre=ans;
  38. if(i&1) ans=(ans+power(2,i-1)*(n-i+1)%mod*power(p,n-i)%mod*fac[n]%mod*ifac[i]%mod*ifac[n-i])%mod;
  39. else ans=(ans+(power(2,i-1)-C(i,i/2)*power(2,mod-2)%mod+mod)%mod*(n-i+1)%mod*power(p,n-i)%mod*fac[n]%mod*ifac[i]%mod*ifac[n-i])%mod;
  40. }
  41. printf("%lld",ans*power(power(p+2,n),mod-2)%mod);
  42. return 0;
  43. }

极致压行版

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. inline int read(){
  5. int x=0,f=1;char ch=getchar();
  6. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  7. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  8. return x*f;
  9. }
  10. const int N=3e6+10,mod=998244353;
  11. int n,p,ans,inv2,invp,fac[N],ifac[N];
  12. int power(int x,int y){int temp=1;while(y){if(y&1) temp=temp*x%mod;x=x*x%mod; y>>=1;}return temp;}
  13. int C(int x,int y){return fac[x]*ifac[y]%mod*ifac[x-y]%mod;}
  14. int A(int x,int y){return fac[x]*ifac[x-y]%mod;}
  15. signed main(){
  16. freopen("fight.in","r",stdin); freopen("fight.out","w",stdout);
  17. n=read(); p=read(); inv2=power(2,mod-2); invp=power(p,mod-2);
  18. fac[0]=ifac[0]=1; for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
  19. ifac[n]=power(fac[n],mod-2); for(int i=n-1;i>=1;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
  20. for(int i=1,base=1,basep=power(p,n-1);i<=n;i++,base=base*2%mod,basep=basep*invp%mod)
  21. if(i&1) ans=(ans+base*(n-i+1)%mod*basep%mod*fac[n]%mod*ifac[i]%mod*ifac[n-i])%mod;
  22. else ans=(ans+(base-C(i,i/2)*inv2%mod+mod)%mod*(n-i+1)%mod*basep%mod*fac[n]%mod*ifac[i]%mod*ifac[n-i])%mod;
  23. printf("%lld",ans*power(power(p+2,n),mod-2)%mod);
  24. return 0;
  25. }

T3 万猪拱塔

解题思路

非常非常恶心的一道题。。。

正解的思路就非常玄学,非常非常玄学。。。

考虑判定权值在区间 \([l,r]\) 内的所有数所在的格子是否形成了一个矩形,因为题目保证各个点的值不相同,因此满足条件的矩形一定包括了 \([Min,Max]\) 中的所有的点。

记值在 \([l,r]\) 格子的颜色为黑色,其它的格子颜色为白色。

考虑所有的 \((n + 1)\times(m + 1)\) 个 \(2\times 2\) 的小正方形 (部分超出边界也算)。

则所有黑色格子形成一个矩形,当且仅当恰好有 \(4\) 个小正方形内部有 \(1\) 个黑色格子,并且没有任何一个小正方形内部有 \(3\) 个黑色格子,所谓有 \(1\) 个黑色格子的小正方形其实就是矩形的四个角,然后 有 \(2\) 个,\(4\) 个黑色格子的就是边缘以及矩形内部的。

从小到大枚举 \(r\) ,对每个 \(l\le r\) ,记 \(f(l)\) 表示染黑权值在 \([l,r]\) 内的格子后,有多少小正方形内部有 1 个或 3 个黑色格子。

\(f(l) \ge 4,f(r) = 4\),于是只需要对每个 \(l\) 维护 \(f(l)\) 最小值,最小值的数目和取得最小值的所有 \(l\) 之和。

每次小格子的更改只会影响到周围四个小正方形内部的黑色格子的数量,然后就是根据当前的格子状态进行修改。

假设四个格子的大小从小到大是 \(l_1,l_2,l_3,r\) 那么我们进行 对于 \(r\) 格子的染色之后就会有, \([l_3+1,r]\) 区间染色是有一个有 \(1\) 个黑色格子的小正方形,染色之前有 一个有 \(0\) 个黑色格子的小正方形。

因此我们给 \([l_3+1,r]\) 区间的 \(f(l)\) 加 \(1\)。同样的道理 \([l_2+1,l_3]\) 区间减去 \(1\),\([l_1+1,l_2]\) 区间加 \(1\) , \([1,l_1]\) 区间减去 \(1\)

线段树维护即可,注意一个点,一开始的 \(f(l)\) 是 \(0\) 我们是不会算入最小值的,但是当我们区间加值之后就会被计入答案,因此需要维护每个区间剩余 \(0\) 的数量以及 \(l\) 之和。

code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Failed"<<endl
  5. #define ls x<<1
  6. #define rs x<<1|1
  7. using namespace std;
  8. inline int read()
  9. {
  10. int x=0,f=1;char ch=getchar();
  11. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  12. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  13. return x*f;
  14. }
  15. const int mod=998244353,N=5e5+10,INF=1e18;
  16. int n,m,ans,d[10],fro[N];
  17. vector<int> s[N];
  18. pair<int,int> id[N];
  19. struct Segment_Tree{int cnt,dat,sum,laz,res,tot;}tre[N<<2];
  20. void push_up(int x)
  21. {
  22. tre[x].res=tre[ls].res+tre[rs].res;tre[x].tot=tre[ls].tot+tre[rs].tot;
  23. if(tre[ls].dat==tre[rs].dat) return tre[x].dat=tre[ls].dat,tre[x].cnt=tre[ls].cnt+tre[rs].cnt,tre[x].sum=tre[ls].sum+tre[rs].sum,void();
  24. if(!tre[ls].dat) return tre[x].dat=tre[rs].dat,tre[x].cnt=tre[rs].cnt,tre[x].sum=tre[rs].sum,void();
  25. if(!tre[rs].dat) return tre[x].dat=tre[ls].dat,tre[x].cnt=tre[ls].cnt,tre[x].sum=tre[ls].sum,void();
  26. if(tre[ls].dat>tre[rs].dat) return tre[x].dat=tre[rs].dat,tre[x].cnt=tre[rs].cnt,tre[x].sum=tre[rs].sum,void();
  27. if(tre[rs].dat>tre[ls].dat) return tre[x].dat=tre[ls].dat,tre[x].cnt=tre[ls].cnt,tre[x].sum=tre[ls].sum,void();
  28. }
  29. void build(int x,int l,int r)
  30. {
  31. if(l==r) return tre[x].dat=0,tre[x].cnt=1,tre[x].sum=l,tre[x].res=1,tre[x].tot=l,fro[l]=x,void();
  32. int mid=(l+r)>>1; build(ls,l,mid); build(rs,mid+1,r); push_up(x);
  33. }
  34. void push_down(int x,int l,int r)
  35. {
  36. if(!tre[x].laz) return ;
  37. int mid=(l+r)>>1;
  38. tre[ls].dat+=tre[x].laz;tre[ls].laz+=tre[x].laz;
  39. if(!tre[ls].dat) tre[ls].cnt=tre[ls].res=mid-l+1,tre[ls].sum=tre[ls].tot=(l-1)*(mid-l+1)+mid-l+1;
  40. if(tre[x].laz>0&&tre[ls].res) tre[ls].dat=tre[x].laz,tre[ls].cnt=tre[ls].res,tre[ls].sum=tre[ls].tot,tre[ls].res=tre[ls].tot=0;
  41. tre[rs].dat+=tre[x].laz;tre[rs].laz+=tre[x].laz;
  42. if(!tre[rs].dat) tre[rs].cnt=tre[rs].res=r-mid,tre[rs].sum=tre[rs].tot=(mid-1)*(r-mid)+r-mid;
  43. if(tre[x].laz>0&&tre[rs].res) tre[rs].dat=tre[x].laz,tre[rs].cnt=tre[rs].res,tre[rs].sum=tre[rs].tot,tre[rs].res=tre[rs].tot=0;
  44. tre[x].laz=0;
  45. }
  46. void insert(int x,int l,int r,int L,int R,int num)
  47. {
  48. if(L<=l&&r<=R)
  49. {
  50. tre[x].laz+=num; tre[x].dat+=num;
  51. if(!tre[x].dat) tre[x].cnt=r-l+1,tre[x].sum=(l-1)*(r-l+1)+r-l+1,tre[x].res=r-l+1,tre[x].tot=(l-1)*(r-l+1)+r-l+1;
  52. if(num&&tre[x].res) tre[x].dat=tre[x].laz,tre[x].cnt=tre[x].res,tre[x].sum=tre[x].tot,tre[x].res=tre[x].tot=0;
  53. return ;
  54. }
  55. int mid=(l+r)>>1; push_down(x,l,r);
  56. if(L<=mid) insert(ls,l,mid,L,R,num);
  57. if(R>mid) insert(rs,mid+1,r,L,R,num);
  58. push_up(x);
  59. }
  60. void work(int num)
  61. {
  62. sort(d+1,d+5);int pos=lower_bound(d+1,d+5,num)-d;d[0]=0;
  63. for(int j=1,temp=pos-j+1;j<=pos;j++,temp=pos-j+1)
  64. if(temp==1) insert(1,1,n*m,d[j-1]+1,d[j],1);
  65. else if(temp==2) insert(1,1,n*m,d[j-1]+1,d[j],-1);
  66. else if(temp==3) insert(1,1,n*m,d[j-1]+1,d[j],1);
  67. else if(temp==4) insert(1,1,n*m,d[j-1]+1,d[j],-1);
  68. }
  69. signed main()
  70. {
  71. freopen("pig.in","r",stdin); freopen("pig.out","w",stdout);
  72. n=read(); m=read(); build(1,1,n*m);
  73. for(int i=0;i<=m+1;i++) s[0].push_back(n*m+1),s[n+1].push_back(n*m+1);
  74. for(int i=1;i<=n;i++) s[i].push_back(n*m+1);
  75. for(int i=1;i<=n;i++)for(int j=1,x;j<=m;j++) x=read(),s[i].push_back(x),id[x]=make_pair(i,j);
  76. for(int i=1;i<=n;i++) s[i].push_back(n*m+1);
  77. for(int i=1;i<=n*m;i++)
  78. {
  79. int x=id[i].first,y=id[i].second,pos;
  80. d[1]=s[x-1][y];d[2]=s[x][y-1];d[3]=s[x-1][y-1];d[4]=i;work(i);
  81. d[1]=s[x-1][y];d[2]=s[x][y+1];d[3]=s[x-1][y+1];d[4]=i;work(i);
  82. d[1]=s[x+1][y];d[2]=s[x][y-1];d[3]=s[x+1][y-1];d[4]=i;work(i);
  83. d[1]=s[x+1][y];d[2]=s[x][y+1];d[3]=s[x+1][y+1];d[4]=i;work(i);
  84. if(tre[1].dat==4) ans=(ans+i*tre[1].cnt%mod-tre[1].sum+tre[1].cnt+mod)%mod;
  85. }
  86. printf("%lld",ans);
  87. return 0;
  88. }

T4 抑郁刀法

欲学此法,必先抑郁,由于我还没有抑郁,因此。。。

大坑未补

NOIP模拟51的更多相关文章

  1. Noip模拟51 2021.9.12

    T1 茅山道术 考场上卡在了一个恶心的地方, 当时以为每次施法都会产生新的可以施法的区间,然后想都没细想, 认为不可做,甚至$dfs$也无法打,考后一问发现是自己想多了.. 新产生的区间对答案根本没有 ...

  2. 2021.9.12考试总结[NOIP模拟51]

    T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...

  3. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  4. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  5. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  6. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  7. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  8. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  9. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

随机推荐

  1. Aging Cell两篇连发 | 华中科技大学王建枝团队运用蛋白质组学技术发现具有AD早期诊断价值的血小板生物标志物

    阿尔茨海默症 (Alzheimer 's disease,AD) 是一种原发性的中枢神经系统退行性疾病.AD的主要临床症状是缓慢的认知功能减退,包括记忆.逻辑推理能力和语言功能的进行性丟失,最后发展为 ...

  2. 从Python到Go:初学笔记

    本文记录了我在学习Go的过程时的一些笔记,主要是比较Python和Go之间的差异并作简单描述,以此使Python程序员对Go语言的特性有简略的了解.初学难免有纰漏,欢迎各位批评指正补充交流,谢谢. 数 ...

  3. 5.1 剑指 Offer 03. 数组中重复的数字

    类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...

  4. rein 多平台支持的超便携端口转发与内网穿透工具

    介绍 本程序主要用于进行反向代理IP地址和端口,功能类似于 nginx 的 stream 模式和rinetd 的功能:在(1.0.5)版本开始,rein支持内网穿透,这一功能类似于frp 和ngrok ...

  5. 学习vue过程中遇到的问题

    1.vue-quill-editor动态禁用 项目中把vue-quill-editor单独封装成了一个组件,通过props传递readOnly参数来设置是否禁用editor.开发中发现可以实现禁用效果 ...

  6. dython:Python数据建模宝藏库

    尽管已经有了scikit-learn.statsmodels.seaborn等非常优秀的数据建模库,但实际数据分析过程中常用到的一些功能场景仍然需要编写数十行以上的代码才能实现. 而今天要给大家推荐的 ...

  7. 微信SDK的使用

    一.导入依赖 <!--微信支付--> <dependency> <groupId>com.github.wxpay</groupId> <arti ...

  8. C#实现http协议GET、POST请求

    using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Ne ...

  9. Json序列化更新好友列表

    一.概述 使用Newtonsoft.Json开源库进行序列化 二.代码 using Newtonsoft.Json; using System; using System.Collections.Ge ...

  10. springMVC学习日志一

    一.springMVC流程图省略 二.写一个简单的springmvc的demo来说明 2.1引入springMVC相关的jar包 2.2配置DispatcherServlet 在web.xml < ...