1594: [Usaco2008 Jan]猜数游戏

Description

为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力。 游戏开始前,一头指定的奶牛会在牛棚后面摆N(1 <= N<= 1,000,000)堆干草,每堆有若干捆,并且没有哪两堆中的草一样多。所有草堆排成一条直线,从左到右依次按1..N编号,每堆中草的捆数在1..1,000,000,000之间。 然后,游戏开始。另一头参与游戏的奶牛会问那头摆干草的奶牛 Q(1 <= Q <= 25,000)个问题,问题的格式如下: 编号为Ql..Qh(1 <= Ql <= Qh <= N)的草堆中,最小的那堆里有多少捆草? 对于每个问题,摆干草的奶牛回答一个数字A,但或许是不想让提问的奶牛那么容易地得到答案,又或许是她自己可能记错每堆中干草的捆数,总之,她的回答不保证是正确的。 请你帮助提问的奶牛判断一下,摆干草的奶牛的回答是否有自相矛盾之处。

Input

* 第1行: 2个用空格隔开的整数:N 和 Q

* 第2..Q+1行: 每行为3个用空格隔开的整数Ql、Qh、A,描述了一个问题以及它 对应的回答

Output

* 第1行: 如果摆干草的奶牛有可能完全正确地回答了这些问题(也就是说,能 找到一种使得所有回答都合理的摆放干草的方法),输出0,否则输出 1个1..Q中的数,表示这个问题的答案与它之前的那些回答有冲突之处

Sample Input

20 4
1 10 7
5 19 7
3 12 8
11 15 12

输入说明:

编号为1..10的草堆中,最小的那堆里有7捆草,编号为5..19的草堆中同样
如此;编号为3..12的草堆中最小的堆里是8捆草,11..15堆中的最小的堆里是12
捆。

Sample Output

3

输出说明:

对于第3个问题“3 12”的回答“8”与前面两个回答冲突。因为每堆中草的
捆数唯一,从前两个回答中我们能推断出,编号为5..10的干草堆中最小的那堆
里有7捆干草。很显然,第3个问题的回答与这个推断冲突。

HINT

注意:如果有冲突出现输出一个数m,使得前M-1个命题不冲突。

Source

【分析】

  我自己YY是把两个矛盾分开,第一种矛盾,就是要每个数各不相同,比较好弄。然后看看在他之前有没有第二种矛盾,就是最小值的矛盾。

  然后觉得第一种矛盾就用离散,按照右端点排序然后维护后缀最小值处理第二种矛盾。

  不过我打的不是这个方法。

  二分答案,直接看前mid有没有矛盾,按照数值排序,看看有没有交集处理第一种矛盾。

  然后并查集处理已经出现的区间,每个点记录fa的rt,即延伸的最远位置,没有出现的位置直接for,每个空白位置只会扫一次。

  大概就是这样啊,代码超丑ORZ。。

代码如下:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define Maxn 1000010 struct node
{
int x,y,a;
}t[Maxn],tt[Maxn]; bool cmp(node x,node y) {return x.a>y.a;} int mymin(int x,int y) {return x<y?x:y;}
int mymax(int x,int y) {return x>y?x:y;} int n; int rt[Maxn],fa[Maxn]; int ffind(int x)
{
if(fa[x]!=x) fa[x]=ffind(fa[x]);
return fa[x];
} bool check(int now)
{
memset(rt,-,sizeof(rt));
for(int i=;i<=now;i++) tt[i]=t[i];
for(int i=;i<=n;i++) fa[i]=i;
sort(tt+,tt++now,cmp);
for(int i=;i<=now;i++)
{
int lm=tt[i].x,rm=tt[i].y,lx=tt[i].x,rx=tt[i].y;
while(i<now&&tt[i].a==tt[i+].a)
{
lx=mymax(lx,tt[i+].x);
rx=mymin(rx,tt[i+].y);
lm=mymin(lm,tt[i+].x);
rm=mymax(rm,tt[i+].y);
i++;
}
if(lx>rx) return ;
if(rt[ffind(lx)]>=rx) return ;
if(rt[ffind(lm)]==-) rt[ffind(lm)]=lm;
for(int j=rt[ffind(lm)];j<rm;)
{
if(rt[ffind(j+)]==-) rt[ffind(j+)]=j+;
fa[ffind(j)]=ffind(j+);
j=rt[ffind(j+)];
}
if(rt[ffind(rm+)]!=-) fa[ffind(rm)]=ffind(rm+);
if(rt[ffind(lm-)]!=-) fa[ffind(lm-)]=ffind(lm);
}
return ;
} void ffind(int l,int r)
{
int ans=;
while(l<r)
{
int mid=(l+r)>>;
if(check(mid)) r=mid,ans=mid;
else l=mid+;
}
printf("%d\n",ans);
} int main()
{
int q;
scanf("%d%d",&n,&q);
for(int i=;i<=q;i++) scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].a);
ffind(,q);
return ;
}

[BZOJ J1594]

同样是并查集为啥我的就那么慢。。TAT。。。

2016-10-28 14:48:53

【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)的更多相关文章

  1. bzoj 1594: [Usaco2008 Jan]猜数游戏——二分+线段树

    Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面摆N(1 <= N<= 1,000,00 ...

  2. BZOJ 1594 [Usaco2008 Jan]猜数游戏(线段数)

    1594: [Usaco2008 Jan]猜数游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 626  Solved: 260[Submit][S ...

  3. BZOJ 1594: [Usaco2008 Jan]猜数游戏 线段树 + 思维 + 二分

    Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...

  4. bzoj 1594: [Usaco2008 Jan]猜数游戏【二分+线段树】

    写错一个符号多调一小时系列-- 二分答案,然后判断这个二分区间是否合法: 先按值从大到小排序,然后对于值相同的一些区间,如果没有交集则不合法:否则把并集在线段树上打上标记,然后值小于这个值的区间们,如 ...

  5. 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集

    [BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...

  6. [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)

    传送门 题中重要信息,每堆草的数量都不一样. 可以思考一下,什么情况下才会出现矛盾. 1.如果两个区间的最小值一样,但是这两个区间没有交集,那么就出现矛盾. 2.如果两个区间的最小值一样,并且这两个区 ...

  7. [bzoj1594] [Usaco2008 Jan]猜数游戏

    二分答案(二分没冲突的前Q-1个问题),用并查集判定(用法同bzoj 1576) 假设一个询问区间[l,r],最小干草堆数目是A,我们可以得出[l,r]上的干草堆数目都>=A. 二分出mid后, ...

  8. bzoj [JSOI2010]Group 部落划分 Group【二分+并查集】

    我是zz吗这么简单都写错-- 一眼二分,然后判断的话是枚举点,然后计算这个点到已有联通块的最小距离,如果这个点到一些联通块的距离小于当前二分的val,则把这些联通块合并起来,这里用并查集维护,最后看这 ...

  9. 【bzoj1594】猜数游戏

    1594: [Usaco2008 Jan]猜数游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 556  Solved: 225 Descripti ...

随机推荐

  1. linux部署tomcat

    安装说明 安装环境:CentOS-6.5安装方式:源码安装 软件:apache-tomcat-6.0.45.tar.gz下载地址:http://tomcat.apache.org/download-6 ...

  2. JAVA练习

    JAVA基础练习 1.给java,stb,sql三门科目的成绩算出JAVA和SQL的成绩差,JAVA和SQL的成绩共是,三门课的总分是,三门课的平均分是多少 import java.util.Scan ...

  3. jquery click事件的可选参数data的作用

    $("#ID").click({x:"value"},function (e) { alert(e.data.x); });

  4. mysql - 启动错误InnoDB: mmap(137363456 bytes) failed; errno 12

    [zsm]下午mysql出现了问题,很纠结,最后找到了原因,原因是内存不够用: 查看内存显示   [root@AY1305070924544 /]# free -m              tota ...

  5. Oracle初始化

    /*第1步:创建临时表空间 */ create temporary tablespace mdb_temp tempfile 'G:\data\oracle\mdb_temp.ora' size 10 ...

  6. iOS-开发日志-UIPageControl

    UIPageControl 1.  numberOfPages // 设置有多少页 默认为0 // 2) 设置页数 [pageControl setNumberOfPages:kImageCount] ...

  7. c#保存textbox中的字符串到txt文件中

    /********************** 保存接收按钮 *****************************/ private void SavetxData_Click(object s ...

  8. Android版多线程下载器核心代码分享

    首先给大家分享多线程下载核心类: package com.example.urltest; import java.io.IOException; import java.io.InputStream ...

  9. python 自动化之路 day 02

    本节内容: 列表.元组操作 字符串操作 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names = ['Alex',&qu ...

  10. Kali linux网络配置

    Kali linux 安装完成后,需要对其网络进行配置.使用DHCP服务是配置网卡最简单的方法之一,但渗透测试时通常不会这样做,因为系统会被记录在DHCP服务器的数据库中. 1  动态DHCP方式 配 ...