POJ 3657 并查集
题意:
思路:
1.二分+线段树(但是会TLE 本地测没有任何问题,但是POJ上就是会挂……)
2.二分+并查集
我搞了一下午+一晚上才搞出来…………..(多半时间是在查错)
首先 如果我们想知道这头奶牛之前的奶牛回答的是不是错的怎么办呢?
把回答的A从大到小排个序。这里有几种错的方式:
- 如果后面的区间完全被前面的区间包含,这是错的
- 如果有两个不相交的区间的A是一样的,这也是错的(题目保证没有两堆干草的数量是一样的)
注意取相同A的区间的时候不要超过当前二分的mid
并查集的使用也很关键……
如果是第一次覆盖 每回暴力修改一个区间
随后就可以跳着修改了…..
(有很多很多小技巧 感谢NEIGHTHORN的帮助 (和队长的代码))
//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
int n,q,ans=0,f[1111111];
struct Section{int from,to,minn;}sec[25555],cpy[25555];
bool cmp(Section a,Section b){return a.minn>b.minn;}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
inline bool check(int pos){
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=pos;i++)cpy[i]=sec[i];
sort(cpy+1,cpy+1+pos,cmp);
for(int i=1,j;i<=pos;i=j+1){
int x=cpy[i].from,y=cpy[i].to,X=x,Y=y;
j=i;
while(cpy[j].minn==cpy[j+1].minn&&j+1<=pos){
j++;
x=max(x,cpy[j].from),X=min(X,cpy[j].from);
y=min(y,cpy[j].to),Y=max(Y,cpy[j].to);
}
if(y<x||find(y)<x)return 0;
while(X<=Y)
if(find(Y)==Y)f[Y]=find(X-1),Y--;
else Y=find(Y);
}
return 1;
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=q;i++)
scanf("%d%d%d",&sec[i].from,&sec[i].to,&sec[i].minn);
int l=1,r=q;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid))l=mid+1;
else r=mid-1,ans=mid;
}
printf("%d\n",ans);
}
POJ 3657 并查集的更多相关文章
- poj 1984 并查集
题目意思是一个图中,只有上下左右四个方向的边.给出这样的一些边, 求任意指定的2个节点之间的距离. 就是看不懂,怎么破 /* POJ 1984 并查集 */ #include <stdio.h& ...
- poj 1797(并查集)
http://poj.org/problem?id=1797 题意:就是从第一个城市运货到第n个城市,最多可以一次运多少货. 输入的意思分别为从哪个城市到哪个城市,以及这条路最多可以运多少货物. 思路 ...
- POJ 2492 并查集扩展(判断同性恋问题)
G - A Bug's Life Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- POJ 2492 并查集应用的扩展
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28651 Accepted: 9331 Descri ...
- POJ 3228 [并查集]
题目链接:[http://poj.org/problem?id=3228] 题意:给出n个村庄,每个村庄有金矿和仓库,然后给出m条边连接着这个村子.问题是把所有的金矿都移动到仓库里所要经过的路径的最大 ...
- poj 1733 并查集+hashmap
题意:题目:有一个长度 已知的01串,给出多个条件,[l,r]这个区间中1的个数是奇数还是偶数,问前几个是正确的,没有矛盾 链接:点我 解题思路:hash离散化+并查集 首先我们不考虑离散化:s[x] ...
- poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
题目链接:http://poj.org/problem?id=3310 思路:首先是判断图的连通性,以及是否有环存在,这里我们可以用并查集判断,然后就是找2次dfs找树上最长直径了,并且对树上最长直径 ...
- poj 2236 并查集
并查集水题 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring& ...
- poj 1417(并查集+简单dp)
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2087 Accepted: 640 Descrip ...
随机推荐
- Redis学习笔记(十二) 高级命令:服务器管理命令
原文链接:http://doc.redisfans.com/server/index.html save 执行一个同步操作,将redis实例的所有数据以rdb的形式保存到硬盘,一般来说,生产环境很少执 ...
- Spark基本运行流程
不多说,直接上干货! Spark基本运行流程 Application program的组成 Job : 包含多个Task 组成的并行计算,跟Spark action对应. Stage : Job 的调 ...
- 体系化认识RPC--转
原文地址:http://www.infoq.com/cn/articles/get-to-know-rpc?utm_source=infoq&utm_medium=popular_widget ...
- vue入门--简单路由配置
在初始化vue init webpack <工程名>时,有一步是询问是否安装vue-router,选择yes,如果没有安装的话,后面需要自己安装.然后在目录中可以看到有个文件夹叫route ...
- Java NIO(四)文件通道
文件通道 通道是访问I/O服务的导管,I/O可以分为广义的两大类:File I/O和Stream I/O.那么相应的,通道也有两种类型,它们是文件(File)通道和套接字(Socket)通道.文件通道 ...
- 洛谷1613 跑路 倍增 + Floyd
首先,我们一定要认识到本题中的最短时间所对应的道路不一定是在起点到终点的最短路.例如,起点到终点的最短路为 151515 ,那么对 151515 进行二进制拆分的话是 111111111111 ,这时 ...
- Pyhton二级操作题练习
# 1.编写一个python程序,输入两个数,比较它们的大小并输出其中较大者. num1 = input('请输入数字X:') num2 = input('请输入数字Y:') if num1.isde ...
- Node Sass does not yet support your current environment: Windows 64-bit然如何解决,cnpm此问题解决方法
这里直接说了node sass不支持当前环境,所以可以直接删掉原来不支持本机的node sass,再重新安装就行了 删除: npm uninstall --save node-sass 安装: npm ...
- Settings Django Static Files
静态文件是通过django.contrib.staticfiles来管理的. 配置Django静态文件,Djang官网静态文件配置介绍.简言之,通过以下三个步骤来配置和加载静态文件: 设置静态文件别名 ...
- Unity2D 小游戏之 RocketMouse
这个小游戏源自这里.这几天闲时捡了点 Unity(很久没有摸它了),顺手将这个小游戏移植到了 Unity5.5.0,除了 Parallax Scrolling 还有点小问题外,其它功能全部完整.部分代 ...