werewolf 狼人

题目链接:luogu P4899

题目大意

给你一个无向图,然后每次要从一个地方走到另外一个地方。
然后你在走的过程中要在一个点转换形态,转换之前你只能走大于等于 L 的点,转换之后你只能走小于等于 R 的点。
然后问你对于每次询问,要你回答能不能走。

思路

首先我们考虑把要走的路分成两段。
在转换之前走的,在转化之后走的。

那我们考虑这么搞,求出转换之前能到的,求出转化之后能从这个地方到终点的(由于是双向边,所以也是从终点能到的)。
然后如果这两个点集有交的话,我们就可以到。

那接着看如何搞,首先不难看出两段其实是同样的道理,你反过来一下就好了。
那就只看转换之前能到的。
那看到只能走大于等于的,那我们考虑这么搞。

用最小生成树的方法,从大到小枚举点,再枚举另一边比它大的边,然后建树,而且让小的作为父亲。
然后你就会发现,xxx 子树内的点,就是你保证走的点大于等于 xxx,而且在 xxx 出发能到的点。

然后你考虑在这道题里面,那你从 xxx 出发,然后要大于等于 lll,那你就可以不断的从 xxx 往上跳,跳到不能跳,也就是如果跳了跳到的位置就 <l<l<l。然后再从那个位置的子树,就是你可以到的点了。

然后问题就变成两个树的两个子树,两个数的点有对应关系,问你这两个子树里面是否有一对对应的点。

那子树嘛,自然就想到是 dfs 序上的一段区间。

那我们可以搞个二维网格,如果一对是 (x,y)(x,y)(x,y),那这个位置就是 111。
然后假设你两个数的两个 dfs 序上区间分别是 [x1,y1],[x2,y2][x1,y1],[x2,y2][x1,y1],[x2,y2],那就是求这个矩阵里面有没有 111。

然后发现每个行或列只会有一个 111,所以我们考虑用主席树来搞。
然后就好啦。

代码

#include<cstdio>
#include<algorithm>using namespace std;const int N = 200001;
const int M = 400001;
const int Q = 200001;struct node {int to, nxt;
}e[M << 1];
int n, m, q, x, y, le[N], KK, l, r;struct ababtree {node ee[N];int lee[N], KKK, fa[N][21], fath[N];int dfn[N], tmp, st[N], ed[N], deg[N];void clean() {for (int i = 1; i <= n; i++) fath[i] = i;}int find(int now) {if (fath[now] == now) return now;return fath[now] = find(fath[now]);}void add(int x, int y) {ee[++KKK] = (node){y, lee[x]}; lee[x] = KKK;}void build(bool op) {//搞最小生成树int kn = 0;if (!op) {for (int i = n; i >= 1; i--) {for (int j = le[i]; j; j = e[j].nxt)if (e[j].to > i) {int x = find(i), y = find(e[j].to);if (x != y) {fath[y] = x; add(x, y);kn++; if (kn == n - 1) return ;}}}}else {for (int i = 1; i <= n; i++) {for (int j = le[i]; j; j = e[j].nxt)if (e[j].to < i) {int x = find(i), y = find(e[j].to);if (x != y) {fath[y] = x; add(x, y);kn++; if (kn == n - 1) return ;}}}}}void dfs(int now, int father) {st[now] = ++tmp; dfn[tmp] = now;fa[now][0] = father;deg[now] = deg[father] + 1;for (int i = lee[now]; i; i = ee[i].nxt)dfs(ee[i].to, now);ed[now] = tmp;}void bz() {for (int i = 1; i <= 20; i++)for (int j = 1; j <= n; j++)fa[j][i] = fa[fa[j][i - 1]][i - 1];}int jmp(int x, int y, bool op) {//跳到临界点if (!op) {for (int i = 20; i >= 0; i--)if (fa[x][i] >= y) x = fa[x][i];}else {for (int i = 20; i >= 0; i--)if (fa[x][i] && fa[x][i] <= y) x = fa[x][i];}return x;}
}A, B;struct zxtree {//主席树int ls[N << 6], rs[N << 6], val[N << 6], tot;int copy(int x) {int y = ++tot;ls[y] = ls[x]; rs[y] = rs[x]; val[y] = val[x];return y;}void up(int now) {val[now] = val[ls[now]] + val[rs[now]];}int insert(int now, int l, int r, int pl, int va) {now = copy(now);if (l == r) {val[now] += va;return now;}int mid = (l + r) >> 1;if (pl <= mid) ls[now] = insert(ls[now], l, mid, pl, va);else rs[now] = insert(rs[now], mid + 1, r, pl, va);up(now);return now;}int query(int now, int l, int r, int L, int R) {if (!now) return 0;if (L <= l && r <= R) return val[now];int mid = (l + r) >> 1, re = 0;if (L <= mid) re += query(ls[now], l, mid, L, R);if (mid < R) re += query(rs[now], mid + 1, r, L, R);return re;}
}T;
int rt[N];void add(int x, int y) {e[++KK] = (node){y, le[x]}; le[x] = KK;e[++KK] = (node){x, le[y]}; le[y] = KK;
}int main() {scanf("%d %d %d", &n, &m, &q);for (int i = 1; i <= m; i++) {scanf("%d %d", &x, &y); x++; y++;add(x, y);}A.clean(); B.clean();A.build(0); B.build(1);A.dfs(1, 0); B.dfs(n, 0);A.bz(); B.bz();for (int i = 1; i <= n; i++) {//对应的位置rt[i] = T.insert(rt[i - 1], 1, n, B.st[A.dfn[i]], 1);}while(q--) {scanf("%d %d %d %d", &x, &y, &l, &r);x++; y++; l++; r++;l = A.jmp(x, l, 0); r = B.jmp(y, r, 1);if (T.query(rt[A.ed[l]], 1, n, B.st[r], B.ed[r]) - T.query(rt[A.st[l] - 1], 1, n, B.st[r], B.ed[r])) printf("1\n");else printf("0\n");}return 0;
}

【luogu P4899】werewolf 狼人(最小生成树)(主席树)相关推荐

  1. LUOGU P4587 [FJOI2016]神秘数(主席树)

    传送门 解题思路 如果区间内没有\(1\),那么答案就为\(1\),从这一点继续归纳.如果区间内有\(x\)个\(1\),设区间内\([2,x+1]\)的和为\(sum\),如果\(sum=0\),那 ...

  2. P4899 [IOI2018] werewolf 狼人(kruskal 重构树 + 主席树)

    P4899 [IOI2018] werewolf 狼人 给定一个有nnn个点mmm条边的无向图,有QQQ个询问 每次输入S,E,L,RS, E, L, RS,E,L,R,表示你在SSS点出发,要到EE ...

  3. 【kruskal重构树】【主席树】werewolf 狼人(P4899)

    正题 P4899 题目大意 给你一个图,对于每次询问Si,Ei,Li,RiS_i,E_i,L_i,R_iSi​,Ei​,Li​,Ri​,回答从SiS_iSi​走到EiE_iEi​,是否存在路径满足前面 ...

  4. P4899-[IOI2018]werewolf 狼人【Kruskal重构树,主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4899 题目大意 nnn个点的一张无向图,每次询问(s,t,l,r)(s,t,l,r)(s,t,l,r)表示询问能 ...

  5. P4764-[CERC2014]Pork barrel【主席树,LCT,最小生成树】

    正题 题目链接:https://www.luogu.org/problem/P4764 题目大意 给出一张图,若干个询问,每个询问求只使用权值在[L,R][L,R][L,R]这个范围内的边组成的最小生 ...

  6. LG P4899 [IOI2018] werewolf 狼人(kruskal重构树,二维数点)

    LG P4899 [IOI2018] werewolf 狼人 Solution 我们发现010101限制长这样子: ∃x(minids−>x≥L&maxidx−>e≤R)→1\ex ...

  7. 【IOI2018】狼人【Kruscal重构树】【主席树】

    题意:nnn个点mmm条边的无向图,qqq次询问,每次给定s,t,L,Rs,t,L,Rs,t,L,R,判断是否存在一条sss到ttt的路径,使得路径上可以找到一点kkk,满足此路径s∼ks\sim k ...

  8. LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

    LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...

  9. p4899 [IOI2018] werewolf 狼人

    分析 我用的主席树维护qwq 代码 #include<iostream> #include<cstdio> #include<cstring> #include&l ...

最新文章

  1. oracle 测试数据类型,oracle修改表字段的数据类型测试
  2. thinkphp5/phpstudy分析入口文件index.php及localhost和配置域名访问网站根目录www
  3. 别让数据坑了你!用置信学习找出错误标注(附开源实现)
  4. Laravel Carbon获取 某个时间后N个月的时间
  5. iphone7无服务_iphone7无服务无信号怎么办
  6. Android Studio报错:Plugin Kotlin was not installed: Cannot download
  7. static_cast,reinterpret_cast,const_cast,dynamic_cast:
  8. iPhoneアプリに本格ホラーアドベンチャー監獄脱出少女 android
  9. Failed to connect to Etherscan API at url https://api-rinkeby.etherscan.io/api
  10. IOS检查更新的方法
  11. 台式计算机开机密码设置,设置台式电脑的开机锁屏密码的方法步骤
  12. psp java运行环境_手机模拟器?PSP的Java环境PSPKVM 0.0.7发布
  13. 串口、Modbus通信协议
  14. python将pdf转换图片
  15. 百度程序员删库跑路被逮捕!
  16. 个人开发者基于可编程Web的产品尝试:QCon会前采访FaWave作者李华煜
  17. 同花顺_代码解析_技术指标_S
  18. 入门理解计算机视觉、图形学、图像处理
  19. 递归算法向非递归算法转换
  20. Java调用Zebra条码打印机打印条码、中英文数字条码混合标签,可自由控制格式和排版

热门文章

  1. 相关系数(Excel求解)
  2. [系统安全] 三十四.恶意代码检测(4)编写代码自动提取IAT表、字符串及时间信息
  3. adb向模拟器传递文件
  4. CS-信息系统建设和服务能力评估体系
  5. MOSFET和IGBT栅极驱动器电路的基本原理学习(2)
  6. [pwn]gdb-peda调试
  7. 虚拟机安装到局域网服务器,局域网访问电脑中VMware虚拟机
  8. Go报错Finished running tool: 路径,current directory outside main module .... dependencies 的解决方法
  9. 西门子200Smart加维纶触摸屏程序画面程序案例,项目内容为某制造企业疫苗车间控制系统,报告配液工艺
  10. 安卓pdf阅读器_用户分享Note2阅读器体验:全格式手写、双开翻译功能很给力!...