就是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介绍)的更多相关文章

  1. 牛客网提高组模拟赛第七场 T2 随机生成树

    其实看懂题就很水啦qwq,就是求\(1-N\)的约数啦. 暴力求的话时间复杂度是\(O(NlogN)\)的,其实正解是枚举每个数的倍数......这样的时间复杂度是\(\frac{N}{1}+\fra ...

  2. nowcoder(牛客网)提高组模拟赛第四场 解题报告

    T1 动态点分治 就是模拟..... 但是没有过!! 看了题解之后发现.... 坑点:有可能 \(x<=r\),但是

  3. 牛客网提高组模拟赛第五场 T1同余方程(异或)(位运算)

    区间不好做,但是我们可以转化成前缀来做.转化为前缀之后之后就是二维前缀和. 但是我还是不怎么会做.所以只能去看吉老师的题解 (确定写的那么简单真的是题解???). 我们要求模一个数余0,就等于找它的倍 ...

  4. nowcoder(牛客网)提高组模拟赛第一场 解题报告

    T1 中位数(二分) 这个题是一个二分(听说是上周atcoder beginner contest的D题???) 我们可以开一个数组b存a,sort然后二分b进行check(从后往前直接遍历check ...

  5. nowcoder(牛客网)普及组模拟赛第一场 解题报告

    蒟蒻我可能考了一场假试 T1 绩点 这题没什么好说的,应该是只要会语言的就会做. T2 巨大的棋盘 一个模拟题吧qwq,但是要注意取模的时候先加上n或者m再取模,要不然会错的. #include< ...

  6. 18/9/16牛客网提高组Day2

    牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...

  7. 18/9/9牛客网提高组Day1

    牛客网提高组Day1 T1 中位数 这好像是主席树??听说过,不会啊... 最后只打了个暴力,可能是n2logn? 只过了前30%  qwq #include<algorithm> #in ...

  8. 牛客网 提高组第8周 T1 染色

    染色 链接: https://ac.nowcoder.com/acm/contest/176/A 来源:牛客网 题目描述 \(\tt{fizzydavid}\)和\(\tt{leo}\)有\(n\)个 ...

  9. 牛客网 提高组第8周 T2 推箱子 解题报告

    推箱子 链接: https://ac.nowcoder.com/acm/contest/176/B 来源:牛客网 题目描述 在平面上有\(n\)个箱子,每个箱子都可以看成一个矩形,两条边都和坐标轴平行 ...

随机推荐

  1. UNITY Destroy()和DestroyImadiate()都不会立即释放对象内存

    如题,destroyimadiate是立即将物体从场景hierachy中移除,并标记为 "null",注意 是带引号的null.这是UNITY内部的一个处理技巧.关于这个技巧有很争 ...

  2. url_encode and url_decode in Shell

    之前写过一版 shell下解码url,下面给出另外一个版本 from https://gist.github.com/cdown/1163649 function urlencode() { loca ...

  3. 自定义tag标签的方法

    JSP1.0中可以通过继承TagSupport或者BodyTagSupport来实现自定义的tag处理方法. JSP2.0中也支持另外一种更为简单的自定tag的方法,那就是直接讲JSP代码保存成*.t ...

  4. HashMap、HashTable的区别

    HashMap和HashTable都实现了Map接口,但是要用哪个要分清它们之间的区别. 它们的主要区别:线程安全性.速度 HashMap几乎可以等价于HashTable除了HashMap是非sync ...

  5. go_数组

    go语言中数组是值类型 [10]int 和 [20]int 是不同类型,不能用作参数传递 调用func f(arr [10]int)会拷贝数组 go语言一般不用数组用切片slice package m ...

  6. 推荐一个好用的sql版本控制和美化工具SQLToolbelt

    SQL Toolbelt含Red Gate公司目前出品的所有SQL Server工具和新版本.也就是说,当你使用SQL Server数据库工作时,您可以很方便的获得您所需要的一套强大的工具,包括SQL ...

  7. DSA 算法

    一.简介 DSA算法是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard).它是一种公开密钥算法,用作数字签名. http:// ...

  8. phpmailer配置qq邮箱

    function send_email2($email = '*****@perspectivar.com'){ $this->autoRender = false; date_default_ ...

  9. 在git bash中使用命令行调用tortoisegit提交代码或查看日志

    Tortoisegit commit / show log命令行 TortoiseGitProc.exe /command:commit TortoiseGitProc.exe /command:lo ...

  10. Golang 线程池

    经常会用到协程,但是不能一下开那么多协调,只需要 poolSize 个即可,多了不行.这些个协程在执行完后必须等其完成之后才能进行下一步动作.假定工作方法为 work . package main i ...