2021.9.12考试总结[NOIP模拟51]
T1 茅山道术
仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可。
又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色。
于是对区间右端点而言,区间染色的贡献为遍历到区间左端点时的方案数。线性$DP$。
$code:$


1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4
5 namespace IO{
6 inline int read(){
7 char ch=getchar(); int x=0,f=1;
8 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
9 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
10 return x*f;
11 }
12 inline void write(int x,char sp){
13 char ch[20]; int len=0;
14 if(x<0){ putchar('-'); x=~x+1; }
15 do{ ch[len++]=x%10+(1<<4)+(1<<5); x/=10; }while(x);
16 for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
17 }
18 inline int max(int x,int y){ return x<y?y:x; }
19 inline int min(int x,int y){ return x<y?x:y; }
20 inline void swap(int &x,int &y){ x^=y^=x^=y; }
21 inline void chmax(int &x,int y){ x=x<y?y:x; }
22 inline void chmin(int &x,int y){ x=x<y?x:y; }
23 } using namespace IO;
24
25 const int NN=1e6+5,p=1e9+7;
26 int n,ext,ans,pre[NN],c[NN],f[NN];
27
28 signed main(){
29 FILE *a=freopen("magic.in","r",stdin);
30 FILE *b=freopen("magic.out","w",stdout);
31 n=read();
32 for(int i=1;i<=n;i++) c[i]=read();
33 for(int i=1;i<=n;i++)
34 if(c[i]!=c[i-1]) c[++ext]=c[i];
35 n=ext; pre[c[1]]=1; f[1]=1;
36 for(int i=2;i<=n;i++){
37 f[i]=f[i-1];
38 if(pre[c[i]]) (f[i]+=f[pre[c[i]]])%=p;
39 pre[c[i]]=i;
40 }
41 write(f[n],'\n');
42 return 0;
43 }
T1
T2 泰拳警告
发现输赢的可能性相等。
枚举平局个数,设非平局个数为$s$,那么这种情况在固定平局位置的前提下总方案数为$2^s$。
因为输赢可能性相等,所以在排除输赢局数相同后赢大于输的方案为总方案的一半。
输赢相等的情况仅在$s$为偶时出现,为$C^s_{\frac{n}{2}}$。最后再乘上$C^n_{n-s}$即为这个平局个数的总方案。
期望就好说了。
推式子也能做。
$code:$


1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4
5 namespace IO{
6 inline int read(){
7 char ch=getchar(); int x=0,f=1;
8 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
9 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
10 return x*f;
11 }
12 inline void write(int x,char sp){
13 char ch[20]; int len=0;
14 if(x<0){ putchar('-'); x=~x+1; }
15 do{ ch[len++]=x%10+(1<<4)+(1<<5); x/=10; }while(x);
16 for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
17 }
18 inline int max(int x,int y){ return x<y?y:x; }
19 inline int min(int x,int y){ return x<y?x:y; }
20 inline void swap(int &x,int &y){ x^=y^=x^=y; }
21 inline void chmax(int &x,int y){ x=x<y?y:x; }
22 inline void chmin(int &x,int y){ x=x<y?x:y; }
23 } using namespace IO;
24
25 const int NN=3e6+5,mod=998244353;
26 int n,p,ans,win[NN],flt[NN],fac[NN],inv[NN],mi[NN];
27
28 inline int C(int n,int m){ return n<m?0:fac[n]*inv[m]%mod*inv[n-m]%mod; }
29 inline int qpow(int a,int b){
30 int res=1;
31 while(b){
32 if(b&1) res=res*a%mod;
33 a=a*a%mod;
34 b>>=1;
35 }
36 return res;
37 }
38
39 signed main(){
40 FILE *a=freopen("fight.in","r",stdin);
41 FILE *b=freopen("fight.out","w",stdout);
42 n=read(); p=read()+2; fac[0]=inv[0]=win[0]=flt[0]=mi[0]=1;
43 for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
44 inv[n]=qpow(fac[n],mod-2);
45 for(int i=n-1;i;i--) inv[i]=inv[i+1]*(i+1)%mod;
46 win[1]=qpow(p,mod-2); flt[1]=win[1]*(p-2)%mod; mi[1]=2;
47 for(int i=2;i<=n;i++){
48 win[i]=win[i-1]*win[1]%mod;
49 flt[i]=flt[i-1]*flt[1]%mod;
50 mi[i]=(mi[i-1]<<1)%mod;
51 }
52 for(int i=1;i<=n;i++){
53 int rest=n-i+1,num=mi[rest];
54 if(!(rest&1)) (num+=mod-C(rest,rest>>1))%=mod;
55 num=num*inv[2]%mod; (num*=C(n,i-1))%=mod;
56 (ans+=i*flt[i-1]%mod*win[n-i+1]%mod*num%mod)%=mod;
57 }
58 write(ans,'\n');
59 return 0;
60 }
T2
T3 万猪拱塔
发现矩形有贡献仅当里面的数是连续的。
考虑对权值为$[l,r]$的位置染色,那么考虑$(n+1)\times (m+1)$个$2\times 2$的小正方形(不全也算),这些染色的位置能组成矩形,当且仅当被染$\frac{1}{4}$的小正方形只有$4$个,且没有被染$\frac{3}{4}$的小正方形。
被染$\frac{1}{4}$的小正方形个数总大于等于$4$于是可以枚举区间的$r$,线段树上枚举对于每个$l$,被染色$\frac{1}{4}$或$\frac{3}{4}$的小正方形个数的最小值$mn$,达到最小值的$l$个数$num$和总和$sum$。
发现每个$r$最小值必定为$4$($[r,r]$),每个$r$的贡献为$r\times num-sum+num$。
每次$r$移动时会影响$4$个小正方形,记录小正方形中四个权值的大小顺序,按权值顺序修改即可。
注意最小值$4$可能是由$r$贡献的,但下放标记时因为$r$初始是$0$不会被更新,因此要手动给$r$下方标记。
$code:$


1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4
5 namespace IO{
6 inline int read(){
7 char ch=getchar(); int x=0,f=1;
8 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
9 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
10 return x*f;
11 }
12 inline void write(int x,char sp){
13 char ch[20]; int len=0;
14 if(x<0){ putchar('-'); x=~x+1; }
15 do{ ch[len++]=x%10+(1<<4)+(1<<5); x/=10; }while(x);
16 for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
17 }
18 inline int max(int x,int y){ return x<y?y:x; }
19 inline int min(int x,int y){ return x<y?x:y; }
20 inline void swap(int &x,int &y){ x^=y^=x^=y; }
21 inline void chmax(int &x,int y){ x=x<y?y:x; }
22 inline void chmin(int &x,int y){ x=x<y?x:y; }
23 } using namespace IO;
24
25 const int NN=5e5+5,p=998244353,inf=0x7fffffff;
26 int n,m,ext,ex,ans,tmp,w[NN],pos[NN],cnt[NN][5];
27 vector<int>sot;
28 inline int id(int x,int y){ return (m+1)*x+y; }
29
30 namespace segment_tree{
31 #define ld rt<<1
32 #define rd (rt<<1)|1
33 int mn[NN<<2],sum[NN<<2],num[NN<<2],laz[NN<<2];
34 void pushup(int rt){
35 if(!mn[ld]&&!mn[rd]) return;
36 if(!mn[ld]){ mn[rt]=mn[rd], sum[rt]=sum[rd], num[rt]=num[rd]; return; }
37 if(!mn[rd]){ mn[rt]=mn[ld], sum[rt]=sum[ld], num[rt]=num[ld]; return; }
38 if(mn[ld]==mn[rd]){
39 mn[rt]=mn[ld];
40 sum[rt]=(sum[ld]+sum[rd])%p;
41 num[rt]=(num[ld]+num[rd])%p;
42 return;
43 }
44 mn[rt]=min(mn[ld],mn[rd]);
45 sum[rt]=mn[ld]<mn[rd]?sum[ld]:sum[rd];
46 num[rt]=mn[ld]<mn[rd]?num[ld]:num[rd];
47 }
48 void pushdown(int rt){
49 laz[ld]+=laz[rt]; laz[rd]+=laz[rt];
50 mn [ld]+=laz[rt]; mn [rd]+=laz[rt];
51 laz[rt]=0;
52 }
53 void build(int rt,int l,int r){
54 if(l==r){
55 num[rt]=1; sum[rt]=l;
56 return;
57 }
58 int mid=l+r>>1;
59 build(ld,l,mid);
60 build(rd,mid+1,r);
61 }
62 void modify(int rt,int l,int r,int opl,int opr,int v){
63 if(l>=opl&&r<=opr){
64 mn[rt]+=v; laz[rt]+=v;
65 return;
66 }
67 pushdown(rt);
68 int mid=l+r>>1;
69 if(opl<=mid) modify(ld,l,mid,opl,opr,v);
70 if(opr>mid) modify(rd,mid+1,r,opl,opr,v);
71 pushup(rt);
72 }
73 void down(int rt,int l,int r,int pos){
74 if(l==r) return;
75 pushdown(rt);
76 int mid=l+r>>1;
77 if(pos<=mid) down(ld,l,mid,pos);
78 else down(rd,mid+1,r,pos);
79 pushup(rt);
80 }
81 } using namespace segment_tree;
82
83 void update(int i,int p){
84 if(i==cnt[p][1])
85 modify(1,1,ext,1 ,cnt[p][1], 1);
86 if(cnt[p][2]>1e9) return;
87 if(i==cnt[p][2]){
88 modify(1,1,ext,1 ,cnt[p][1],-1);
89 modify(1,1,ext,cnt[p][1]+1,cnt[p][2], 1);
90 }
91 if(cnt[p][3]>1e9) return;
92 if(i==cnt[p][3]){
93 modify(1,1,ext,1 ,cnt[p][1], 1);
94 modify(1,1,ext,cnt[p][1]+1,cnt[p][2],-1);
95 modify(1,1,ext,cnt[p][2]+1,cnt[p][3], 1);
96 }
97 if(cnt[p][4]>1e9) return;
98 if(i==cnt[p][4]){
99 modify(1,1,ext,1 ,cnt[p][1],-1);
100 modify(1,1,ext,cnt[p][1]+1,cnt[p][2], 1);
101 modify(1,1,ext,cnt[p][2]+1,cnt[p][3],-1);
102 modify(1,1,ext,cnt[p][3]+1,cnt[p][4], 1);
103 }
104 }
105
106 signed main(){
107 FILE *a=freopen("pig.in","r",stdin);
108 FILE *b=freopen("pig.out","w",stdout);
109 n=read(); m=read(); ext=n*m; build(1,1,ext);
110 memset(w,0x7f,sizeof(w));
111 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
112 w[id(i,j)]=read(), pos[w[id(i,j)]]=id(i,j);
113 for(int x=0;x<=n;x++) for(int y=0;y<=m;y++){
114 int i=id(x,y); sot.clear();
115 sot.push_back(w[i]);
116 if(x==n) sot.push_back(inf);
117 else sot.push_back(w[i+m+1]);
118 if(y==m) sot.push_back(inf);
119 else sot.push_back(w[i+1]);
120 if(x==n||y==m) sot.push_back(inf);
121 else sot.push_back(w[i+m+2]);
122 sort(sot.begin(),sot.end());
123 cnt[i][1]=sot[0]; cnt[i][2]=sot[1];
124 cnt[i][3]=sot[2]; cnt[i][4]=sot[3];
125 }
126 for(int i=1;i<=ext;i++){
127 update(i,pos[i]-m-2);
128 update(i,pos[i]-m-1);
129 update(i,pos[i]-1);
130 update(i,pos[i]);
131 down(1,1,ext,i);
132 (ans+=i*num[1]%p-sum[1]+num[1]+p)%=p;
133 }
134 write(ans,'\n');
135 return 0;
136 }
T3
T4 抑郁刀法
删点太难调了。。
gu了
2021.9.12考试总结[NOIP模拟51]的更多相关文章
- 2021.8.12考试总结[NOIP模拟37]
T1 数列 考场上切掉的简单题. $a$,$b$与数列中数的正负值对答案无关.全当作正数计算即可. $exgcd$解未知数系数为$a$,$b$,加和为$gcd(a,b)$的不定方程组,再枚举每个数.如 ...
- 2021.10.12考试总结[NOIP模拟75]
T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 2021.9.13考试总结[NOIP模拟52]
T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...
- 2021.8.11考试总结[NOIP模拟36]
T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...
- 2021.7.29考试总结[NOIP模拟27]
T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...
- 2021.7.15考试总结[NOIP模拟16]
ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
- 2021.9.9考试总结[NOIP模拟50]
T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...
随机推荐
- 集合遍历数组三种常用方式(Collecton和Map)
Collection集合遍历数组的三种方式: 迭代器 foreach(增强for循环) JDK1.8之后的新技术Lambda 迭代器: 方法:public Iterator inerator():获取 ...
- POJ1741——Tree(树的点分治)
1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...
- Django学习day08随堂笔记
今日考题 """ 今日考题 1.聚合查询,分组查询的关键字各是什么,各有什么特点或者注意事项 2.F与Q查询的功能,他们的导入语句是什么,针对Q有没有其他用法 3.列举常 ...
- 【PHP数据结构】PHP数据结构及算法总结
断断续续地把这个系列写完了,就像上一个设计模式一样,算法这个系列也是前前后后写了将近有一年的时间.当然,都是在业余或者晚上的时间写完的,所以进度如此地慢.更主要的是,既然要写,总得要自己先弄懂吧,对于 ...
- PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作
就像 PDO 中的 PDO_Statment 对象一样,MySQLI_STMT 对象也是一个预处理语句所形成的对象,专门用来操作 MySQLi 所生成的预处理语句的.其实操作方式之类也都比较相似,不外 ...
- Dede后台广告管理模块增加图片上传功能插件
用户问题:网站广告后台管理非常方便,但是织梦后台的广告管理模块,发布广告时图片没有上传选项,只能用URL地址,很不方便,那么织梦帮就教大家一个方法实现广告图片后台直接上传,非常方便.先给大家看下修改后 ...
- CF235C-Cyclical Quest【SAM】
正题 题目链接:https://www.luogu.com.cn/problem/CF235C 题目大意 一个文本串\(s\).询问\(n\)个匹配的本质不同的循环同构在文本串中出现了几次. 解题思路 ...
- P4320-道路相遇,P5058-[ZJOI2004]嗅探器【圆方树,LCA】
两题差不多就一起写了 P4320-道路相遇 题目链接:https://www.luogu.com.cn/problem/P4320 题目大意 \(n\)个点\(m\)条边的一张图,\(q\)次询问两个 ...
- iOS 15 无法弹出授权弹框之解决方案---Your app uses the AppTrackingTransparency framework, but we are unable to locate the App Tracking Transparency permission request when reviewed on iOS 15.0
2021年9月30日下午:我正愉快的期盼着即将到来的国庆假期,时不时刷新下appstoreconnect的网址,28号就提上去的包,今天还在审核中....由于这个版本刚升级的xcode系统和新出的iO ...
- efcore分表分库原理解析
ShardingCore ShardingCore 易用.简单.高性能.普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2+的所有版本,支持efcore2+的所有数据 ...