Noip模拟79 2021.10.17(题目名字一样)
T1 F
缩点缩成个$DAG$,然后根据每个点的度数计算期望值

1 #include<cstdio>
2 #include<cstring>
3 #include<vector>
4 #include<iostream>
5 #include<algorithm>
6 #define int long long
7 using namespace std;
8 namespace AE86{
9 #define fuck cout<<"fuck"<<endl
10 #define out(x) cout<<#x<<"="<<x<<endl
11 inline int read(){
12 int x=0,f=1;char ch=getchar();
13 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
14 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
15 }inline void write(int x,char opt='\n'){
16 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
17 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
18 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
19 }using namespace AE86;
20 const int NN=1005,mod=998244353;
21 int n,ans,deg[NN];char s[NN]; bool vis[NN];
22 struct SNOW{int to,next;}e[1000005]; int head[NN],rp;
23 inline void add(int x,int y){e[++rp]=(SNOW){y,head[x]};head[x]=rp;}
24 inline void dfs(int x){
25 if(vis[x])return;vis[x]=1;++deg[x];
26 for(int i=head[x];i;i=e[i].next) dfs(e[i].to);
27 }
28 inline int qmo(int a,int b,int ans=1){
29 int c=mod;for(;b;b>>=1,a=a*a%c)if(b&1)ans=ans*a%c;
30 return ans;
31 }
32 namespace WSN{
33 inline short main(){
34 freopen("f.in","r",stdin);freopen("f.out","w",stdout);
35 n=read();
36 for(int i=1;i<=n;i++){ scanf("%s",s+1);
37 for(int j=1;j<=n;j++) if(s[j]=='1') add(i,j);
38 }for(int i=1;i<=n;i++) memset(vis,0,sizeof(vis)),dfs(i);
39 for(int i=1;i<=n;i++) ans=(ans+qmo(deg[i],mod-2))%mod;
40 write(ans);
41 return 0;
42 }
43 }
44 signed main(){return WSN::main();}
T2 S
发现每次考试的$T2$就是考人品的。。。
我爆搜加特判拿了四十,过程艰难,甚至想码一个线段树水分(但失败了)
有的人直接拿哈希扫,扫到一个答案加一个就拿了$90$,非常不服,但是。。。
cty:人家考场上就是敢码,人家就是敢交,你没那个勇气,所以你没那个分
确实是这样啊。。。。(叹~)
所以你知道了,哈希扫一遍加上特判一个测试点就可以做到$21ms$切掉这道大水题,因为数据是随的。。。
好了说暴(正)力(解),
不难想到需要冻龟(其实很难,我就是因为发现写冻龟数组开不下就没往哪里想,果不其然$Arbiter$上测的一车$AC$的内存全炸了)
但是$OJ$上能过,因为算的动态内存,而且是$MiB$
说一下内存的计算,$256MiB!=256MB$,$1MiB=1024\times 1024 B,1MB=1000 \times 1000 B$
好了,我们设$dp[i][j]$表示处理到$S$的$i$位,与$T$匹配了$j$位的最小字符删除数。
其实和$GT$考试很像
然后预处理一个$trans[i]['ch']$表示$S$和$T$匹配了$i$位时,下一个字符是$ch$,那么算上这个字符后$S$和$T$匹配了多少位
然后分情况讨论,
$s[i+1]==t[j+1]$
$dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1)$这是删除一个字符的情况
$dp[i+1][j+1]=min(dp[i+1][j+1],dp[i][j]+1)$这是不删除的情况
$s[i+1]!=t[j+1]$
$dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1)$删除
$dp[i+1][trans[j][s[i+1]]]=min(dp[i+1][trans[j][s[i+1]]],dp[i][j])$不删除
然后你会发现,数组开不下,但是不慌,对了就交就过了,实际上可以滚,但是我不会

1 #include<cstdio>
2 #include<cstring>
3 #include<vector>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 namespace AE86{
8 #define fuck cout<<"fuck"<<endl
9 #define out(x) cout<<#x<<"="<<x<<endl
10 inline int read(){
11 int x=0,f=1;char ch=getchar();
12 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
13 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
14 }inline void write(int x,char opt='\n'){
15 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
16 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
17 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
18 }using namespace AE86;
19 const int NN=8003;
20 int n,m,nxt[NN],trans[NN][27],f[NN][NN];
21 char s[NN],t[NN];
22 inline void kmp(){
23 nxt[1]=0;
24 for(int i=2,j=0;i<=m;++i){
25 while(j&&t[i]!=t[j+1]) j=nxt[j];
26 if(t[i]==t[j+1]) ++j;
27 nxt[i]=j;
28 }
29 for(int i=0;i<m;++i){
30 for(int ch='a';ch<='z';++ch){
31 int j=i;
32 while(j&&t[j+1]!=ch) j=nxt[j];
33 if(t[j+1]==ch) ++j;
34 trans[i][ch-'a']=j;
35 }
36 }
37 }
38 inline void cmin(int &a,int b){a<b?(a=a):(a=b);}
39 namespace WSN{
40 inline short main(){
41 freopen("s.in","r",stdin);freopen("s.out","w",stdout);
42 scanf("%s%s",s+1,t+1);n=strlen(s+1);m=strlen(t+1);kmp();
43 memset(f,0x3f,sizeof(f)); f[1][0]=0;
44 for(int i=1;i<=n;++i){
45 for(int j=0;j<m;++j)if(f[i][j]<1e9){
46 if(s[i]!=t[j+1]){
47 cmin(f[i+1][trans[j][s[i]-'a']],f[i][j]);
48 cmin(f[i+1][j],f[i][j]+1);
49 }else{
50 if(j+1<m) cmin(f[i+1][j+1],f[i][j]);
51 cmin(f[i+1][j],f[i][j]+1);
52 }
53 }
54 }
55 int ans=0x3fffffff;
56 for(int i=0;i<m;++i)ans=min(ans,f[n+1][i]);
57 write(ans);
58 return 0;
59 }
60 }
61 signed main(){return WSN::main();}
T3 Y 他的真名:[Noip2013]华容道
整的挺像$Fate$,不要在意博主二次元就好了
非常神仙的图论题,鉴于是看的别人的详细题解,这里直接给出链接了,不想看我叨叨的看这个更加详细的,戳这里
只说一下比较神仙的地方,就是这道题的图是以每个状态为点,花费为边建图
定义
指定的棋子为$S$
空白的格子为$E$
目标的格子为$T$
设状态$(i,j,k)$表示$S$在$(i,j)$,$E$格子在$(i,j)$的$k$方向,用$0,1,2,3$表示左、右、下、上
然后因为初始图上每个点的状态不变可以预处理,然后每次询问跑最短路。

1 #include<queue>
2 #include<cstdio>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 namespace AE86{
8 #define fuck cout<<"fuck"<<endl
9 #define out(x) cout<<#x<<"="<<x<<endl
10 inline int read(){
11 int x=0,f=1;char ch=getchar();
12 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
13 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
14 }inline void write(int x,char opt='\n'){
15 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
16 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
17 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
18 }using namespace AE86;
19 const int NN=35,MM=200010,inf=1061109567;
20 int n,m,q,g[NN][NN];
21 int dx[5]={-1,1,0,0},
22 dy[5]={0,0,-1,1};
23 struct SNOW{int to,val,next;}e[MM];int head[MM],rp;
24 inline void add(int x,int y,int z){e[++rp]=(SNOW){y,z,head[x]};head[x]=rp;}
25
26 struct node{int x,y;};node E,S,T;
27 queue<node> Q;
28 int dis[NN][NN];
29 inline void bfs(int ex,int ey,int sx,int sy,int pos){
30 memset(dis,0,sizeof(dis));
31 Q.push(node{ex,ey}); dis[ex][ey]=1;
32 while(!Q.empty()){
33 node now=Q.front();Q.pop();
34 for(int i=0;i<4;i++){
35 int X=now.x+dx[i],Y=now.y+dy[i];
36 if(!g[X][Y]||dis[X][Y]||(X==sx&&Y==sy)) continue;
37 dis[X][Y]=dis[now.x][now.y]+1; Q.push(node{X,Y});
38 }
39 }
40 if(pos==4) return;
41 for(int i=0;i<4;i++){
42 int X=sx+dx[i],Y=sy+dy[i];
43 if(!dis[X][Y]||(X==ex&&Y==ey)) continue;
44 add(sx*30*4+sy*4+pos,sx*30*4+sy*4+i,dis[X][Y]-1);
45 }
46 add(sx*30*4+sy*4+pos,ex*30*4+ey*4+(pos^1),1);
47 }
48 int dit[MM];
49 queue<int> qaq;
50 bool vis[MM];
51 inline void spfa(int sx,int sy){
52 memset(dit,0x3f,sizeof(dit));
53 memset(vis,0,sizeof(vis));
54 for(int i=0;i<4;i++){
55 if(!dis[sx+dx[i]][sy+dy[i]]) continue;
56 int sta=sx*30*4+sy*4+i;
57 qaq.push(sta);vis[sta]=true;dit[sta]=dis[sx+dx[i]][sy+dy[i]]-1;
58 }
59 while(!qaq.empty()){
60 int x=qaq.front(); qaq.pop(); vis[x]=false;
61 for(int i=head[x];i;i=e[i].next){
62 int y=e[i].to;
63 if(dit[y]>dit[x]+e[i].val){
64 dit[y]=dit[x]+e[i].val;
65 if(!vis[y]) vis[y]=true,qaq.push(y);
66 }
67 }
68 }
69 }
70 #define wsn
71 // #define mzs
72 namespace WSN{
73 inline short main(){
74 #ifdef mzs
75 freopen("in.in","r",stdin);
76 #endif
77 #ifdef wsn
78 freopen("y.in","r",stdin); freopen("y.out","w",stdout);
79 #endif
80 n=read(); m=read(); q=read();
81 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) g[i][j]=read();
82 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
83 if(g[i][j]) for(int k=0;k<4;k++)
84 if(g[i+dx[k]][j+dy[k]]) bfs(i+dx[k],j+dy[k],i,j,k);
85 while(q--){
86 E.x=read();E.y=read();S.x=read();S.y=read();T.x=read();T.y=read();
87 if(S.x==T.x&&S.y==T.y){puts("0");continue;}
88 bfs(E.x,E.y,S.x,S.y,4);spfa(S.x,S.y); int ans=inf;
89 for(int i=0;i<4;i++) ans=min(ans,dit[T.x*30*4+T.y*4+i]);
90 if(ans==inf) puts("-1");else write(ans);
91 }
92 return 0;
93 }
94 }
95 signed main(){return WSN::main();}
T4 O
好吧,见过拉格朗日插值,没见过拉个朗日插值,所以咕咕咕

蒟蒻刚学会扫描线。。。
Noip模拟79 2021.10.17(题目名字一样)的更多相关文章
- Noip模拟76 2021.10.14
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...
- Noip模拟70 2021.10.6
T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
- Noip模拟83 2021.10.26
T1 树上的数 有手就能在衡中$OJ$上过,但是$WaitingCoders$不行,就是这样 必须使用$O(n)$算法加上大力卡常,思路就是找子树内没更新的更新,更新过了直接$return$ 1 #i ...
- Noip模拟75 2021.10.12
T1 如何优雅的送分 他说是送分题,我就刚,没刚出来,想到莫比乌斯容斥后就都没推出来 好吧还是不能被恶心的题目,挑衅的语言打乱做题节奏 于是这一场也就没了.... $F(i)$表示$i$的不同质因子集 ...
- Noip模拟74 2021.10.11
T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样 ...
- Noip模拟71 2021.10.7
T1 签到题 结论题,找到规律就会做 规律是每个点的度数$\mod$颜色种数,如果不是$0$则贡献一个答案 1 #include<bits/stdc++.h> 2 #define int ...
- Noip模拟18 2021.7.17 (文化课专场)
T1 导弹袭击(数学) 显然,我们要找到最优的A,B使得一组a,b优于其他组那么可以列出: $\frac{A}{a_i}+\frac{B}{b_i}<\frac{A}{a_j}+\frac{B} ...
- Noip模拟81 2021.10.20
T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...
随机推荐
- CSS滤镜让图片模糊(毛玻璃效果)
CSS代码: .blur { filter: url(blur.svg#blur); /* FireFox, Chrome, Opera */ -webkit-filter: blur(10px); ...
- 地址栏url中去掉所有参数
1.地址栏url中去掉所有参数,这个是纯前端解决,很多时候页面跳转时候会选择在url后面带参数过去,(使用?&),方便传也方便取,但是我们要做的是不要让页面的一些请求参数暴露在外面 正常项目工 ...
- Optional容器类
一.Optional 容器类:用于尽量避免空指针异常 方法 /* * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 O ...
- java.net.NoRouteToHostException: Cannot assign requested address
今天压力测试时, 刚开始出现了很多异常, 都是 java.net.NoRouteToHostException: Cannot assign requested address. 经网上查资料, 是 ...
- Spring系列-SpringBase+IOC
Spring 一.前言 Thinking is more important than learning 本文主要讲述spring 以及它的 IOC原理 代码地址:https://gitee.com/ ...
- minix3使用轻快入门
minix3是一款迷你的unix作业系统,但又不在at&t代码的基础上构建.当年开发这款作业系统的作者仅仅是拿来自用,给学生上课使用的. 如果你已经安装了minix3,你还需要安装openss ...
- 【Python学习】print语句
一.print 可以向屏幕上输出信息,print 后面一个空格再加上''中间放入要输出的内容. 二.print可以用逗号分隔语句,但是每有一个逗号就会出来一个空格. 1 >>> pr ...
- python类、对象
python类.对象 学习完本篇,你将会深入掌握 什么是类,对象 了解类和对象之间的关系 能独立创建一个People(人类),属性有姓名.性别.年龄.提供一个有参的构造方法,编写一个show方法,输出 ...
- 学习PHP中的国际化功能来查看货币及日期信息
做为一门在世界范围内广泛使用的编程语言,国际化能力往往是衡量一个编程语言是否能够大范围流行的重要内容.特别是对于 PHP 这种以 Web 页面编程为主战场的语言来说,国际化能力更是重中之重.在 PHP ...
- typora+picgo+gitee 图片无法加载问题
typora+picgo+gitee 图片无法加载问题 待解决