2021.9.7考试总结[NOIP模拟49]
T1 Reverse
$BFS$暴力$O(n^2)$
过程中重复枚举了很多点,考虑用链表记录当前点后面可到达的第一个未更新点。
搜索时枚举翻转子串的左端点,之后便可以算出翻转后$1$的位置。
$code:$


1 #include<bits/stdc++.h>
2 using namespace std;
3
4 namespace IO{
5 inline int read(){
6 char ch=getchar(); int x=0,f=1;
7 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
8 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
9 return x*f;
10 }
11 inline void write(int x,char sp){
12 char ch[20]; int len=0;
13 if(x<0){ putchar('-'); x=~x+1; }
14 do{ ch[len++]=x%10+(1<<4)+(1<<5); x/=10; }while(x);
15 for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
16 }
17 inline int max(int x,int y){ return x<y?y:x; }
18 inline int min(int x,int y){ return x<y?x:y; }
19 inline void swap(int &x,int &y){ x^=y^=x^=y; }
20 inline void chmax(int &x,int y){ x=x<y?y:x; }
21 inline void chmin(int &x,int y){ x=x<y?x:y; }
22 } using namespace IO;
23
24 const int NN=1e5+5;
25 int n,m,s,k,dis[NN],nex[NN];
26 bool ban[NN];
27 vector<int>move;
28
29 void bfs(){
30 memset(dis,-1,sizeof(dis));
31 queue<int>q;
32 for(int i=1;i<=n;i++) nex[i]=i+2;
33 dis[s]=0; q.push(s);
34 while(!q.empty()){
35 int x=q.front(),l=max(1,x-k+1),r=min(x,n-k+1),tmp;
36 for(int i=2*l+k-x-1;i<=2*r+k-x-1;i=tmp){
37 tmp=nex[i]; nex[i]=nex[2*r+k-x-1];
38 if(i>n||ban[i]||dis[i]>=0) continue;
39 dis[i]=dis[x]+1; q.push(i);
40 }
41 q.pop();
42 }
43 }
44
45 signed main(){
46 n=read(); k=read(); m=read(); s=read();
47 for(int i=1;i<=m;i++) ban[read()]=1;
48 bfs();
49 for(int i=1;i<=n;i++) write(dis[i],' ');
50 return 0;
51 }
T1
T2 Silhouette
首先每一行与每一列都有交点,所以排序不影响方案数。于是先将$a,b$排序。如果$a_{max} \neq b_{max}$则无解。
考虑从大到小枚举$a,b$的值$s$,考虑$min(a_i,b_j)=s$的情况,那么每次考虑的位置会构成一个$L$形或矩形。而矩形又可以看作特殊的$L$。
对于$s_{max}$,考虑范围是右上角的矩形。考虑容斥,设$f_i$为矩形中至少$i$行不合法的方案数,令矩形$a$行$b$列,则有
$f[i]=C_a^i\times (S^i\times ((S+1)^{a-i}-S^{a-i}))^b$。
答案即为$\sum_{i=0}^a (-1)^i \times f_i$。
再考虑普遍情况。考虑如下图形
其中红色部分已满足行列要求。因此蓝色部分不能不满足行要求,绿色部分不能不满足列要求。
可以将蓝橙绿分为蓝橙和绿两部分分别计算。蓝橙部分类似特殊情况,但只有橙部分可能不合法。此后绿部分行列要求已被橙红两块满足,随便选即可。
令$f_i$为$a$中有至少$i$行不合法,有
$f[i]=C_a^i\times (S^i\times ((S+1)^{a+c-i}-S^{a+c-i}))^b\times (S^i\times (S+1)^{a-i})^d$
一样容斥,最后累乘即可。
$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=1e5+5,p=1e9+7;
26 int n,ans,ext,tma,tmb,pra,prb,a[NN],b[NN],s[NN<<1];
27
28 namespace math{
29 int fac[NN],inv[NN];
30 inline int C(int x,int y){
31 if(x<y) return 0;
32 return fac[x]*inv[y]%p*inv[x-y]%p;
33 }
34 inline int qpow(int x,int y){
35 int res=1;
36 while(y){
37 if(y&1) res=res*x%p;
38 x=x*x%p;
39 y>>=1;
40 }
41 return res;
42 }
43 void init(){
44 fac[0]=inv[0]=1;
45 for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%p;
46 inv[n]=qpow(fac[n],p-2);
47 for(int i=n-1;i;i--) inv[i]=inv[i+1]*(i+1)%p;
48 }
49 } using namespace math;
50
51 inline int calc(int mia,int mib,int upa,int upb,int num){
52 int res=0;
53 for(int i=0;i<=mia;i++){
54 int now=C(mia,i)*qpow(qpow(num,i)*(qpow(num+1,mia+upa-i)-qpow(num,mia+upa-i)+p)%p,mib)%p;
55 now=now*qpow(qpow(num,i)*qpow(num+1,mia-i)%p,upb)%p;
56 if(i&1) now=p-now;
57 (res+=now)%=p;
58 }
59 return res;
60 }
61
62 signed main(){
63 n=read(); init(); ans=1;
64 for(int i=1;i<=n;i++) s[i] =a[i]=read();
65 for(int i=1;i<=n;i++) s[i+n]=b[i]=read();
66 sort(a+1,a+n+1); sort(b+1,b+n+1); sort(s+1,s+2*n+1);
67 ext=unique(s+1,s+2*n+1)-s-1;
68 if(a[n]!=b[n]){ puts("0"); return 0; }
69 pra=prb=n+1; tma=tmb=n;
70 for(int i=ext;i;i--){
71 while(a[tma-1]==s[i]&&tma-1) --tma;
72 while(b[tmb-1]==s[i]&&tmb-1) --tmb;
73 (ans*=calc(pra-tma,prb-tmb,n-pra+1,n-prb+1,s[i]))%=p;
74 pra=tma; prb=tmb;
75 }
76 write(ans,'\n');
77 return 0;
78 }
T2
T3 Seat
发现每次选座位区间长度的可重集是固定的,可以按照最大距离分层,然后进行$DP$。分奇偶讨论,
多理解几节课就差不多了..
不放代码了(几乎一样还放个锤子
2021.9.7考试总结[NOIP模拟49]的更多相关文章
- 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.21考试总结[NOIP模拟58]
T1 lesson5! 开始以为是个无向图,直接不懂,跳去T2了. 之后有看了一眼发现可暴力,于是有了\(80pts\). 发现这个图是有拓扑序的,于是可以用拓扑排序找最长路径.先找原图内在最长路径上 ...
- 2021.9.20考试总结[NOIP模拟57]
(换个编辑器代码就SB地不自动折叠了.. T1 2A 考察快读的写法. $code:$ T1 #include<bits/stdc++.h> #define scanf SCANF=sca ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
- 2021.9.12考试总结[NOIP模拟51]
T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...
随机推荐
- HTTP快速入门
一.tomcat端口号设置为80,访问时候可以不加:http协议1.1版本可以复用连接,请求结束后会稍微等会: 二. 表单,get方式提交: 三.user-agent告诉服务器是哪个浏览器,代码中解决 ...
- Mybatis-基本学习(下)
四,MAP的使用--超常用 思考:多表连接查询怎么做?---MAP的好处!---返回List
- 使用Apache poi来编写导出excel的工具类
在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...
- 搭建GIT仓库
- ecshop调用指定栏目下的文章的方法
打开 index.php 添加 fun函数一个,需放在<php与?>中间. /** * 获得指定栏目的文章列表. * @param int $cid 栏目ID * @param int $ ...
- 传说中 VUE 的“语法糖”到底是啥?
一.什么是语法糖? 语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是计算机语言中添加的一种语法,在不影响功能的情况下,添加某种简单的语 ...
- 3. Go并发编程--数据竞争
目录 1.前言 2.数据竞争 2.1 示例一 2.1.1 测试 2.1.2 data race 检测 2.1.3 data race 配置 2.2 循环中使用goroutine引用临时变量 2.3 引 ...
- kettle 多表全删全插同步数据 两种方案
背景: 接到上级指示,要从外网某库把数据全部导入到内网,数据每天更新一次即可,大约几百万条数据,两个库结构一样,mysql的,两台数据库所在服务器都是windows server的,写个java接口实 ...
- T-SQL——数据透视和逆透视
目录 0. 测试数据集及说明 0.1 准备测试数据 0.2 对一维表和二维表理解 1. 透视转换 1.1 使用标准SQL进行数据透视 1.2 使用T-SQL中pivot函数进行数据透视 1.3 关于 ...
- gcc、g++、gdb安装
Windows安装 有闲工夫在Windows上安装g++/gcc/gdb,还不如装个虚拟机安装Linux,在Linux上安装 但是我还是要讲的 首先,需要安装MinGW,MinGW,是Minimali ...