链接

A.中国式家长2

模拟题,毫无坑点

#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int>pii;
inline int read(){char c,p=0;int w;
while(isspace(c=getchar()));if(c=='-')p=1,c=getchar();
for(w=c&15;isdigit(c=getchar());w=w*10+(c&15));return p?-w:w;
}
template<typename T,typename U>inline char smin(T&x,const U&y){return x>y?x=y,1:0;}
template<typename T,typename U>inline char smax(T&x,const U&y){return x<y?x=y,1:0;}
const int N=202,dx[]={-1,-1,-1,0,1,1,1,0},dy[]={-1,0,1,1,1,0,-1,-1};
int n,m,k,now,nowc,a[N][N];
bool vis[N][N],exi[N][N];
int main(){
n=read(),m=read(),k=read();
REP(i,1,n)REP(j,1,m)a[i][j]=read();
REP(i,1,n)REP(j,1,m)exi[i][j]=read();
int T=read();now=k;
while(T--){
int x=read(),y=read();
if(exi[x][y]&&!vis[x][y]&&x>0&&y>0&&x<=n&&y<=m){
if(a[x][y]>0)now=min(k,now+a[x][y]);
else if(now<10)return puts("-1 -1"),0;
else nowc+=10,now-=10;
vis[x][y]=1;
REP(i,0,7){
int tx=dx[i]+x,ty=dy[i]+y;
if(tx<1||tx>n||ty<1||ty>m)continue;
exi[tx][ty]=1;
}
}else return puts("-1 -1"),0;
}
printf("%d %d\n",now,nowc);
return 0;
}

B.随机生成树

发现要给每个节点找一个父亲,如果父亲和他颜色相同,对答案无贡献,如果不同,对答案贡献加1

因此尽量找颜色不同的即可

#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
using namespace std;
inline int read(){char c,p=0;int w;
while(isspace(c=getchar()));if(c=='-')p=1,c=getchar();
for(w=c&15;isdigit(c=getchar());w=w*10+(c&15));return p?-w:w;
}
const int N=5e5+7;
int n,c[N],vis[N],ans=1;
int main(){
n=read();
REP(i,1,n)c[i]=read();
REP(i,1,n)for(int j=i+i;j<=n;j+=i)if(!vis[j]&&c[i]!=c[j])++ans,vis[j]=1;
cout<<ans;
return 0;
}

C.洞穴

先看50分的,\(l \le 100\)

设 \(f[k][i]\) 表示走了 \(k\) 步 \(i\) 能到达的集合(这个集合可以用bitset表示),直接刷表转移即可

bitset<N> g[N],f[N][N];
int main(){
n=read(),m=read();
while(m--){int x=read(),y=read();f[1][x][y]=1,g[x][y]=1;}
REP(k,1,99)REP(i,1,n)REP(j,1,n)if(f[k][i][j])f[k+1][i]|=g[j];
int q=read();
while(q--){
int l=read(),x=read(),y=read();
if(l<=100)puts(f[l][x][y]?"YES":"NO");
}
return 0;
}

观察100分数据范围,发现 \(q\le 1000,n\le 100,l\le 10^9\) ,那么 \(n^2q\le10^7\) 考虑把 \(l\) 分成3段,比如\(233333333\),分为 \(233,333,333\) 设 \(f[d][k][i]\) 表示 \(i\) 走 \(k\times 1000^d\) 步能到达的集合,还像刚刚那样预处理,处理询问时,枚举两个中转点 \(u,v\) 判断即可。复杂度 \(O(\frac{1000n^3}{64}+n^2q)\)

const int N=105;
int n,m;
bitset<N> g[N],f[3][1005][N];
int main(){
n=read(),m=read();
while(m--){int x=read(),y=read();f[0][1][x][y]=g[x][y]=1;}
REP(i,1,n)f[0][0][i][i]=f[1][0][i][i]=f[2][0][i][i]=1;
REP(k,1,999)REP(i,1,n)REP(j,1,n)if(f[0][k][i][j])f[0][k+1][i]|=g[j];
REP(i,1,n)f[1][1][i]=f[0][1000][i];
REP(k,1,999)REP(i,1,n)REP(j,1,n)if(f[1][k][i][j])f[1][k+1][i]|=f[0][1000][j];
REP(i,1,n)f[2][1][i]=f[1][1000][i];
REP(k,1,999)REP(i,1,n)REP(j,1,n)if(f[2][k][i][j])f[2][k+1][i]|=f[1][1000][j];
int q=read();
while(q--){
int l=read(),x=read(),y=read(),ans=0;
if(l<=1000)puts(f[0][l][x][y]?"YES":"NO");
else if(l<=1000000){
int t1=l/1000,t2=l%1000;
REP(i,1,n)if(f[1][t1][x][i]&&f[0][t2][i][y]){
ans=1;break;
}
puts(ans?"YES":"NO");
}else{
int t1=l/1000000,t2=(l/1000)%1000,t3=l%1000;
REP(i,1,n)if(f[2][t1][x][i]){
REP(j,1,n)if(f[1][t2][i][j]&&f[0][t3][j][y]){
ans=1;break;
}
if(ans)break;
}
puts(ans?"YES":"NO");
}
}
return 0;
}

那么是不是这题就完了呢?如果 \(l\le 10^{18}\) 呢?这做法就GG了。

发现,这个东西本质上就是矩阵乘法,我们预处理出矩阵的log次方,询问时直接矩阵乘法即可

该问题还可以改为求经过k条边的方案数、概率期望、经过k条边的最短路等等

复杂度 \(O(\frac{n^3log10^9+nqlog10^9}{64})\)

const int N=105,L=__lg(1000000000);
bitset<N>f[33][N],tmp,ans;
int main(){
int n=read(),m=read();
while(m--){int x=read(),y=read();f[0][x][y]=1;}
REP(t,0,L)REP(i,1,n)REP(j,1,n)if(f[t][i][j])f[t+1][i]|=f[t][j];
int q=read();
while(q--){
int l=read(),x=read(),y=read();
ans.reset();ans[x]=1;
REP(i,0,L){
if((l>>i)==0)break;
if(l>>i&1){
tmp=ans;ans.reset();
REP(j,1,n)if(tmp[j])ans|=f[i][j];
}
}
io.putstr(ans[y]?"YES\n":"NO\n");
}
return 0;
}

[NowCoder]牛客网NOIP赛前集训营-提高组(第七场)的更多相关文章

  1. 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告

    目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...

  2. 牛客网NOIP赛前集训营-提高组(第二场)A 方差

    链接:https://www.nowcoder.com/acm/contest/173/A来源:牛客网 题目描述 一个长度为 m 的序列 b[1...m] ,我们定义它的方差为 ,其中  表示序列的平 ...

  3. [牛客网NOIP赛前集训营-提高组(第一场)]C.保护

    链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...

  4. 牛客网NOIP赛前集训营-提高组(第一场)

    牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...

  5. Nowcoder牛客网NOIP赛前集训营-提高组(第六场)

    A 拓扑排序+倍增哈希 或者 拓扑排序对于每个点计一个rank,每个点优先选取rank靠前的最小边权点 每次依然按照rank排序更新rank #include<bits/stdc++.h> ...

  6. [NowCoder]牛客网NOIP赛前集训营-提高组(第六场)题解

    A.最长路 题意:给定有向图,每条边有个字符\([0,10^9]\),求每个点最长路字典序最小的方案.\(N,M\le 10^6\) 建反图跑拓扑排序,显然入过队的点都有最长路,考虑如何判断字典序大小 ...

  7. 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场

    第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...

  8. 牛客网NOIP赛前集训营-提高组(第一场)B 数数字

    数数字 思路: 数位dp 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...

  9. 牛客网NOIP赛前集训营-提高组(第一场)A 中位数

    中位数 思路: 二分答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...

随机推荐

  1. LeetCode_Construct Binary Tree from Inorder and Postorder Traversal

    一.题目 Construct Binary Tree from Inorder and Postorder Traversal My Submissions Given inorder and pos ...

  2. Windows安装两个mysql数据库步骤

    因为新旧项目数据库版本号差距太大.编码格式不同.引擎也不同,所以仅仅好装两个数据库. 本次安装两个mysql数据库.版本号各自是4.0.18,5.5.36.都是可运行文件直接安装. 本机上之前已经安装 ...

  3. Mac系统下安装ant

    看了一些别人怎么在mac下安装ant,大体都是从官网下载bin文件,然后改动权限,建链接.配path. 须要这么麻烦吗?我认为不须要. 以下一个命令搞定: forlong401:build forlo ...

  4. ASE加、解密

    AES已经变成目前对称加密中最流行算法之一:AES可以使用128.192.和256位密钥,并且用128位分组加密和解密数据. /** * 加密 * * @param content 需要加密的内容 * ...

  5. C++ BigInteger模板

    #include <cstdio> #include <cstring> #include <string> #include <iostream> # ...

  6. 威联通212P 在admin用户密码正确情况下仍然无法登录WEB页面解决办法

    *登录 telnet 执行以下语句: [~] # cp /etc/default_config/passwd /mnt/HDA_ROOT/.config/passwd[~] # cp /etc/def ...

  7. python单元测试-unittest

    python内部自带了一个单元测试的模块,pyUnit也就是我们说的:unittest 1.介绍下unittest的基本使用方法: 1)import unittest 2)定义一个继承自unittes ...

  8. Tensorflow 函数学习笔记

    A: A:## tf.argmax(A, axis).eval() 输出axis维度上最大的数的索引 axis=0:列,axis=1:行 A:## tf.add(a,b)  创建a+b的计算图 A:# ...

  9. 【Codeforces Round #459 (Div. 2) D】MADMAX

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] f[x][y][z][2] 表示第一个人到了点x,第二个人到了点y,当前轮的字母(1..26),当前轮到谁走的情况下,谁赢. 写个记 ...

  10. Top 22 Free Responsive HTML5 Admin & Dashboard Templates 2018

    Top 22 Free Responsive HTML5 Admin & Dashboard Templates 2018 May 18, 2018 Alex Ivanovs Website ...