[IOI2018] werewolf 狼人
(其实原题强制在线,要用主席树)
代码:
注意:
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 狼人的更多相关文章
- [IOI2018] werewolf 狼人 kruskal重构树,主席树
[IOI2018] werewolf 狼人 LG传送门 kruskal重构树好题. 日常安利博客文章 这题需要搞两棵重构树出来,这两棵重构树和我们平时见过的重构树有点不同(据说叫做点权重构树?),根据 ...
- [LOJ2865] P4899 [IOI2018] werewolf 狼人
P4899 [IOI2018] werewolf 狼人 LOJ#2865.「IOI2018」狼人,第一次AC交互题 kruskal 重构树+主席树 其实知道重构树的算法的话,难度就主要在主席树上 习惯 ...
- [Luogu4899][IOI2018] werewolf 狼人
luogu sol \(\mbox{IOI2018}\)的出题人有没有看过\(\mbox{NOI2018}\)的题目呀... \(\mbox{Kruskal}\)重构树+二维数点. 题目相当于是问你从 ...
- P4899 【[IOI2018] werewolf 狼人】
感觉已经几次碰到这种类型的题目了,写篇\(Blog\)总结一下 题意: 是否存在一条\((s_i, t_i)\)的路径,满足先只走编号不超过\(L_i\)的点,再走编号不超过\(R_i\)的点 \(S ...
- p4899 [IOI2018] werewolf 狼人
分析 我用的主席树维护qwq 代码 #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- [IOI2018] werewolf 狼人 [kruskal重构树+主席树]
题意: 当你是人形的时候你只能走 \([L,N-1]\) 的编号的点(即大于等于L的点) 当你是狼形的时候你只能走 \([1,R]\) 的编号的点(即小于等于R的点) 然后问题转化成人形和狼形能到的点 ...
- 题解 洛谷 P4899 【[IOI2018] werewolf 狼人】
先考虑狼形,其只能走编号小于\(R\)的点.若将每条边赋边权为其两端点编号的较大值,然后按最小生成树的顺序构建\(Kruskal\)重构树. 那么从原图的一个点\(x\)在树上倍增,到达满足要求且深度 ...
- @loj - 2865@ 「IOI2018」狼人
目录 @description@ @solution@ @accepted code@ @details@ @description@ 在日本的茨城县内共有 N 个城市和 M 条道路.这些城市是根据人 ...
- UOJ#407. 【IOI2018】狼人 Kruskal,kruskal重构树,主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ407.html 题解 套路啊. 先按照两个节点顺序各搞一个kruskal重构树,然后问题转化成两棵krus ...
随机推荐
- 20155310《网络对抗》Exp2 后门原理与实践
20155310<网络对抗>Exp2 后门原理与实践 基础问题回答 1.例举你能想到的一个后门进入到你系统中的可能方式? 在网上下载软件的时候,后门很有可能被捆绑在下载的软件当中: 浏览网 ...
- Command and Query Responsibility分离模式
CQRS模式,就是命令和查询责任分离模式. CQRS模式通过使用不同的接口来分离读取数据和更新数据的操作.CQRS模式可以最大化性能,扩展性以及安全性,还会为系统的持续演化提供更多的弹性,防止Upda ...
- SSIS 你真的了解事务吗?
事务用于处理数据的一致性,事务的定义是,处于同一个事务中的操作是一个工作单元,要么全部执行成功,要么全部执行失败.把事务的概念应用到在实际的SSIS Package场景中,如何在Package中实现事 ...
- effective c++ 笔记 (18-22)
//---------------------------15/04/06---------------------------- //#18 让接口容易被正确使用,不易被误用 { // 1:为了防 ...
- 初级字典树查找在 Emoji、关键字检索上的运用 Part-2
系列索引 Unicode 与 Emoji 字典树 TrieTree 与性能测试 生产实践 在有了 Unicode 和 Emoji 的知识准备后,本文进入编码环节. 我们知道 Emoji 是 Unico ...
- Ps矩形工具的运用
矩形工具 1.标识位置以及快捷键 位于左侧工具栏中,快键键是u,根据需求选择里面包含的工具 2.使用方法 鼠标左键点击工具,直接在图层使用,点击后拖住不放选择想要的图形后松手即可. 可以根据自身的需求 ...
- 总结com组件问题,随笔记录
一.从 IClassFactory 为 CLSID 为 {00024500-0000-0000-C000-000000000046} 的 COM 组件创建实例失败,原因是出现以下错误:80010001 ...
- RabbitMq基础教程之基本概念
RabbitMq基础教程之基本概念 RabbitMQ是一个消息队列,和Kafka以及阿里的ActiveMQ从属性来讲,干的都是一回事.消息队列的主要目的实现消息的生产者和消费者之间的解耦,支持多应用之 ...
- Unity2D 面向目标方向
在2d空间上,假设角色的自身的y轴方向为正方向,如果要让角色随时面向一个目标点. 这里假设(0,0)点为目标点 第一种: Vector3 v = Vector3.zero - transform.po ...
- 条件GAN论文简单解读
条件GAN(Conditional Generative Adversarial Nets),原文地址为CGAN. Abstract 生成对抗网络(GAN)是最近提出的训练生成模型(g ...