[IOI2018] werewolf 狼人

IOI2018题解

(其实原题强制在线,要用主席树)

代码:

注意:

1.下标从0~n-1

2.kruskal重构树开始有n个节点,tot从n开始,++tot

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int M=+;
const int N=+;
const int inf=0x3f3f3f3f;
int n,m,Q;
struct edge{
int x,y;
int val;
}b[M];
bool cmp0(edge a,edge b){
return a.val<b.val;
}
bool cmp1(edge a,edge b){
return a.val>b.val;
}
int fafa[*N]; struct kruskal{
struct node{
int nxt,to;
}e[*N];
int hd[*N],cnt;
int fin(int x){
return fafa[x]==x?x:fafa[x]=fin(fafa[x]);
}
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int tot;
void build(int typ){
for(reg i=;i<=n;++i){
if(typ) val[i]=inf;
else val[i]=-inf;
}
tot=n;
for(reg i=;i<=m;++i){
int k1=fin(b[i].x),k2=fin(b[i].y);
// cout<<" edge "<<b[i].x<<" "<<b[i].y<<" :: "<<k1<<" "<<k2<<endl;
if(k1!=k2){
++tot;
fafa[tot]=tot;
fafa[k1]=tot;
fafa[k2]=tot;
val[tot]=b[i].val;
add(tot,k1);
add(tot,k2);
}
}
}
int l[N],r[N];
int val[N];
int fa[N][];
int df;
void dfs(int x){
// cout<<" xx "<<x<<endl;
int son=;
r[x]=-inf;l[x]=inf;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
++son;
dfs(y);
fa[y][]=x;
r[x]=max(r[x],r[y]);
l[x]=min(l[x],l[y]);
}
if(!son){
l[x]=r[x]=++df;
}
}
void pre(){
dfs(tot);
for(reg j=;j<=;++j){
for(reg i=;i<=tot;++i){
fa[i][j]=fa[fa[i][j-]][j-];
}
}
}
int fin(int x,int lim,int typ){//beizeng go val
int p=x;
if(!typ){//go <=lim
for(reg j=;j>=;--j){
if(fa[p][j]){
if(val[fa[p][j]]<=lim) p=fa[p][j];
}
}
return p;
}else{//go >=lim
for(reg j=;j>=;--j){
if(fa[p][j]){
if(val[fa[p][j]]>=lim) p=fa[p][j];
}
}
return p;
}
}
}kt[];//0:min tree;1:max tree; int num;
struct po{
int x,y;
bool friend operator <(po a,po b){
return a.x<b.x;
}
}p[N];
int ans[N]; int tot;
struct que{
int id,x,typ,y1,y2;
bool friend operator <(que a,que b){
return a.x<b.x;
}
}q[N*]; struct binarytree{
int f[N];
void upda(int x){
for(;x<=n;x+=x&(-x)) f[x]++;
}
int query(int x){
int ret=;
for(;x;x-=x&(-x)) ret+=f[x];
return ret;
}
}t;
int main(){
rd(n);rd(m);rd(Q);
for(reg i=;i<=m;++i){
rd(b[i].x);rd(b[i].y); ++b[i].x;++b[i].y;//warning!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! b[i].val=max(b[i].x,b[i].y);
}
sort(b+,b+m+,cmp0);
for(reg i=;i<=*n;++i){
fafa[i]=i;
}
kt[].build(); kt[].pre();
// cout<<" after build small "<<endl;
for(reg i=;i<=m;++i){
b[i].val=min(b[i].x,b[i].y);
}
sort(b+,b+m+,cmp1);
for(reg i=;i<=*n;++i){
fafa[i]=i;
}
kt[].build();
kt[].pre(); int st,nd,L,R;
for(reg i=;i<=Q;++i){
rd(st);rd(nd);rd(L);rd(R);
++L;++R;
++st;++nd;//warning!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! int ptr=kt[].fin(st,L,);
q[++tot].id=i;
q[tot].y1=kt[].l[ptr];
q[tot].y2=kt[].r[ptr]; q[++tot].id=i;
q[tot].y1=kt[].l[ptr];
q[tot].y2=kt[].r[ptr]; ptr=kt[].fin(nd,R,);
q[tot-].x=kt[].l[ptr]-;
q[tot].x=kt[].r[ptr]; q[tot-].typ=-;
q[tot].typ=;
}
sort(q+,q+tot+); for(reg i=;i<=n;++i){
p[i].x=kt[].l[i];
p[i].y=kt[].l[i];
}
sort(p+,p+n+); int ptp=,ptq=;
for(reg i=;i<=n;++i){
while(ptp<=n&&p[ptp].x<i) ++ptp;
if(p[ptp].x==i){
while(ptp<=n&&p[ptp].x==i){
t.upda(p[ptp].y);
++ptp;
}
} while(ptq<=tot&&q[ptq].x<i) ++ptq;
if(q[ptq].x==i){
while(ptq<=tot&&q[ptq].x==i){
ans[q[ptq].id]+=q[ptq].typ*(t.query(q[ptq].y2)-t.query(q[ptq].y1-));
++ptq;
}
}
} for(reg i=;i<=Q;++i){
puts(ans[i]?"":"");
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/10 15:50:00
*/

总结:
kruskal重构树,就是考虑在经过边权在一定范围内到达的区域的点的情况

这里就是简单查询连通性

两个重构树判交的“二维数点”问题的转化很巧妙!

[IOI2018] werewolf 狼人的更多相关文章

  1. [IOI2018] werewolf 狼人 kruskal重构树,主席树

    [IOI2018] werewolf 狼人 LG传送门 kruskal重构树好题. 日常安利博客文章 这题需要搞两棵重构树出来,这两棵重构树和我们平时见过的重构树有点不同(据说叫做点权重构树?),根据 ...

  2. [LOJ2865] P4899 [IOI2018] werewolf 狼人

    P4899 [IOI2018] werewolf 狼人 LOJ#2865.「IOI2018」狼人,第一次AC交互题 kruskal 重构树+主席树 其实知道重构树的算法的话,难度就主要在主席树上 习惯 ...

  3. [Luogu4899][IOI2018] werewolf 狼人

    luogu sol \(\mbox{IOI2018}\)的出题人有没有看过\(\mbox{NOI2018}\)的题目呀... \(\mbox{Kruskal}\)重构树+二维数点. 题目相当于是问你从 ...

  4. P4899 【[IOI2018] werewolf 狼人】

    感觉已经几次碰到这种类型的题目了,写篇\(Blog\)总结一下 题意: 是否存在一条\((s_i, t_i)\)的路径,满足先只走编号不超过\(L_i\)的点,再走编号不超过\(R_i\)的点 \(S ...

  5. p4899 [IOI2018] werewolf 狼人

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

  6. [IOI2018] werewolf 狼人 [kruskal重构树+主席树]

    题意: 当你是人形的时候你只能走 \([L,N-1]\) 的编号的点(即大于等于L的点) 当你是狼形的时候你只能走 \([1,R]\) 的编号的点(即小于等于R的点) 然后问题转化成人形和狼形能到的点 ...

  7. 题解 洛谷 P4899 【[IOI2018] werewolf 狼人】

    先考虑狼形,其只能走编号小于\(R\)的点.若将每条边赋边权为其两端点编号的较大值,然后按最小生成树的顺序构建\(Kruskal\)重构树. 那么从原图的一个点\(x\)在树上倍增,到达满足要求且深度 ...

  8. @loj - 2865@ 「IOI2018」狼人

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 在日本的茨城县内共有 N 个城市和 M 条道路.这些城市是根据人 ...

  9. UOJ#407. 【IOI2018】狼人 Kruskal,kruskal重构树,主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ407.html 题解 套路啊. 先按照两个节点顺序各搞一个kruskal重构树,然后问题转化成两棵krus ...

随机推荐

  1. 20155206 Exp2 后门原理与实践

    20155206 Exp2 后门原理与实践 1.Windows获得Linux Shell 在windows下,打开CMD,使用ipconfig指令查看本机IP 然后使用ncat.exe程序,ncat. ...

  2. 20155331 Exp3 免杀原理与实践

    20155331 Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 1.基于特征码的检测,2.启发式恶意软件检测,3.基于行为的恶意软件检测. 免杀是做什么? 让病毒不被杀毒软件杀 ...

  3. mfc CCombox系统定义成员函数

    通过ID操作对象 CComboBox(组合框)控件 CComboBox类常用成员 CComboBox插入数据 CComboBox删除数据 CComboBox运用示例 一.CComboBox控件常用属性 ...

  4. sqlyog mysql 外键引用列找不到想要的字段的原因

    这是因为引用列必须为一个主键才行

  5. 微信小程序之 动画 —— 自定义底部弹出层

    wxml: <view class='buy' bindtap='showBuyModal'>立即购买</view> <!-- 点击立即购买 弹出购买遮罩层 --> ...

  6. 【开源.NET】 轻量级内容管理框架Grissom.CMS(第二篇前后端交互数据结构分析)

    这是 CMS 框架系列文章的第二篇,第一篇开源了该框架的代码和简要介绍了框架的目的.作用和思想,这篇主要解析如何把sql 转成标准 xml 配置文件和把前端post的增删改数据规范成方便后台解析的结构 ...

  7. Js_图片轮换

    本文介绍用javascript制作图片轮换效果,原理很简单,就是设置延时执行一个切换函数,函数里面是先设置下面的缩略图列表的白框样式,再设置上面大图的src属性,在IE中显示很正常,可是在FF中会有变 ...

  8. 关于java线程池的一丢丢

    线程池应用达到的目的 1.降低资源消耗:可以重复利用已创建的线程从而降低线程创建和销毁所带来的消耗. 2.提高响应速度:当任务到达时,不需要等线程创建就可以立即执行. 3.提高线程的可管理性:使用线程 ...

  9. ffmpeg sox 音频转换 MP3 转 wav

    转自:https://blog.csdn.net/xiaoshulf/article/details/78657172 1 windows 下 mp3 文件和 wav 文件的 转换 实现代码: 1 f ...

  10. Mac OS系统 sublime text3 常用快捷键记录

    个人觉得下面这些个常用的快捷键,还是有必要熟练使用的: 符号说明: ⌘:command ⌃:control ⌥:option ⇧:shift ↩:enter ⌫:delete cmd+n 新建文件(n ...