BZOJ 1594: [Usaco2008 Jan]猜数游戏 线段树 + 思维 + 二分
Description
Input
Output
题解: 非常好的一道题.
考虑什么时候会出现问题(矛盾)
1.对于同一个数,出现在了两个不相交的区间.
2.一个区间的最小值已确定,却有一个子区间的最小值小于当前最小值.
我们先二分一个答案 $mid$ ,把 $1$~$mid$ 的所有操作按照权值从大到小排序.
每次处理出每一个权值的区间,如果区间有两个或以上,则不合法.
否则,直接在线段树上查一下该极大区间的区间和.
如果区间和等于区间长度,说明之前已全部被覆盖掉,这是不合法的.
否则,直接覆盖当前区间.
这么迭代下去就行.
#include<bits/stdc++.h>
#define maxn 3000000
using namespace std;
void setIO(string s)
{
string in=s+".in";
freopen(in.c_str(),"r",stdin);
}
int n,Q;
struct OPT
{
int l,r,v;
}opt[maxn],yy[maxn];
bool cmp(OPT a,OPT b)
{
return a.v>b.v;
}
struct Seg
{
#define lson (x<<1)
#define rson ((x<<1)|1)
int lazy[maxn<<2],sumv[maxn<<2];
void re()
{
memset(lazy,0,sizeof(lazy));
memset(sumv,0,sizeof(sumv));
}
void mark(int l,int r,int x)
{
sumv[x]=r-l+1;
lazy[x]=1;
}
void pushdown(int l,int r,int x)
{
if(lazy[x])
{
int mid=(l+r)>>1;
if(l<=mid) mark(l,mid,lson);
if(r>mid) mark(mid+1,r,rson);
lazy[x]=0;
}
}
void update(int l,int r,int x,int L,int R)
{
if(l>=L&&r<=R)
{
mark(l,r,x);
return;
}
pushdown(l,r,x);
int mid=(l+r)>>1;
if(L<=mid) update(l,mid,lson,L,R);
if(R>mid) update(mid+1,r,rson,L,R);
sumv[x]=sumv[lson]+sumv[rson];
}
int query(int l,int r,int x,int L,int R)
{
if(l>=L&&r<=R) return sumv[x];
pushdown(l,r,x);
int mid=(l+r)>>1,tmp=0;
if(L<=mid) tmp+=query(l,mid,lson,L,R);
if(R>mid) tmp+=query(mid+1,r,rson,L,R);
return tmp;
}
}tr;
bool check(int mid)
{
int i,j,k,l1,r1,l2,r2;
tr.re();
for(i=1;i<=mid;++i) yy[i]=opt[i];
sort(yy+1,yy+1+mid,cmp);
for(i=1;i<=mid;i=j)
{
for(j=i;j<=mid&&yy[j].v==yy[i].v;++j);
l1=l2=yy[i].l;
r1=r2=yy[i].r;
for(k=i+1;k<j;++k)
{
l1=min(l1,yy[k].l);
l2=max(l2,yy[k].l);
r1=max(r1,yy[k].r);
r2=min(r2,yy[k].r);
}
if(l2>r2) return true; // 无并集
if(tr.query(1,n,1,l2,r2)==r2-l2+1) return true;
tr.update(1,n,1,l1,r1);
}
return false;
}
int main()
{
// setIO("input");
scanf("%d%d",&n,&Q);
for(int i=1;i<=Q;++i)
{
scanf("%d%d%d",&opt[i].l,&opt[i].r,&opt[i].v);
}
int l=1,r=Q,ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))
r = mid - 1, ans=mid;
else
l=mid+1;
}
printf("%d\n",ans);
return 0;
}
BZOJ 1594: [Usaco2008 Jan]猜数游戏 线段树 + 思维 + 二分的更多相关文章
- BZOJ 1594 [Usaco2008 Jan]猜数游戏(线段数)
1594: [Usaco2008 Jan]猜数游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 626 Solved: 260[Submit][S ...
- bzoj 1594: [Usaco2008 Jan]猜数游戏——二分+线段树
Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面摆N(1 <= N<= 1,000,00 ...
- bzoj 1594: [Usaco2008 Jan]猜数游戏【二分+线段树】
写错一个符号多调一小时系列-- 二分答案,然后判断这个二分区间是否合法: 先按值从大到小排序,然后对于值相同的一些区间,如果没有交集则不合法:否则把并集在线段树上打上标记,然后值小于这个值的区间们,如 ...
- 【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)
1594: [Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面 ...
- 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集
[BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...
- [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)
传送门 题中重要信息,每堆草的数量都不一样. 可以思考一下,什么情况下才会出现矛盾. 1.如果两个区间的最小值一样,但是这两个区间没有交集,那么就出现矛盾. 2.如果两个区间的最小值一样,并且这两个区 ...
- [bzoj1594] [Usaco2008 Jan]猜数游戏
二分答案(二分没冲突的前Q-1个问题),用并查集判定(用法同bzoj 1576) 假设一个询问区间[l,r],最小干草堆数目是A,我们可以得出[l,r]上的干草堆数目都>=A. 二分出mid后, ...
- BZOJ 4756 [Usaco2017 Jan]Promotion Counting(线段树合并)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4756 [题目大意] 给出一棵树,对于每个节点,求其子树中比父节点大的点个数 [题解] ...
- BZOJ 1230 [Usaco2008 Nov]lites 开关灯:线段树异或
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1230 题意: 有n盏灯,一开始全是关着的. 有m次操作(p,a,b).p为0,则将区间[a ...
随机推荐
- Hibernate数据缓存攻略
目录 第一章 缓存策略概述 第二章 hibernate不使用缓存的问题 第三章 一级缓存介绍 第四章 二级缓存 第五章 一二级缓存对比及总结 源代码: https://github.com/weili ...
- javax ee常用类
1.public interface HttpServletRequest extends ServletRequest 都在package javax.servlet.http;包下 接口继承接口p ...
- Mac OSX:安装zsh
想在mac下安装oh my zsh,按照https://github.com/robbyrussell/oh-my-zsh上的文档,执行下面这条命令安装:curl -L http://install. ...
- Maven中的dependency的scope作用域详解
1.test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖 2.compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去 3.provided依赖:在编译和测试的过程有效,最后 ...
- spring boot项目Intellij 打包
spring boot项目Intellij 打包 学习了:http://blog.csdn.net/hzt_fighting_up/article/details/78174291 在edit con ...
- 深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载
一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术. ...
- 设置用root用户telnet到linux系统
默认情况下,ROOT用户不能以telnet方式连接Linux操作系统,而且也是不安全的.但从技术上来讲,是可以实现的. #mv /etc/securetty /etc/securetty.bak 保存 ...
- hibernate初步3
事务和并发 1.事务概念 一组不可分割的操作,事务有如下属性(ACID 属性:Atomic Consistent Isolated Durable)(1)原子性---Atomic 事务的原子性指的是 ...
- django自带权限控制系统的使用和分析
1.django的权限控制相关表及其相互间的关系: django的所有权限信息存放在auth_permission表中,用户user和用户组group都可以有对应的权限permission.分别存放在 ...
- PCB Genesis加邮票孔(弧形连接位宽度校正)实现算法
采用弧形作为加接位,当两边距离较远时,会造成连接位变窄,由于之前算法是基于连接位间距做为半径画弧, 必然存在这个缺陷,这边做少许的改进解决此问题. 现将几个种增加孤形连接位的图形对比如下: 一.两边外 ...