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++. ...
随机推荐
- C语言实现有限状态机
1. 什么是有限状态机 有限状态机在百度百科上的解释为: 有限状态自动机(FSM "finite state machine" 或者FSA "finite state a ...
- Java大数操作
Java的Math包中提供了两个类用于对大数进行操作: BigInteger类,用于大整数的操作 BigDecimal类,用于大的小数操作 BigInteger类 Java中的基本类型中,表示整数的有 ...
- python爬取疫情数据存入MySQL数据库
import requests from bs4 import BeautifulSoup import json import time from pymysql import * def mes( ...
- Spring框架(第一天)
一. 引言 a) 什么是Spring框架?(spring官网:www.springsource.org) 3.x 不提供第三发依赖jar 目前已经到了5.x版本. Spring轻量级(代码入侵性小) ...
- PHP中使用if的时候为什么建议将常量放在前面?
在某些框架或者高手写的代码中,我们会发现有不少人喜欢在进行条件判断的时候将常量写在前面,比如: if(1 == $a){ echo 111; } 这样做有什么好处呢?我们假设一个不小心的粗心大意,少写 ...
- PHP设计模式之中介者模式
上回说道,我们在外打工的经常会和一类人有很深的接触,那就是房产中介.大学毕业后马上就能在喜欢的城市买到房子的X二代不在我们的考虑范围内哈.既然需要长期的租房,那么因为工作或者生活的变动,不可避免的一两 ...
- PHP怎么遍历对象?
对于php来说,foreach是非常方便好用的一个语法,几乎对于每一个PHPer它都是日常接触最多的请求之一.那么对象是否能通过foreach来遍历呢? 答案是肯定的,但是有个条件,那就是对象的遍历只 ...
- Linux档案权限篇(一)
查看档案的属性"ls-al". 即列出所有的档案的详细权限与属性(包括隐藏文件) 权限 第一个字符代表档案的类型: d:代表是目录 -:代表是文件 l:代表是连接文件(相当于win ...
- javascript 标签轮播
html <div id="banner-switch"> <!-- 切换内容 --> <div class="notice-content ...
- javascript 分时函数 分批次添加DOM节点 timeChunk
创建1000个webqq的qq好友列表, 一个好友用一个节点来表示 * timeChunk var timeChunk = function(a, fn, sz, done) { var obj, t ...