[IOI2018] werewolf 狼人

[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=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
namespace Miracle{
const int M=400000+5;
const int N=400000+5;
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[2*N];struct kruskal{struct node{int nxt,to;}e[2*N];int hd[2*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=1;i<=n;++i){if(typ) val[i]=inf;else val[i]=-inf;}tot=n;for(reg i=1;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][20];int df;void dfs(int x){//    cout<<" xx "<<x<<endl;int son=0;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][0]=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=1;j<=19;++j){for(reg i=1;i<=tot;++i){fa[i][j]=fa[fa[i][j-1]][j-1];}}}int fin(int x,int lim,int typ){//beizeng go valint p=x;if(!typ){//go <=limfor(reg j=19;j>=0;--j){if(fa[p][j]){if(val[fa[p][j]]<=lim) p=fa[p][j];}}return p;}else{//go >=limfor(reg j=19;j>=0;--j){if(fa[p][j]){if(val[fa[p][j]]>=lim) p=fa[p][j];}}return p;}}
}kt[2];//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*2];struct binarytree{int f[N];void upda(int x){for(;x<=n;x+=x&(-x)) f[x]++;}int query(int x){int ret=0;for(;x;x-=x&(-x)) ret+=f[x];return ret;}
}t;
int main(){rd(n);rd(m);rd(Q);for(reg i=1;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+1,b+m+1,cmp0);for(reg i=1;i<=2*n;++i){fafa[i]=i;}kt[0].build(0);kt[0].pre();
//    cout<<" after build small "<<endl;for(reg i=1;i<=m;++i){b[i].val=min(b[i].x,b[i].y);}sort(b+1,b+m+1,cmp1);for(reg i=1;i<=2*n;++i){fafa[i]=i;}kt[1].build(1);kt[1].pre();int st,nd,L,R;for(reg i=1;i<=Q;++i){rd(st);rd(nd);rd(L);rd(R);++L;++R;++st;++nd;//warning!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!int ptr=kt[1].fin(st,L,1);q[++tot].id=i;q[tot].y1=kt[1].l[ptr];q[tot].y2=kt[1].r[ptr];q[++tot].id=i;q[tot].y1=kt[1].l[ptr];q[tot].y2=kt[1].r[ptr];ptr=kt[0].fin(nd,R,0);q[tot-1].x=kt[0].l[ptr]-1;q[tot].x=kt[0].r[ptr];q[tot-1].typ=-1;q[tot].typ=1;}sort(q+1,q+tot+1);for(reg i=1;i<=n;++i){p[i].x=kt[0].l[i];p[i].y=kt[1].l[i];}sort(p+1,p+n+1);int ptp=1,ptq=1;for(reg i=1;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-1));++ptq;}}}for(reg i=1;i<=Q;++i){puts(ans[i]?"1":"0");}return 0;
}}
signed main(){Miracle::main();return 0;
}/*Author: *Miracle*Date: 2019/2/10 15:50:00
*/

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

这里就是简单查询连通性

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

 

转载于:https://www.cnblogs.com/Miracevin/p/10359586.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]

【问题描述】[第680题][验证回文字符串Ⅱ][简单] 给定一个非空字符串 s&#xff0c;最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: "aba" 输出: True 示例 2:输入: "abca" 输出: True 解释: 你可以删除c字符。 注意:字符串只包含从 a-z 的小…

目前微型计算机的内存储量一般是多大的,微型计算机内存容量的大小一般是指什么而言...

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。微型计算机内存容量的大小一般是指RAM。随机存取存储器是与CPU直接交换数据的内部存储器&#xff0c;也叫主存(内存)。它可以随时读写&#xff0c;而且速度很快&#xff0c;通常作为…

html:(2):制作第一个网页和html和css的关系

在<h1>和</h1>标签之间&#xff0c;输入Hello World 字符串。 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>制作我的第一个网页</title><…

随手练——洛谷-P1008 / P1618 三连击(暴力搜索)

1.普通版 第一眼看到这个题&#xff0c;我脑海里就是&#xff0c;“我们是不是在哪里见过~”&#xff0c;去年大一刚学C语言的时候写过一个类似的题目&#xff0c;写了九重循环。。。。就像这样&#xff08;在洛谷题解里看到一位兄台写的。。。。超长警告&#xff0c;慎重点开&…

Java基础知识面试题

Java基础知识面试题Java概述基础语法数据类型编码注释访问修饰符关键字 final this super static流程控制语句面向对象类和接口变量和方法内部类重写与重载对象相等判断值传递Java包IO流反射String相关包装类相关Java概述 JVM、JRE和JDK的关系 JVM Java Virtual Machine是Jav…

数学和计算机的应用视频教学反思,数学多媒体教学反思.doc

数学多媒体教学反思篇一&#xff1a;数学多媒体教学反思(1456字)多媒体辅助课堂教学&#xff0c;作为新型的教学媒体&#xff0c;当数学教学与它们密切整合时&#xff0c;它们能为新型教学结构的创建提供最理想的教学环境&#xff0c;它们能为数学课程改革提供全新的教学方式和…

html:(3):认识html标签和标签的语法

让我们通过一个网页的学习&#xff0c;来对html标签有一个初步理解。平常大家说的上网就是浏览各种各式各样的网页&#xff0c;这些网页都是由html标签组成的。下面就是一个简单的网页。效果图如下&#xff1a; 我们来分析一下&#xff0c;这个网页由哪些html标签组成&#xff…

JPA-EntityManager.merge()

EntityManager#merge merge() 用于处理 Entity 的同步。即数据库的插入和更新操作 merge的几种情况 1. 若传入的是一个临时对象 package jpa.test;import com.jpa.entity.Customer; import org.junit.After; import org.junit.Before; import org.junit.Test;import javax.pers…

[Leedcode][JAVA][第76题][最小覆盖子串]滑动窗口]

【问题描述】[第76题][最小覆盖子串][中等] 给你一个字符串 S、一个字符串 T&#xff0c;请在字符串 S 里面找出&#xff1a;包含 T 所有字符的最小子串。示例&#xff1a;输入: S "ADOBECODEBANC", T "ABC" 输出: "BANC" 说明&#xff1a;如…

计算机应用综合实践实验心得,综合实践活动培训心得体会范文(精选5篇)

综合实践活动培训心得体会范文(精选5篇)在平日里&#xff0c;心中难免会有一些新的想法&#xff0c;有这样的时机&#xff0c;要好好记录下来&#xff0c;这样能够让人头脑更加清醒&#xff0c;目标更加明确。怎样写好心得体会呢&#xff1f;下面是小编为大家整理的综合实践活动…

天梯赛-是否完全二叉搜索树

将一系列给定数字顺序插入一个初始为空的二叉搜索树&#xff08;定义为左子树键值大&#xff0c;右子树键值小&#xff09;&#xff0c;你需要判断最后的树是否一棵完全二叉树&#xff0c;并且给出其层序遍历的结果。 输入格式&#xff1a; 输入第一行给出一个不超过20的正整数…

html:(4):认识html文件基本结构和认识head标签

认识html文件基本结构 这一节中我们来学习html文件的结构&#xff1a;一个HTML文件是有自己固定的结构的。 <html><head>...</head><body>...</body> </html> 代码讲解&#xff1a; 1. <html></html>称为根标签&#xff0…

python编程习惯

1.使用局部变量 2.减少函数调用次数 3.采用映射替代条件查找 4.直接迭代序列元素 5.采用生成器表达式替代列表解析 6.先编译后调用 7.模块编程习惯转载于:https://www.cnblogs.com/chbo/p/10361863.html

[Leedcode][JAVA][第4题][寻找两个正序数组中的中位数][二分查找][双指针]

【问题描述】[困难] 给定两个大小为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出这两个正序数组的中位数&#xff0c;并且要求算法的时间复杂度为 O(log(m n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 [1, 3] nums2 [2]则…

html 常用字符,html 常用特殊字符

HTML常用特殊字符最常用的字符实体(Character Entities)空格<小于<<>大于>>&&符号&&"双引号""其他常用的字符实体(Character Entities)©版权©© 注册商标乘号除号 字符 十进制字符编号 实体名字! !---"…

html:(5):了解html的代码注释和语义化

了解HTML的代码注释 什么是代码注释&#xff1f;代码注释的作用是帮助程序员标注代码的用途&#xff0c;过一段时间后再看你所编写的代码&#xff0c;就能很快想起这段代码的用途。代码注释不仅方便程序员自己回忆起以前代码的用途&#xff0c;还可以帮助其他程序员很快的读懂…

天梯-红色警报

5-9 红色警报 (25分) 战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序&#xff0c;当失去一个城市导致国家被分裂为多个无法连通的区域时&#xff0c;就发出红色警报。注意&#xff1a;若该国本来就不完全连通&#xff0c;是分裂的k个区域&#xff0c;而失…

1114D . Flood Fill

这道题还可以转化成最长回文串&#xff0c;实际的答案是 离散化后的数组最长回文串切成一半有几个数字&#xff0c;这些数字就是中间的数字需要对齐的对象&#xff0c;所以不用改变 #include <bits/stdc.h> using namespace std;const int maxN 5008;int n; int dp[maxN…

[Leedcode][JAVA][第287题][寻找重复数][HashSet][二分查找][快慢指针]

【问题描述】[中等] 给定一个包含 n 1 个整数的数组 nums&#xff0c;其数字都在 1 到 n 之间&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设只有一个重复的整数&#xff0c;找出这个重复的数。输入: [1,3,4,2,2] 输出: 2说明&#xff1a…

华南师范大学计算机学院广东录取,华南师范大学2020年广东省各批次分专业录取分数统计(含位次)...

看来广东考生也对师范类院校比较青睐&#xff0c;为什么这么说呢&#xff1f;因为前段时间&#xff0c;小编写了两篇关于广东省内师范院校(韩山师范学院、岭南师范学院)的录取情况以后&#xff0c;陆续有考生咨询华南师范大学的录取情况&#xff0c;可见师范院校是比较受考生欢…