T1 F

解题思路

因为每个点会产生贡献当且仅当它在可以到他的点之前被删除,并且此题遵守期望的线性性。

因此设所有可以到达点 \(i\) 的数量为 \(c_i\) 那么答案就是 \(\sum \frac{1}{c_i}\) 。

缩点+拓扑排序+bitset 可以做到 \(\mathcal{O}(\frac{n^3}{w})\) 直接搜就是 \(\mathcal{O}(n^2)\)

code

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e3+10,mod=998244353;
int n,ans,all,tim,top,sta[N],dfn[N],low[N],bel[N],cnt[N],du[N],can[N];
int tot=1,head[N],ver[N*N],nxt[N*N],fro[N*N];
char ch[N];
bool vis[N];
vector<int> v[N];
void add_edge(int x,int y)
{
ver[++tot]=y; fro[tot]=x;
nxt[tot]=head[x]; head[x]=tot;
}
int power(int x,int y,int p=mod)
{
int temp=1;
while(y)
{
if(y&1) temp=temp*x%mod;
x=x*x%mod; y>>=1;
}
return temp;
}
void tarjan(int x)
{
int temp; vis[x]=true; dfn[x]=low[x]=++tim; sta[++top]=x;
for(int i=head[x];i;i=nxt[i])
{
int to=ver[i];
if(!dfn[to]) tarjan(to),low[x]=min(low[x],low[to]);
else if(vis[to]) low[x]=min(low[x],dfn[to]);
}
if(low[x]!=dfn[x]) return ; all++;
do
{
temp=sta[top--]; vis[temp]=false;
bel[temp]=all; cnt[all]++;
}while(temp!=x);
}
void dfs(int x,int from)
{
vis[x]=true; can[x]+=cnt[from];
for(auto to:v[x]) if(!vis[to]) dfs(to,from);
}
signed main()
{
freopen("f.in","r",stdin); freopen("f.out","w",stdout);
n=read();
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
for(int j=1;j<=n;j++)
if(ch[j]^48)
add_edge(i,j);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=2;i<=tot;i++)
{
int x=fro[i],y=ver[i];
if(bel[x]==bel[y]) continue;
v[bel[x]].push_back(bel[y]); du[bel[y]]++;
}
for(int i=1;i<=all;i++)memset(vis,false,sizeof(vis)),dfs(i,i);
for(int i=1;i<=n;i++) ans=(ans+power(can[bel[i]],mod-2))%mod;
printf("%lld",ans);
return 0;
}

T2 S

解题思路

字符串 DP(KMP)。

设 \(f_{i,j}\) 表示 \(S\) 到 \(i\) 位置,当前匹配到 \(T\) 的位置 \(j\) 。

每次对于删除或者不删除 \(i+1\) 进行转移,如果不删除就不断跳 \(nxt\) 看 \(k+1\) 能否和 \(i+1\) 成功匹配。

转移即可。。

code

#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=8e3+10,INF=0x3f3f3f3f;
int n,m,ans=INF,nxt[N],f[N][N];
char s[N],t[N];
signed main()
{
freopen("s.in","r",stdin); freopen("s.out","w",stdout);
scanf("%s%s",s+1,t+1); n=strlen(s+1); m=strlen(t+1);
for(int i=2,j=0;i<=m;i++)
{
while(j&&t[j+1]!=t[i]) j=nxt[j];
if(t[j+1]==t[i]) j++; nxt[i]=j;
}
memset(f,0x3f,sizeof(f));
f[1][0]=(s[1]==t[1]);
if(s[1]==t[1]) f[1][1]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=min(m-1,i);j++)
{
if(f[i][j]>=INF) continue;
int k=j;
while(k&&s[i+1]!=t[k+1]) k=nxt[k];
if(t[k+1]==s[i+1]) k++;
if(k!=m) f[i+1][k]=min(f[i+1][k],f[i][j]);
f[i+1][j]=min(f[i+1][j],f[i][j]+1);
}
for(int i=0;i<=m;i++) ans=min(ans,f[n][i]);
printf("%d",ans);
return 0;
}

T3 Y

解题思路

暴搜竟然有 70pts !!(尽管我没打出来),BFS 当前空格的位置,开一个四位数组记录空格以及指定棋子所在位置是否经过过。

枚举空格的移动,当他移动到指定棋子的位置时两者位置互换,于是我们得到了一份 70pts 的代码(\(code\))

然后发现有许多状态时重复的,于是我们考虑初始化。

枚举每一个点时指定棋子的位置,在枚举周围的点是空格的情况,BFS出这几个格子之间不经过指定格子到达别的格子的距离,建边。

对于每一个询问跑一边最短路 复杂度 \(\mathcal{O}(n^2m^2+qnmlog(nm))\)

code

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"
#define left Left
#define right Right
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=40,M=4e3+10,INF=0x3f3f3f3f3f3f3f3f;
const int up=0,down=1,left=2,right=3;
int n,m,qus,ans,dis[N][N],dist[M];
int d1[10]={-1,1,0,0};
int d2[10]={0,0,-1,1};
int tot=1,head[M],ver[M],nxt[M],edge[M];
bool can[N][N],vis[M];
void add_edge(int x,int y,int val)
{
ver[++tot]=y; edge[tot]=val;
nxt[tot]=head[x]; head[x]=tot;
}
int id(int x,int y,int sta){return ((x-1)*m+y)*4+sta;}
void bfs(int sx,int sy,int tx,int ty,int sta)
{
queue<pair<int,int> > q; memset(dis,0,sizeof(dis));
q.push(make_pair(sx,sy)); dis[sx][sy]=1;
while(!q.empty())
{
pair<int,int> temp=q.front();q.pop();
int x=temp.first,y=temp.second;
for(int i=0;i<=3;i++)
{
int nx=x+d1[i],ny=y+d2[i];
if(!can[nx][ny]||dis[nx][ny]||(nx==tx&&ny==ty)) continue;
dis[nx][ny]=dis[x][y]+1; q.push(make_pair(nx,ny));
}
}
if(sta==4) return ;
for(int i=0;i<=3;i++)
{
int x=tx+d1[i],y=ty+d2[i];
if(!dis[x][y]||(x==sx&&y==sy)) continue;
add_edge(id(tx,ty,sta),id(tx,ty,i),dis[x][y]-1);
}
add_edge(id(tx,ty,sta),id(sx,sy,sta^1),1);
}
void solve(int sx,int sy)
{
memset(dist,0x3f,sizeof(dist)); memset(vis,false,sizeof(vis));
priority_queue<pair<int,int> > q;
for(int i=0;i<=3;i++)
{
int x=sx+d1[i],y=sy+d2[i];
if(!dis[x][y]) continue;
dist[id(sx,sy,i)]=dis[x][y]-1;
q.push(make_pair(-dist[id(sx,sy,i)],id(sx,sy,i)));
}
while(!q.empty())
{
int x=q.top().second; q.pop();
if(vis[x]) continue; vis[x]=true;
for(int i=head[x];i;i=nxt[i])
{
int to=ver[i],val=edge[i];
if(dist[to]<=dist[x]+val) continue;
dist[to]=dist[x]+val; q.push(make_pair(-dist[to],to));
}
}
}
signed main()
{
freopen("y.in","r",stdin); freopen("y.out","w",stdout);
n=read(); m=read(); qus=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
can[i][j]=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(!can[i][j]) continue;
if(can[i-1][j]) bfs(i-1,j,i,j,up);
if(can[i+1][j]) bfs(i+1,j,i,j,down);
if(can[i][j-1]) bfs(i,j-1,i,j,left);
if(can[i][j+1]) bfs(i,j+1,i,j,right);
}
while(qus--)
{
int basx,basy,sx,sy,tx,ty;
basx=read(); basy=read(); sx=read(); sy=read(); tx=read(); ty=read();
if(sx==tx&&sy==ty){printf("0\n");continue;}
ans=INF; bfs(basx,basy,sx,sy,4); solve(sx,sy);
for(int i=0;i<=3;i++) ans=min(ans,dist[id(tx,ty,i)]);
printf("%lld\n",ans>=INF?-1ll:ans);
}
return 0;
}

T4 O

大坑未补

NOIP模拟79的更多相关文章

  1. Noip模拟79 2021.10.17(题目名字一样)

    T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...

  2. NOIP 模拟 $79\; \rm y$

    题解 \(by\;zj\varphi\) NOIP2013 的原题 最简单的思路就是一个 bfs,可以拿到 \(70pts\) 75pts #include<bits/stdc++.h> ...

  3. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  4. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  5. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  6. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  7. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  8. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  9. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

随机推荐

  1. Spring笔记(3)

    一.JDBC Template基本使用 1.开发步骤 1.1直接使用template 导入spring-jdbc和spring-tx坐标 <!-- JDBC--> <dependen ...

  2. Linux系统的vsftpd服务配置

    概述: FTP ( 文件传输协议 ) 是 INTERNET 上仍常用的最老的网络协议之一 , 它为系统提供了通过网络与远程服务器进行传输的简单方法FTP 服务器包的名称为 VSFTPD , 它代表 V ...

  3. java多线程 synchronized 与lock锁 实现线程安全

    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们模 ...

  4. vscode安装go插件失败

    解决办法:使用golang代理,在环境变量中添加两个新变量: 详情参考vscode中为golang开发环境配置代理goproxy 之后便有一部分可以安装成功

  5. 阶段总结-Java基础-超进阶

    Gitee项目地址:https://gitee.com/zc10010/java_interview_guide/tree/master/知识点话术 项目叫话术,但是我觉得作为知识点学习是挺不错的. ...

  6. python库--pandas--部分实例

    >>> pd.pivot( index=np.array(['one', 'one', 'one', 'two', 'two', 'two']), columns=np.array( ...

  7. 谈谈Linux系统启动流程

    @ 目录 大体流程分析 一.BIOS 1.1 BIOS简介 1.2 POST 二.BootLoader (GRUB) 2.1 What's MBR? 2.2 What's GRUB? 2.3 boot ...

  8. 日期SQL 脚本

    一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)本周的星期一     SELECT DATEADD(wk, DATEDIFF(wk,0,g ...

  9. 如何在线安全清理mysql慢日志

    部门mysql数据库的服务器磁盘空间快满了,查看了下磁盘的慢日志,发现占了50多个g,百度了资料后删除成功,现在和大家分享下我清理的过程,或许有更好的办法. 1.首先连接进入mysql,查看慢日志的状 ...

  10. Linux系列(15) - man

    简介 查看命令帮助,是个帮助命令 格式 man [选项] 命令 选项 -f:相当于 whatis 命令,查询一个命令执行什么功能,这个命令是什么级别的,并将查询结果打印到终端 -k:相当于 aprop ...