抄题解.jpg

完全完全不会啊,这道题简直太神了

不过抄题解可真开心

首先这道题目保证了每一个位置上的数都是不同的,那么就能得到第一种判断不合法的方式

如果两个区间的最小值一样,但是两个区间的交集为空集,那么就是不合法的

因为最小值肯定来自于同一个位置

之后就是第二种情况

上面那两个红色区间的最小值是\(4\),但是下面那个被完全包含的绿色区间的最小值是\(3\)这显然非常不合法

但是如果是这个样子呢

显然是可以的,因为那些\(3\)可以来自红色区间以外的位置

就有不行了,因为这个时候\(3\)又只能来自于那个较小的绿色区间了,而那个较小的绿色区间又被红色完全覆盖了

这个时候就能得出第二个判断方法

如果最小值相同的区间,其交集被最小值比它的区间的并集覆盖,那么就不合法

所以我们需要覆盖并集,判断交集是否被完全覆盖

显然区间的交集和并集随手就能求出来,但是覆盖这个问题得需要一棵线段树来判断

同时为了方便的进行判断\(2\),我们得让区间的最小值是有序的,所以一个一个扫是行不通了,我们得二分答案,找到最后一个合法的位置\(+1\)就是答案了

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define LL long long
#define re register
#define maxn 25005
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
struct Seg
{
int x,y,q;
}a[maxn],b[maxn];
int l[4000005],r[4000005],d[4000005],tag[4000005];
int n,m;
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
void build(int x,int y,int i)
{
l[i]=x,r[i]=y;
if(x==y) return;
int mid=x+y>>1;
build(x,mid,i<<1),build(mid+1,y,i<<1|1);
}
void clear(int x,int y,int i)
{
d[i]=0,tag[i]=0;
if(x==y) return;
int mid=x+y>>1;
clear(x,mid,i<<1),clear(mid+1,y,i<<1|1);
}
inline void pushdown(int i)
{
if(!tag[i]) return;
tag[i<<1]=tag[i<<1|1]=1;
d[i<<1]=r[i<<1]-l[i<<1]+1;
d[i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;
tag[i]=0;
}
void change(int x,int y,int i)
{
if(x<=l[i]&&y>=r[i])
{
d[i]=r[i]-l[i]+1;
tag[i]=1;
return;
}
pushdown(i);
int mid=l[i]+r[i]>>1;
if(y<=mid) change(x,y,i<<1);
else if(x>mid) change(x,y,i<<1|1);
else change(x,y,i<<1|1),change(x,y,i<<1);
d[i]=d[i<<1]+d[i<<1|1];
}
int query(int x,int y,int i)
{
if(x<=l[i]&&y>=r[i]) return d[i];
pushdown(i);
int mid=l[i]+r[i]>>1;
if(y<=mid) return query(x,y,i<<1);
if(x>mid) return query(x,y,i<<1|1);
return query(x,y,i<<1)+query(x,y,i<<1|1);
}
inline int cmp(Seg A,Seg B)
{
return A.q>B.q;
}
inline int check(int now)
{
for(re int i=1;i<=now;i++)
b[i]=a[i];
std::sort(b+1,b+now+1,cmp);
clear(1,n,1);
int pre=1,nl=b[1].x,nr=b[1].y,Ul=b[1].x,Ur=b[1].y;
for(re int i=2;i<=now;i++)
{
if(b[i].q==b[pre].q)
{
nl=max(nl,b[i].x);
Ul=min(Ul,b[i].x);
Ur=max(Ur,b[i].y);
nr=min(nr,b[i].y);
}
else
{
if(nl>nr) return 0;
if(query(nl,nr,1)==nr-nl+1) return 0;
change(Ul,Ur,1);
pre=i;
nl=Ul=b[i].x,nr=Ur=b[i].y;
}
}
if(nl>nr) return 0;
if(query(nl,nr,1)==nr-nl+1) return 0;
return 1;
}
int main()
{
n=read(),m=read();
for(re int i=1;i<=m;i++) a[i].x=read(),a[i].y=read(),a[i].q=read();
build(1,n,1);
int L=1,R=m;
int ans=0;
while(L<=R)
{
int mid=L+R>>1;
if(check(mid)) L=mid+1,ans=mid;
else R=mid-1;
}
if(ans==m) puts("0");
else printf("%d\n",ans+1);
return 0;
}

【[USACO08JAN]haybale猜测Haybale Guessing】的更多相关文章

  1. 洛谷 P2898 [USACO08JAN]haybale猜测Haybale Guessing 解题报告

    [USACO08JAN]haybale猜测Haybale Guessing 题目描述 给一段长度为\(n\),每个位置上的数都不同的序列\(a[1\dots n]\)和\(q\)和问答,每个问答是\( ...

  2. [USACO08JAN]haybale猜测Haybale Guessing

    题目描述 The cows, who always have an inferiority complex about their intelligence, have a new guessing ...

  3. python猜数脚本(电脑猜测)(二分法)

    # coding=utf-8# 猜数# 记录猜数的过程import randomcom_result=[]  #存放电脑结果,数组com_count=0 #存放电脑猜测次数ran=random.ran ...

  4. [USACO08JAN]Haybale Guessing(LuoguP2898)

    The cows, who always have an inferiority complex about their intelligence, have a new guessing game ...

  5. 题解—P2898 [USACO08JAN]Haybale Guessing G

    pre 首先注意一下翻译里面并没有提到的一点,也是让我没看懂样例的一点,就是这个长度为 \(n\) 的数组里面的数各不相同. 有很多人用并查集写的这道题,题解里面也有一些用线段树写的,不过我认为我的做 ...

  6. POJ 3657 Haybale Guessing(区间染色 并查集)

    Haybale Guessing Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2384   Accepted: 645 D ...

  7. Haybale Guessing

    Haybale Guessing Time Limit: 1000MS   Memory Limit: 65536K       Description The cows, who always ha ...

  8. [USACO 08JAN]Haybale Guessing

    Description The cows, who always have an inferiority complex about their intelligence, have a new gu ...

  9. poj-3657 Haybale Guessing(二分答案+并查集)

    http://poj.org/problem?id=3657 下方有中文版,不想看英文的可直接点这里看中文版题目 Description The cows, who always have an in ...

随机推荐

  1. DataSet常用简单方法

    Clear移除表中所有行来清除任何数据的DataSet Clone赋值该DataSet的结构但不复制数据 Copy赋值DataSet的结构和数据 Dispose释放DataSet对象 Equals确定 ...

  2. java二叉搜索树原理与实现

    计算机里面的数据结构 树 在计算机存储领域应用作用非常大,我之前也多次强调多磁盘的存取速度是目前计算机飞速发展的一大障碍,计算机革命性的的下一次飞跃就是看硬盘有没有质的飞跃,为什么这么说?因为磁盘是永 ...

  3. 谈缓存和Redis

    自从上次分享<Redis到底该如何利用?>已经有1年多了,这1年经历了不少.从码了我们网站的第一行开始到现在,我们的缓存模块也不断在升级,这之中确实略有心得,最近也有朋友探讨缓存,觉得可以 ...

  4. Web Service与Apache CXF 框架

    一.WebService简介 为了支持跨网络的机器间相互操作交互而设计,用于开发分布式的互操作的应用程序组件. Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执 ...

  5. BZOJ4162:shlw loves matrix II

    传送门 利用Cayley-Hamilton定理,用插值法求出特征多项式 \(P(x)\) 然后 \(M^n\equiv M^n(mod~P(x))(mod~P(x))\) 然后就多项式快速幂+取模 最 ...

  6. gulp 打包报错:Error: `libsass` bindings not found. Try reinstalling `node-sass`

    看了网上很多帖子 有说切换node版本的 有说卸载重新装gulp-sass的 有说删除node_modules重新install的 但是我测试了下在我们的电脑环境下都不行,后来找到一个可以打包不报错的 ...

  7. bootstrap框架怎么在html页面加载使用

    今天敲代码的时候,正好碰到这个问题. 与大家分享这个解决方法:     1/7 到bootstrap官方网站下载,对于我们开发者来说,直接下载编译和压缩后的CSS.JavaScript文件,另外还包含 ...

  8. 转:Linux中tomcat服务成功发布但局域网浏览器无法访问

    转自:http://blog.csdn.net/mooncom/article/details/53168143 昨天,我在搭建Linux中服务器环境时,碰见一个问题,这里和大家分享一下. 问题描述: ...

  9. FineReport和泛微OA(Ecology)的单点登录集成方案

    最近出现了很多关于帆软报表和泛微OA的集成问题,均出现在“单点登录”上.直接也有相关的文章介绍一些FineReport和泛微集成的背景.价值等,以及FineReport和OA的深度集成的方案,但是并没 ...

  10. .net core系列之《从源码对Configuration的底层运行机制进行分析》

    通过对Configuration源代码的分析从而来自定义一个配置数据源 1.用反编译工具来看看AddJsonFile()这个方法究竟干了什么,源代码如下: public static IConfigu ...