LG P4899 [IOI2018] werewolf 狼人

Solution

我们发现010101限制长这样子:
∃x(minids−>x≥L&maxidx−>e≤R)→1\exist_x(min_{id_{s->x}}\geq L\;\;\And\;\;max_{id_{x->e}}\leq R) \to 1∃x​(minids−>x​​≥L&maxidx−>e​​≤R)→1
因此我们只需要快速求出xxx沿着≥L\geq L≥L的编号能走到的点集和沿着≤R\leq R≤R的编号能走到的点集的交即可。

然后上面的东西可以用kruskalkruskalkruskal重构树维护。具体的,对于minidx−>x≥Lmin_{id_{x->x}}\geq Lminidx−>x​​≥L的情况,我们把一条边(x,y)(x,y)(x,y)的边权设为min(x,y)min(x,y)min(x,y),然后建kruskalkruskalkruskal重构树,这样sss能走到的点集就是从重构树上sss开始跳到的最高的满足ppp的点权≥L\geq L≥L祖先ppp的子树中的所有叶子结点,因此它能走到的点集是在重构树上的一棵子树,也是重构树的dfsdfsdfs序的一段区间[x1,x2][x_1,x_2][x1​,x2​]。

那么对于maxidx−>e≤Rmax_{id_{x->e}}\leq Rmaxidx−>e​​≤R也求出一段区间[y1,y2][y_1,y_2][y1​,y2​]之后,问题就转化为在第一棵树上dfndfndfn为[x1,x2][x_1,x_2][x1​,x2​]在第二棵树上dfndfndfn为[y1,y2][y_1,y_2][y1​,y2​]的点存不存在,直接二维数点即可。

时间复杂度O(nlgn)O(nlgn)O(nlgn)。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
PR p[MAXN];
int n,m,q,Ans[MAXN];
struct Enode{ int u,v,c; } eg[MAXN];
struct Qnode{ int x,l,r,id; } Q[MAXN];
struct Binary_Index_Tree
{int s[MAXN];void add(int x) { for (;x<=n;x+=x&(-x)) s[x]++; }int query(int x) { int ans=0; for (;x;x-=x&(-x)) ans+=s[x]; return ans; }
} BIT;
struct Kruskal_Tree
{vector<int> e[MAXN];int num,DFN,f[MAXN],dfn[MAXN],fns[MAXN],dep[MAXN],fa[MAXN][20],Log[MAXN],a[MAXN];int find(int x) { return f[x]==x?f[x]:f[x]=find(f[x]); }void dfs(int x){dfn[x]=DFN+1,DFN+=(x<=n);for (int i=1;i<=Log[dep[x]];i++) fa[x][i]=fa[fa[x][i-1]][i-1];for (auto v:e[x]) fa[v][0]=x,dep[v]=dep[x]+1,dfs(v);fns[x]=DFN;}void build(){num=n,DFN=0;for (int i=1;i<=n+n;i++) f[i]=i,e[i].clear();sort(eg+1,eg+m+1,[&](Enode a,Enode b){ return a.c>b.c; });for (int i=1;i<=m;i++) {int u=find(eg[i].u),v=find(eg[i].v),c=eg[i].c;if (u==v) continue;a[++num]=c;f[num]=f[u]=f[v]=num;e[num].PB(u),e[num].PB(v);}Log[1]=0;for (int i=2;i<=num;i++) Log[i]=Log[i>>1]+1;dfs(num);}int jump(int x,int y){for (int i=Log[dep[x]];i>=0;i--)if (fa[x][i]&&a[fa[x][i]]>=y) x=fa[x][i];return x;}PR query(int x,int y){int z=jump(x,y);return MP(dfn[z],fns[z]);}
} Ts,Te;
VI check_validity(int N,VI X,VI Y,VI S,VI E,VI L,VI R)
{n=N,m=X.size(),q=S.size();for (int i=1,u,v;i<=m;i++) u=X[i-1]+1,v=Y[i-1]+1,eg[i]=(Enode){u,v,min(u,v)};Ts.build();for (int i=1;i<=m;i++) eg[i].c=-max(eg[i].u,eg[i].v);Te.build();for (int i=1;i<=n;i++) p[i]=MP(Ts.dfn[i],Te.dfn[i]);for (int i=1;i<=q;i++){int s=S[i-1]+1,e=E[i-1]+1,l=L[i-1]+1,r=R[i-1]+1;PR x=Ts.query(s,l),y=Te.query(e,-r);Q[i]=(Qnode){x.fi-1,y.fi,y.se,-i};Q[i+q]=(Qnode){x.se,y.fi,y.se,i};
//      cout<<"Query:"<<x.fi<<" "<<x.se<<" "<<y.fi<<" "<<y.se<<endl;}sort(p+1,p+n+1,[&](PR a,PR b){ return a.fi<b.fi; });sort(Q+1,Q+q+q+1,[&](Qnode a,Qnode b){ return a.x<b.x; });for (int i=1,nw=0;i<=q+q;i++){while (nw<n&&p[nw+1].fi<=Q[i].x) BIT.add(p[++nw].se);int t=BIT.query(Q[i].r)-BIT.query(Q[i].l-1);if (Q[i].id>0) Ans[Q[i].id]+=t;if (Q[i].id<0) Ans[-Q[i].id]-=t;}VI A; A.clear();for (int i=1;i<=q;i++) A.PB(Ans[i]?1:0);return A;
}

LG P4899 [IOI2018] werewolf 狼人(kruskal重构树,二维数点)相关推荐

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

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

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

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

  3. p4899 [IOI2018] werewolf 狼人

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

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

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

  5. [IOI2018] werewolf 狼人

    [IOI2018] werewolf 狼人 IOI2018题解 (其实原题强制在线,要用主席树) 代码: 注意: 1.下标从0~n-1 2.kruskal重构树开始有n个节点,tot从n开始,++to ...

  6. [IOI2018] werewolf 狼人 题解

    [IOI2018] werewolf 狼人 [IOI2018] werewolf 狼人 可以考虑到每一条边能否通过对于人形态来说,取决于两点的最小值,对于狼形态来说取决两点的最大值. 那么我们不妨考虑 ...

  7. P1967 货车运输( 最大生成树+LCA or Kruskal重构树)

    至于为什么要用最大生成树!? 理由:因为问最大载重,如果要加大载重的话,对于选择的路肯定权重越大越好,所以贪心地想,得用到最大生成树.然后两点之间的最大载重用LCA去寻找就可以了. 最大生成树+LCA ...

  8. 浅谈kruskal重构树

    食用须知: *因为临时改动,代码不一定完全正确. *以下概念来自个人理解,并不十分准确.慎! <Kruskal重构树思想与模板> Kruskal算法(维护无向图的最小生成森林):每一时刻, ...

  9. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

最新文章

  1. 一只端午节鸭蛋粽子的背后:AI 与农业
  2. QQ使用的应用层协议
  3. python新手程序员工资-程序员吐槽新同事:连我实习水平都不到,工资是我的1.7倍...
  4. leetcode算法题-- 最长递增子序列的个数★
  5. Spring管理事务的若干配置形式
  6. IO多路复用 select、poll、epoll
  7. mysql 安装目录配置_linux 下mysql安装,目录配置
  8. silverlight 自定义资源整理(待后续补充)
  9. 域名备案以及再次白嫖阿里云
  10. 斐讯K2 刷华硕固件
  11. lingoes/灵格斯词霸/灵格斯翻译家开始弹窗去除方法
  12. 安装打印机驱动时报错 -536870329 或 1FFFFDB9
  13. 阿里云总线CSB的HTTP调用案例
  14. 如何从零开始设计一款小程序原型?
  15. Linux 账号与身份管理2
  16. [深度学习笔记(1)]深度学习入门
  17. MySQL--SQL执行顺序详解
  18. git 将自己的分支合到主分支
  19. 7-112 斐波那契数列 (10 分)
  20. IPA签名是怎么回事儿?

热门文章

  1. 有这些好习惯,可以让你悄悄变优秀
  2. 2018 Kaggle 报告:在技术领域,女性从业者持续减少,00后开始展露头脚
  3. 三维重建 几何方法 深度学习_基于深度学习的视觉三维重建研究总结
  4. 后端根据百度地图真实路径距离_导航软件哪家强?实测百度地图and高德地图哪个更靠谱...
  5. linux truncate文件,linux系统编程:用truncate调整文件大小
  6. linux下找不到libc 库,Linux-覆盖libc open()库函数
  7. android消息响应实验报告,android实验一实验报告-20210401011015.docx-原创力文档
  8. 问题 A: 约瑟夫问题(普及第一关模拟)
  9. java中编译类型的方法 和 运行时的类型方法 有什么区别
  10. [Spring5]IOC容器_Bean管理_bean的作用域和bean的生命周期