链接

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. [Recompose] Stream a React Component from an Ajax Request with RxJS

    Loading data using RxJS is simple using Observable.ajax. This lesson shows you how to take the ajax ...

  2. 思科E3200 路由器 DD-WRT 设置花生壳和3322.org动态域名(DDNS)

    花生壳设置(已測试) ddns.oray.com:80 username   aaaa password bbbb 主机名   abc.gicp.net URL       /ph/update?ho ...

  3. windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)

    郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...

  4. 利用netstat和tasklist查看PC的端口占用情况 及80端口被占用

    经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口? 1.Windows平台在windows命令行窗口下执行: E:\oracle\ora92\bin>n ...

  5. Domino服务器SSL的配置录像

    Domino服务器SSL的配置录像 格式:avi, 大小:25M 时长: 6分钟 本文出自 "李晨光原创技术博客" 博客,转载请与作者联系!

  6. hibernate generator id

    以下内容整理自网络 “assigned” 主键由外部程序负责生成,在   save()   之前指定一个.  “hilo” 通过hi/lo   算法实现的主键生成机制,需要额外的数据库表或字段提供高位 ...

  7. codefroces 873 B. Balanced Substring && X73(前缀和思想)

    B. Balanced Substring You are given a string s consisting only of characters 0 and 1. A substring [l ...

  8. 127.0.0.1和localhost和本机IP三者的区别!

    1, 先来说下回送地址(Loopback Address): 回送地址是主机用于向自身发送通信的一个特殊地址(也就是一个特殊的目的地址).可以这么说:同一台主机上的两项服务若使用回送地址而非分配的主机 ...

  9. P2186 小Z的栈函数

    P2186 小Z的栈函数 题目描述 小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作: NUM X:栈顶放入X. POP:抛弃栈顶元素. INV:将栈顶 ...

  10. Android开发系列(十六):【Android小游戏成语连连看】第二篇

    写的晚了,在分工个Z市高中的一个成绩查询的系统,原系统居然是用VB写的,我不得不佩服原本写系统的那位哥们真能耐得住. 明天搭建下SVN就等着先发project款然后開始项目了.想想有工资进账,心里也为 ...