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]的更多相关文章

  1. 2021.8.12考试总结[NOIP模拟37]

    T1 数列 考场上切掉的简单题. $a$,$b$与数列中数的正负值对答案无关.全当作正数计算即可. $exgcd$解未知数系数为$a$,$b$,加和为$gcd(a,b)$的不定方程组,再枚举每个数.如 ...

  2. 2021.10.12考试总结[NOIP模拟75]

    T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...

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

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

  4. 2021.9.13考试总结[NOIP模拟52]

    T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...

  5. 2021.8.11考试总结[NOIP模拟36]

    T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...

  6. 2021.7.29考试总结[NOIP模拟27]

    T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...

  7. 2021.7.15考试总结[NOIP模拟16]

    ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...

  8. 2021.9.14考试总结[NOIP模拟53]

    T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...

  9. 2021.9.9考试总结[NOIP模拟50]

    T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...

随机推荐

  1. java9的JShell小工具和编译器两种自动优化

    一.按顺序逐步执行的脚本程序: 二.编译器自动优化 1.不超数据类型范围编译器自动添加强转操作: 2.一但发生运算,byte/short/char都会自动提升为Int,当只有常量参与运算时,编译器会先 ...

  2. linu命令进阶篇

    预备知识: 本实验要求实验者具备如下的相关知识. 前面我们学习了linux的文件系统,了解的文件系统的结构,也学了linux档案的属性和权限,以及其设定. 当我们执行命令操作一个文件的时候,却不知道这 ...

  3. v-for列表渲染之数组变动检测

    1.简单举一个v-for列表渲染例子 <template> <div> <ul> <li v-for="item in items"> ...

  4. (3)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Cloud和Dubbo的区别及各自的优缺点

    ​ 我们先从 Nginx 说起,了解为什么需要微服务.最初的服务化解决方案是给相同服务提供一个统一的域名,然后服务调用者向这个域发送 HTTP 请求,由 Nginx 负责请求的分发和跳转. 这种架构存 ...

  5. docker 搭建 zipkin

    1.拉镜像 docker pull openzipkin/zipkin 2.运行镜像 docker run -d --restart always -p 9411:9411 --name zipkin ...

  6. 496. 下一个更大元素 I

    496. 下一个更大元素 I 给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. ...

  7. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  8. PHP的Hash信息摘要扩展框架

    今天我们主要学习的是 PHP 中一些 Hash 散列加密相关的扩展函数的使用,而不是 Hash 算法,这种加密其实也只是一种更复杂一些的密钥算法,与 Hash 算法类似的是,我们输入的一串字符串,就像 ...

  9. nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)

    在nginx中常用的有以下四种负载均衡的算法,分别是:round-robin.ip-hash.least-connected和weighted.当然在实际生产中或许使用最多的就是ip-hash了,一般 ...

  10. python3.7+flask+alipay 支付宝付款功能

    文档参考github:https://github.com/fzlee/alipay/blob/master/docs/init.md 沙箱环境配置:https://opendocs.alipay.c ...