[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. 【HNOI2018】游戏

    题面 题解 这道题目到底有没有靠谱一点的解法啊... 有很多种\(\color{green}{\mathrm{AC}}\)的方法,设\(L[i],R[i]\)表示点\(i\)最左边和最右边能够到达的位 ...

  2. 使用 spring-boot-devtools 进行热部署

    2019/3/5 更新: 发现热部署不生效,出现页面显示error的错误,然后在 application.properties 中注释了下面两行成功实现热部署(直接删掉也可以) #spring.dev ...

  3. C#集合与泛型集合

    看到这个标题,大家应该就知道有泛型集合,就有非泛型集合 既然都是集合,咱们今儿就简单的来对比讲解下 需要记住的不算太多,理解记忆.理解记忆 2017-11-0411:39:09 C# 泛型集合之非泛型 ...

  4. IIS充当反向代理转发请求到Kestrel

    接着上篇博文为ASP.NetCore程序启用SSL的code,这篇将介绍如何用IIS充当反向代理的角色转发请求到Kestrel服务器 介绍 与ASP.NET不同,ASP.netCore使用的是自托管w ...

  5. 一、Unity Editor自定义菜单

    官方文档:https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu ...

  6. [Unity]制作游戏中名字板的过程记录

    先大概说一下需求: 1 每个模型上都要有名字板:人.怪.npc等等. 2 名字板上会显示:名字(文字).血条(图片)等 3 因为是透视相机,名字板离得太近会变得超大,且主角移动,名字板的位置相对于相机 ...

  7. Unity插件-NGUI学习笔记

    Anchors 的作用 类似Android里面的.9格式图片的功能, 边框可以随着文字变大而变大. 实现方法: 用NGUI 创建一个Sprite, 命名为TextBg, 一个Label, Label的 ...

  8. sass和less的几点不同

    1.申明和使用变量 sass使用$符号来标识变量(老版本的sass使用!来标识变量),比如$highlight-color和$sidebar-width. 与CSS属性不同,变量可以在css规则块定义 ...

  9. 软工第三次作业 -- 结对之AutoCS1.0

    031302331 031302223 一.将初始排课表导入系统数据库 法1:通过jxl解析excel,把数据插入数据库.较简单,预计用时60分钟 我们采取的是 法2(预计用时30分钟):我们使用的是 ...

  10. beta3

    吴晓晖(组长) 过去两天完成了哪些任务 一些细节的debug,部分优化,算法中有关记录的部分 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员:刘帅珍 过去两天完成 ...