noip模拟79[.]
noip模拟79 solutions
仍然不是很理想,还是忘记算内存了,又炸了
T1 F
期望线性性
AC_code
#include<bits/stdc++.h>
using namespace std;
#define oj
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=1005;
const int mod=998244353;
char s[N][N];
int n;
int ksm(int x,int y){
int ret=1;
while(y){
if(y&1)ret=ret*x%mod;
x=x*x%mod;y>>=1;
}return ret;
}
int to[N*N],nxt[N*N],head[N],rp;
int du[N];
void add_edg(int x,int y){
to[++rp]=y;
du[y]++;
nxt[rp]=head[x];
head[x]=rp;
return ;
}
int bl[N],cbl,siz[N];
int dfn[N],low[N],cnt;
bitset<N> bit[N],U,now[N];
stack<int> q;
int vit[N];
void tarjan(int x){
//cout<<x<<" ";
dfn[x]=low[x]=++cnt;
q.push(x);vit[x]=true;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(!dfn[y]){tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(vit[y])low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
bl[x]=++cbl;
siz[cbl]=1;
while(q.top()!=x){
int t=q.top();q.pop();
bl[t]=cbl;
vit[t]=false;
siz[cbl]++;
}
q.pop();vit[x]=false;
}
return ;
}
bool vis[N][N],via[N];
void dfs(int x){
bit[x].set(x);via[x]=true;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(!via[y])dfs(y);
bit[x]|=bit[y];
}
return ;
}
int sm[N],ans;
signed main(){
#ifdef oj
freopen("f.in","r",stdin);
freopen("f.out","w",stdout);
#endif
scanf("%lld",&n);
fo(i,1,n){
scanf("%s",s[i]+1);
fo(j,1,n)if(s[i][j]=='1')add_edg(i,j);
}
fo(i,1,n)if(!du[i])tarjan(i);
fo(i,1,n)if(!dfn[i])tarjan(i);
//cout<<endl;
//fo(i,1,n)cout<<bl[i]<<" ";cout<<endl;
memset(head,0,sizeof(head));rp=0;
memset(du,0,sizeof(du));
fo(i,1,n){
fo(j,1,n){
if(vis[bl[i]][bl[j]])continue;
if(s[i][j]=='1'){
add_edg(bl[i],bl[j]);
vis[bl[i]][bl[j]]=true;
}
}
}
fo(i,1,cbl)U.set(i);
fo(i,1,cbl)if(!via[i])dfs(i);
fo(i,1,cbl)fo(j,1,cbl){
if(bit[i][j]==1)sm[j]+=siz[i];
}
//fo(i,1,cbl)cout<<siz[i]<<" "<<sm[i]<<endl;
fo(i,1,n)ans=(ans+siz[i]*ksm(sm[i],mod-2))%mod;
printf("%lld",ans);
return 0;
}
T2 S
\(KMP\)自动机板子
AC_code
#include<bits/stdc++.h>
using namespace std;
#define oj
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=8005;
int n,m,ans;
char s[N],t[N];
int nxt[N],tans[N][26];
int f[N][N];
signed main(){
#ifdef oj
freopen("s.in","r",stdin);
freopen("s.out","w",stdout);
#endif
//cout<<((sizeof(now)+sizeof(s)*10)>>20)<<endl;
scanf("%s%s",s+1,t+1);
n=strlen(s+1);
m=strlen(t+1);
if(m>n){printf("0");return 0;}
for(int i=2,j=0;i<=m;i++){
while(j&&t[i]!=t[j+1])j=nxt[j];
if(t[i]==t[j+1])j++;
nxt[i]=j;
}
tans[0][(int)(t[1]-'a')]=1;
fo(i,1,m)fo(j,0,25)tans[i][j]=(t[i+1]-'a'==j?i+1:tans[nxt[i]][j]);
fo(i,0,n)fo(j,0,m)f[i][j]=0x3f3f3f3f;
f[0][0]=0;
fo(i,0,n)fo(j,0,m-1){
if(i<n)f[i+1][j]=min(f[i+1][j],f[i][j]+1);
f[i+1][tans[j][s[i+1]-'a']]=min(f[i+1][tans[j][s[i+1]-'a']],f[i][j]);
}ans=f[n][m-1];
fo(i,0,m-2)ans=min(ans,f[n][i]);
printf("%d",ans);
return 0;
}
T3 Y
仍然不是很好写,我没有写出来
不调了。。
但是有遗憾的是,考场上没有打搜索,亏了
不管是啥题都要搜一搜
AC_code
#include<bits/stdc++.h>
using namespace std;
#define oj
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
const int N=35;
const int Q=505;
const int inf=0x3f3f3f3f;
int n,m,t,ans;
int jz[N][N];
int ex,ey,sx,sy,tx,ty;
int mx[4]={1,0,-1,0};
int my[4]={0,-1,0,1};
int num[N][N][4],ok[N][N][4];
void get_num(){int cnt=0;fo(i,1,n)fo(j,1,m)fo(k,0,3)num[i][j][k]=++cnt;}
void get_ok(){fo(i,1,n)fo(j,1,m)fo(k,0,3)ok[i][j][k]=(i+mx[k]>0&&i+mx[k]<=n&&j+my[k]>0&&j+my[k]<=n&&jz[i+mx[k]][j+my[k]]&&jz[i][j]);}
bool ifok(int x,int y){return (x>0&&x<=n&&y>0&&y<=m&&jz[x][y]);}
struct node{int x,y,sum;node(int a,int b,int c){x=a;y=b;sum=c;}};
bool vis[N][N],via[N*N*4];
int bfs(int ex,int ey,int sx,int sy,int tx,int ty){
queue<node> q;while(!q.empty())q.pop();
memset(vis,false,sizeof(vis));
q.push(node(sx,sy,0));
vis[sx][sy]=true;
while(!q.empty()){
node now=q.front();q.pop();
if(now.x==tx&&now.y==ty)return now.sum;
fo(i,0,3){
int x=now.x+mx[i],y=now.y+my[i];
if(!ifok(x,y))continue;
if(x==ex&&y==ey)continue;
if(vis[x][y])continue;
vis[x][y]=true;
q.push(node(x,y,now.sum+1));
}
}
return inf;
}
int to[N*N*32],nxt[N*N*32],val[N*N*32],head[N*N*4],rp;
void add_edg(int x,int y,int z){
to[++rp]=y;
val[rp]=z;
nxt[rp]=head[x];
head[x]=rp;
}
void pre(){
get_num();get_ok();
fo(i,1,n)fo(j,1,m)fo(k,0,3)fo(l,k+1,3){
if(ok[i][j][k]&&ok[i][j][l]){
int v=bfs(i,j,i+mx[k],j+my[k],i+mx[l],j+my[l]);
if(v==inf)continue;
add_edg(num[i][j][k],num[i][j][l],v);
add_edg(num[i][j][l],num[i][j][k],v);
}
}
fo(i,1,n)fo(j,1,m){
if(ok[i][j][0]&&ok[i+1][j][2]){
add_edg(num[i][j][0],num[i+1][j][2],1);
add_edg(num[i+1][j][2],num[i][j][0],1);
}
}
fo(i,1,n)fo(j,1,m){
if(ok[i][j][3]&&ok[i][j+1][1]){
add_edg(num[i][j][3],num[i][j+1][1],1);
add_edg(num[i][j+1][1],num[i][j][3],1);
}
}
}
int dis[N*N*4];
int jud(){
int ret=inf;
if(!jz[sx][sy]||!jz[tx][ty])return inf;
if(sx==tx&&sy==ty)return 0;
queue<int> q;
memset(via,false,sizeof(via));
memset(dis,0x3f,sizeof(dis));
fo(i,0,3){
if(ifok(sx+mx[i],sy+my[i])){
int v=bfs(sx,sy,ex,ey,sx+mx[i],sy+my[i]);
if(v==inf)continue;
dis[num[sx][sy][i]]=v;
q.push(num[sx][sy][i]);
//cout<<dis[num[sx][sy][i]]<<endl;
via[num[sx][sy][i]]=true;
}
}
while(!q.empty()){
int x=q.front();q.pop();via[x]=false;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(dis[y]>dis[x]+val[i]){
dis[y]=dis[x]+val[i];
if(!via[y])q.push(y),via[y]=true;
}
}
}
fo(i,0,3)ret=min(ret,dis[num[tx][ty][i]]);//cout<<dis[num[tx][ty][i]]<<" ";cout<<endl;
return ret;
}
signed main(){
#ifdef oj
freopen("y.in","r",stdin);
freopen("y.out","w",stdout);
#endif
scanf("%d%d%d",&n,&m,&t);
fo(i,1,n)fo(j,1,m)scanf("%d",&jz[i][j]);
pre();fo(i,1,t){
//cout<<"fuck"<<endl;
scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
ans=jud();printf("%d\n",ans==inf?-1:ans);
}
return 0;
}
T4 O
拉格朗日差值咕咕咕
QQ:2953174821