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


skyh倾情压行注释(?

发现每次选座位区间长度的可重集是固定的,可以按照最大距离分层,然后进行$DP$。分奇偶讨论,

多理解几节课就差不多了..

不放代码了(几乎一样还放个锤子

2021.9.7考试总结[NOIP模拟49]的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 2021.9.21考试总结[NOIP模拟58]

    T1 lesson5! 开始以为是个无向图,直接不懂,跳去T2了. 之后有看了一眼发现可暴力,于是有了\(80pts\). 发现这个图是有拓扑序的,于是可以用拓扑排序找最长路径.先找原图内在最长路径上 ...

  7. 2021.9.20考试总结[NOIP模拟57]

    (换个编辑器代码就SB地不自动折叠了.. T1 2A 考察快读的写法. $code:$ T1 #include<bits/stdc++.h> #define scanf SCANF=sca ...

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

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

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

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

随机推荐

  1. JS009. 数组去重的多种方法总结与一步步优化

    两层for循环 这种函数的优点是兼容性好比较通用,缺点是时空复杂度都很直观的为O(n2),不利于维护和性能. var array = [1,1,'1','1'] function unique(arr ...

  2. JDK7&JDK9处理异常新特性

    1.JDK7新特性是在 try (定义对象,作用域就是try方法体) 复制一个文件实例: 复制文件的原理: 先从硬盘写出到内存中,创建文件输入流对象 FileInputStream fis; 中间是在 ...

  3. 如何让阿三 Windows 10、11 的恢复分区(Recovery Partition)恢复到 “盖茨” 模式

    如何将 Windows Server 2022 的恢复分区(Recovery Partition)移动到 C 盘之前,恢复 C 盘容量调整功能. 请访问原文链接:https://sysin.org/b ...

  4. Prism+WPF使用DependencyInjection实现AutoMapper的依赖注入功能

    前言 在使用PRISM+WPF开发项目的过程中,需要使用AutoMapper实现对象-对象的映射功能.无奈PRISM没有相关对AutoMapper相关的类库,于是转换一下思想,在nuget 中存在有关 ...

  5. CommonsCollections3 反序列化利用链分析

    InstantiateTransformer commons-collections 3.1 中有 InstantiateTransformer 这么一个类,这个类也实现了 Transformer的t ...

  6. 计算机网络 -- TCP/IP

    画图标准 OSI七层模型 7.应用层 作用:为用户提供软件/接口/界面 interface 协议:OICQ.HTTP.HTTPS.BT/P2P 6.表示层 作用:用于对用户数据进行数据呈现.(数据格式 ...

  7. Uncaught TypeError: upload is not a function at HTMLInputElement.onclick

    js 中标签的id名称不能和方法名一样, <tr> <td><input type="button" id="login" val ...

  8. Zend Studio 配置SVN并导入SVN项目

    php 开发过程中,一个项目比较大的话,就需要很多人共同来完成.那么怎样来管理之间的相互配合,分工等呢??那么SVN这个神器就有用处了.SVN:代码版本管理软件.更多svn详细信息请查阅相关文档,这里 ...

  9. docker network 参数

    一. 格式 docker network COMMAND 二.COMMAND 讲解 2.1 .docker network connect 格式 docker network connect [OPT ...

  10. Python自动化测试发送邮件太麻烦?!一起聊一聊 Python 发送邮件的3种方式

    1. 前言 发送邮件,我们在平时工作中经用到,做为测试人员,在自动化测试中用的也比较多,需要发送邮件给某领导 SMTP是Python默认的邮件模块,可以发送纯文本.富文本.HTML 等格式的邮件 今天 ...