牛客网提高组模拟赛第七场 T3 洞穴(附bitset介绍)



就是DP。
我们可以很简单的想到要枚举中间点,进行边数的转移。
但是因为边长数据范围很大,所以我们考虑log的倍增。
状态设计为\(dp[i][j][k]\),为从节点\(i\)走\(2^k\)步能否走到节点\(j\)。但是我们发现这样不好转移状态(其实是我不太会啊)
正解是状态压缩,但是因为\(n\)有点大,所以这里介绍一个黑科技:\(bitset\)
bitset只能存储0或1,但是较bool来说空间更优,一个元素只占一个bit,而且其中的每个元素都可以被单独访问或者修改——比如说访问s的第一位,直接\(s[1]\)即可。
- bitset的声明:
bitset<10(长度)>s(变量名);
- bitset可以被直接赋值:
s=101;
//存储为0001100101
- bitset的输出:
cout<<s<<endl;
//0001100101
cout<<s.to_ulong()<<endl;
//101
- bitset支持位运算;
- bitset的其他功能支持:(转)
a.size() 返回大小(位数)
a.count() 返回1的个数
a.any() 返回是否有1
a.none() 返回是否没有1
a.set() 全都变成1
a.set(p) 将第p+1位变成1
a.set(p, x) 将第p+1位变成x
a.reset() 全都变成0
a.reset(p) 将第p+1位变成0
a.flip() 全都取反
a.flip(p) 将第p+1位取反
a.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
a.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
a.to_string() 返回它转换为string的结果
之后我们就可以用bitset压位了。
状态设计为\(dp[i][j][k]\),\(i\)为走\(2^i\)个单位长度,\(j\)为出发节点,\(k\)为以\(j\)为出发节点,走\(2^i\)个单位长度是否能够走到其他节点的状态。(1为可以走到)
之后状态转移就是如果\(dp[i][j][k]==1\),那么\(dp[i+1][j]|=dp[i][k]\)。这个是预处理节点与节点之间走多少能够到达的过程。
然后查询时另开一个新的bitset:ans来记录当前能够走到的节点,然后把\(len\)二进制化,显然我们从起点走,把二进制下的\(len\)每走一位能够到达的节点全都记录下来,然后再用它们进行转移就可以了。
代码如下:
#include<iostream>
#include<algorithm>
#include<bitset>
#include<cstdio>
#define MAXN 110
using namespace std;
int n,m,q;
bitset<MAXN>dp[40][MAXN];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
dp[0][x][y]=1;
}
for(int i=0;i<=31;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(dp[i][j][k])
dp[i+1][j]|=dp[i][k];
scanf("%d",&q);
while(q--)
{
int len,from,to;
scanf("%d%d%d",&len,&from,&to);
bitset<MAXN>ans;
ans.reset();
ans[from]=1;
for(int i=0;i<=31;i++)
{
if(len&(1<<i))
{
bitset<MAXN>cur;
cur.reset();
for(int j=1;j<=n;j++)
{
if(ans[j])
cur|=dp[i][j];
}
ans=cur;
}
}
if(ans[to]) printf("YES\n");
else printf("NO\n");
}
return 0;
}
牛客网提高组模拟赛第七场 T3 洞穴(附bitset介绍)的更多相关文章
- 牛客网提高组模拟赛第七场 T2 随机生成树
其实看懂题就很水啦qwq,就是求\(1-N\)的约数啦. 暴力求的话时间复杂度是\(O(NlogN)\)的,其实正解是枚举每个数的倍数......这样的时间复杂度是\(\frac{N}{1}+\fra ...
- nowcoder(牛客网)提高组模拟赛第四场 解题报告
T1 动态点分治 就是模拟..... 但是没有过!! 看了题解之后发现.... 坑点:有可能 \(x<=r\),但是
- 牛客网提高组模拟赛第五场 T1同余方程(异或)(位运算)
区间不好做,但是我们可以转化成前缀来做.转化为前缀之后之后就是二维前缀和. 但是我还是不怎么会做.所以只能去看吉老师的题解 (确定写的那么简单真的是题解???). 我们要求模一个数余0,就等于找它的倍 ...
- nowcoder(牛客网)提高组模拟赛第一场 解题报告
T1 中位数(二分) 这个题是一个二分(听说是上周atcoder beginner contest的D题???) 我们可以开一个数组b存a,sort然后二分b进行check(从后往前直接遍历check ...
- nowcoder(牛客网)普及组模拟赛第一场 解题报告
蒟蒻我可能考了一场假试 T1 绩点 这题没什么好说的,应该是只要会语言的就会做. T2 巨大的棋盘 一个模拟题吧qwq,但是要注意取模的时候先加上n或者m再取模,要不然会错的. #include< ...
- 18/9/16牛客网提高组Day2
牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...
- 18/9/9牛客网提高组Day1
牛客网提高组Day1 T1 中位数 这好像是主席树??听说过,不会啊... 最后只打了个暴力,可能是n2logn? 只过了前30% qwq #include<algorithm> #in ...
- 牛客网 提高组第8周 T1 染色
染色 链接: https://ac.nowcoder.com/acm/contest/176/A 来源:牛客网 题目描述 \(\tt{fizzydavid}\)和\(\tt{leo}\)有\(n\)个 ...
- 牛客网 提高组第8周 T2 推箱子 解题报告
推箱子 链接: https://ac.nowcoder.com/acm/contest/176/B 来源:牛客网 题目描述 在平面上有\(n\)个箱子,每个箱子都可以看成一个矩形,两条边都和坐标轴平行 ...
随机推荐
- mybatis 学习记录1
起因 以前刚学习java三大框架的时候持久层框架我是自学的是hibernate..感觉蛮好用的,so easy..后来大三实习公司用的是jpa(hibernate外包装一层)...再后来工作1年多用的 ...
- 杀死 ps grep 出来的所有进程
ps -ef |grep HouseList_Day |awk
- org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
使用Hibernate 插入List数据时出现了以下异常: SLF4J: The requested version 1.6 by your slf4j binding is not compatib ...
- 什么是web资源????
所谓 web 资源即放在 Internet 网上供外界访问的文件或程序,又根据它们呈现的效果及原理不同,将它们划分为静态资源和动态资源. 1. 什么是静态资源 静态资源是浏览器能够直接打开的,一个 j ...
- Sqlserver2005中的varchar,varchar,char,nchar的比较
C#窗体中的TextBox 的MaxLength:与Nvarchar类似,不论是什么,最多只能为2.我我11我1
- 利用UUID 随机生成8位短号
//获得8位短号 public static String[] chars = new String[] { "a", "b", "c", ...
- jQuery代码在移动端不运行
今天写了个html网页发现在iOS系统上边不运行,于是真机连上Sarfari查看报错,于是乎 其实这是由于iOS的安全策略决定的,不允许加载非https的连接 报错:was not allowed t ...
- php使用curl 实现GET和POST请求(抓取网页,上传文件),支持跨项目和跨服务器
一:curl 函数和参数详解 函数库:1:curl_init 初始化一个curl会话2:curl_close 关闭一个curl会话3:curl_setopt 为一个curl设置会话参数4:curl_e ...
- leetcode array解题思路
Array *532. K-diff Pairs in an Array 方案一:暴力搜索, N平方的时间复杂度,空间复杂度N 数组长度为10000,使用O(N平方)的解法担心TLE,不建议使用,尽管 ...
- Windows ---- mysql 5.7 配置安装
去官网下载mysql 下载地址 https://dev.mysql.com/downloads/mysql/ 根据自己操作系统位数选择相对应的版本 点击Download下载 下载下来后是一 ...