[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. 20155310 Exp9 Web安全基础实践

    20155310 Exp9 Web安全基础实践 基础问题 SQL注入攻击原理,如何防御? SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞.也就是,在输入字符串中嵌入SQL指令,在 ...

  2. Luogu P1196 [NOI2002]银河英雄传说

    一年没写博客了(滑稽). 这道题很玄学,导致自己都有一个坑人的问题求解.如果有大佬有能力求帮助:https://www.luogu.org/discuss/show?postid=30231 再来讲一 ...

  3. flaskr 报错及其修改

    作者:hhh5460 官网有一个flaskr的例子,按照其8个步骤(包括测试),一步一步照着做,有3个地方报错. 究其原因,可能是flaskr这个例子年代比较久远,而现在python以及flask都有 ...

  4. Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理

    这篇文章我们来学习如何使用 Spring Boot 集成 Apache Shiro .安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求.在 Java 领域一般有 Spring S ...

  5. Android Studio Xposed模块编写(二)

    阅读本文前,假设读者已经看过Android Studio Xposed模块编写(一)  相关环境已经搭建完成.本文演示案例与上文环境一致,不在赘述. 1.概述 Xposed是非常牛叉的一款hook框架 ...

  6. mybatis源码-解析配置文件(一)之XML的DOM解析方式

    目录 简介 Java 中 XML 文件解析 解析方式 DOM 解析 XML 新建 XML 文件 DOM 操作相关类 Java 读取 XML 文件 一起学 mybatis @ 简介 在之前的文章< ...

  7. Java 多线程(三)之线程状态及其验证

    目录 线程状态 Thread.State 状态类型 定义 说明 状态转换 状态验证 「NEW」-> 「RUNNABLE」 -> 「TERMINATED」 「RUNNABLE」 -> ...

  8. 【Direct2D1.1初探】Direct2D特效概览

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D是一个基于Direct3D的2D图形API,可以利用硬件加速特性来提供高性能高质量的2D渲染.但 ...

  9. pandas 初识(一)

    基本内容 Series: Series 是有一组数据(numpy的数据类型 numpy.ndarray)以及一组数据标签(即索引)组成,可以看成一个一个定长的有序字典(索引值到数据值的一个映射) ob ...

  10. ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三)

    ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (三)配置远程桌面连接访问dock ...