二分答案(二分没冲突的前Q-1个问题),用并查集判定(用法同bzoj 1576)

  假设一个询问区间[l,r],最小干草堆数目是A,我们可以得出[l,r]上的干草堆数目都>=A。

  二分出mid后,把1~mid个询问按照最小干草数量A降序排序。。如果这些询问的回答自相矛盾的话,就存在一个询问区间[l,r],它的每个位置都存在于之前的询问区间(指那些A值比当前A值大的区间)中。也就是说根据以前的询问我们得出[l,r]里面任何一堆干草数目都大于当前的A值,那就自相矛盾了。(注意如果多个区间A值相同的话就取交集。

  就变成判断一段区间是否已被完全覆盖。。那就可以上并查集了。fa[i]表示i点所在的被覆盖的区间的左端点。

  这样的话是O(nlogQ*alpha(n))的。。我们可以离散化一下。。因为只要知道当前区间中是否存在一个点没被覆盖过,所以只要从离散化后相邻两个值中多拿出一个点做代表就行了(前提是相邻的差值>1)。这样就只剩4*Q堆干草了。

  卡了半天常。。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
struct zs{
int l,r,id,mn;
}q[];
int fa[],now[],map[],L[],R[],mp[];
int j,k,n,m,l,r,mid,tot,premx,mnx,mny,mxx,mxy;
bool flag;
int ra;char rx;
inline int read(){
rx=getchar();ra=;
while(rx<''||rx>'')rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra;
}
bool cmp(zs a,zs b){return a.mn>b.mn;}
inline bool can(int x){
register int i,j,k;now[]=;
for(i=;i<=m;i++)if(q[i].id<=x)L[++now[]]=q[i].l,R[now[]]=q[i].r,now[now[]]=i;
memset(fa,,(premx+)<<);premx=;
for(i=;i<=now[];i=j+){
for(j=i;j<now[]&&q[now[j+]].mn==q[now[i]].mn;j++);
mnx=mny=tot;mxx=mxy=;
for(k=i;k<=j;k++){
if(L[k]<mnx)mnx=L[k];if(L[k]>mxx)mxx=L[k];if(R[k]<mny)mny=R[k];if(R[k]>mxy)mxy=R[k];
}
for(flag=,k=mny;k>=mxx;k=fa[k]-)
if(!fa[k]){flag=;break;}
if(!flag)return ;
if(mxy>premx)premx=mxy;
for(k=mxy;k>=mnx;k--)
if(!fa[k])fa[k]=mnx;
else{k=fa[k];if(k>=mnx)fa[k]=mnx;}
}
return ;
}
inline int get(int x){
l=;r=tot;
while(l<r){
mid=(l+r+)>>;
if(mp[mid]>x)r=mid-;else l=mid;
}return l;
}
int main(){
register int i;
n=read();m=read();tot=m<<;
for(i=;i<=m;i++)q[i].l=map[i]=read(),q[i].r=map[i+m]=read(),q[i].mn=read(),q[i].id=i;
sort(map+,map++tot);int tmp=;
for(i=;i<=tot;i++)if(map[i]!=map[i-])map[++tmp]=map[i];tot=tmp;tmp=;
for(i=;i<=tot;i++)if(map[i]+<map[i+])mp[++tmp]=map[i],mp[++tmp]=map[i]+;else mp[++tmp]=map[i];
tot=tmp;
for(i=;i<=m;i++)q[i].l=get(q[i].l),q[i].r=get(q[i].r);
sort(q+,q++m,cmp);
l=;r=m;
while(l<r){
mid=(l+r+)>>;
if(can(mid))l=mid;else r=mid-;
}
if(l==m)puts("");else printf("%d\n",l+);
return ;
}

UPD:妈呀之前有个地方大和小打反了>_<..已更正

UPD2: 还需要特判 值不够用的情况..因为数字互不相同&上限是10^9。

一个询问(L,R,A)意味着这个区间里有R-L+1个>=A的数...数据(可能出题人也)没有考虑到这部分..

正常版本见51nod1336。有个做法是二分图匹配,不过复杂度感人。

[bzoj1594] [Usaco2008 Jan]猜数游戏的更多相关文章

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

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

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

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

  3. 【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)

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

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

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

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

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

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

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

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

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

  8. 【bzoj1594】猜数游戏

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

  9. usaco 猜数游戏

    Description 为了提高智商,锻炼思维能力,奶牛设计了一个猜数游戏.游戏开始前,贝西会在牛棚后面摆上N个数字.所有数字排成一条直线,按次序从1到N编号.每个数字在1到10^9之间,没有两个数字 ...

随机推荐

  1. iOS 接收新消息通知调用系统声音 震动

    添加系统框架: #import <AudioToolbox/AudioToolbox.h> 调用震动代码: AudioServicesPlaySystemSound(kSystemSoun ...

  2. SSH框架完全整合

    大三学期渐末,事情也挺多的,上周就开始着手整合SSH框架,到现在才真正的完成,过程中碰到了许多小问题(小问题大折腾,哭脸.jpg).本着善始善终的原则,最终把它给完成了. 本篇文章就在: win7 6 ...

  3. 455. Assign Cookies.md

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...

  4. [置顶] android ListView包含Checkbox滑动时状态改变

    题外话: 在xamarin android的开发中基本上所有人都会遇到这个小小的坎,的确有点麻烦,当时我也折腾了好一半天,如果你能看到这篇博客,说明你和我当初也是一样的焦灼,如果你想解决掉这个小小的坎 ...

  5. ArcGIS API for JavaScript 4.2学习笔记[18] 搜索小部件

    这个例子很简单,作为开学后(暴露出学生党的本质)的开胃菜是再合适不过了. 不过,博主提前警告一下:接下来的例子会相当的长.烦.难.我还会用"引用"-"函数参数骨架&quo ...

  6. 获取SpringMVC的映射路径

    public String init(HttpServletRequest request, HttpServletResponse response){ List<String> uLi ...

  7. websocket教程(一) 非常有趣的理解websocket

    一.websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1 ...

  8. Hello TensorFlow 二 (GPU)

    官方说明:https://www.tensorflow.org/install/ 环境: 操作系统 :Windows 10 家庭中文版 处理器 : Intel(R) Core(TM) i7-7700 ...

  9. JMeter常见错误解决方法

    1.Windows 平台,双击 jmeter/bin 目录下 jmeter.bat 文件,jmeter 无法启动且报错如下: 此问题是没有配置 jdk 环境变量所致,配置好 jdk 环境变量即可. 2 ...

  10. Java订单功能模块设计与实现

    在商城项目中,之前我们介绍了购物车功能模块的实现,商品加入到购物车之后,就是到购物车结算,然后显示购物车的商品列表,点击去结算,然后到了未提交前的订单列表, 点击提交订单后,生成此订单,返回订单的订单 ...