猜数游戏[USACO2008] Haybale Guessing G
$ Haybale \ Guessing \ G $ (猜数游戏) 解题报告
\(Diffculty:\) \(\color{purple}省选/NOI-\)
题面
为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力。 游戏开始前,一头指定的奶牛会在牛棚后面摆\(N\)
(\(1 \le N \le 1000000\)) 堆干草,每堆有若干捆,并且没有哪两堆中的草一样多。所有草堆排成一条直线,从左到右依次按1..N编号,每堆中草的捆数在 $ 1 \ ... \ 1000000000$ 之间。 然后,游戏开始。另一头参与游戏的奶牛会问那头摆干草的奶牛 \(Q\)(\(1 \le Q \le 25000\))个问题,问题的格式如下: 编号为 $ Ql...Qh $ ( $ 1 \le Ql \le Qh \le N $ )的草堆中,最小的那堆里有多少捆草?
对于每个问题,摆干草的奶牛回答一个数字\(A\),但或许是不想让提问的奶牛那么容易地得到答案,又或许是她自己可能记错每堆中干草的捆数,总之,她的回答不保证是正确的。 请你帮助提问的奶牛判断一下,摆干草的奶牛的回答是否有自相矛盾之处。
注意:如果有冲突出现输出一个数\(m\),使得前\(m-1\)个命题不冲突。
输入格式
第\(1\)行: \(2\)个用空格隔开的整数:\(N\) 和 \(Q\)
第 $ 2...Q+1$ 行: 每行为\(3\)个用空格隔开的整数\(Ql、Qh、A\),描述了一个问题以及它对应的回答
输出格式
第\(1\)行: 如果摆干草的奶牛有可能完全正确地回答了这些问题(也就是说,能 找到一种使得所有回答都合理的摆放干草的方法),输出\(0\),否则输出 \(1\) 个 \(1...Q\) 中的数,表示这个问题的答案与它之前的那些回答有冲突之处
样例输入
20 4
1 10 7
5 19 7
3 12 8
11 15 12
样例输出
3
题解
注意到\(m\)(输出)只与前\(m-1\)个数有关。
因此这么考虑:
如果\(m\)是一个可能错的节点,那么真正的输出的$ \ \ ans$ $ \ \le \ m $
如果\(m\)此时完全有理由正确,那么 $ \ ans \ge m $
一眼的 \(\bf{二分答案}\)
再考虑\(check\)函数的写法(难点)
- 如何使得当前的\(m\)与之前的关系是合法的?
首先考虑什么时候不合法:
·1.当存在两个询问出的最大值相等且不存在交集时
·2.当此询问所在的区间最小值已经确定,\(dam\)存在一个子集合最小值小于其最小值。
- 如何解决这两种问题?
·1:在\(check\)函数中将目前的前面的询问按从大到小进行排序,并处理\(v\)相等的情况。
在此过程中判断所有的询问是否有交集,若没有,则不合法
·2:求一下交集的区间内是否都被动过,若返回值等于\(1\)(被使用了,且最小值大于此时说的最小值)
问题:如何求交集的区间是否全被动了?
我们可以设被破了的是1,处是0 ... 咳咳咳, 设被求过的是\(0\),被求过了的是\(1\)
用线段树赋值\(0\)和\(1\),求是否这一段区间是否全是一,只要用区间查询求出的值是否等于区间长就好了。
\(\bf最后注意:多次调用要清零!\)
\(code\)
#include<bits/stdc++.h>
#define int long long
using namespace std ;
const int N = 1e6 + 100 ;
struct lic
{
int x , y , v ;
}a[ N ] ;
int n , m ;
bool cmp ( lic a , lic b )
{
return a.v > b.v ;
}
inline int read( )
{
int x = 0 , f = 1 ;
char c = getchar( ) ;
while ( c < '0' || c > '9' )
{
if( c == '-' )
{
f = -1 ;
}
c = getchar( ) ;
}
while ( c >= '0' && c <= '9' )
{
x = x * 10 + c - '0' ;
c = getchar( ) ;
}
return x * f ;
}
namespace Segment_Tree_Double_interval
{
#define lson ( id << 1 )
#define rson ( id << 1 | 1 )
int t[ N << 2 ] , lazy[ N << 2 ] ;
inline void Clear( )
{
memset( t , 0 , sizeof( t ) ) ;
memset( lazy , 0 , sizeof( lazy ) ) ;
}
inline void push_up( int id )
{
t[ id ] = t[ lson ] + t[ rson ] ;
return ;
}
inline void paint( int id , int l , int r )
{
t[ id ] = r - l + 1 ;
lazy[ id ] = 1 ;
return ;
}
inline void push_down( int id , int l , int r )
{
if( lazy[ id ] )
{
int mid = ( l + r ) >> 1 ;
if( l <= mid ) paint( lson , l , mid ) ;
if( r > mid ) paint( rson , mid + 1 , r ) ;
lazy[ id ] = 0 ;
}
return ;
}
void updata( int id , int l , int r , int x, int y )
{
if ( x <= l && r <= y )
{
paint( id , l , r ) ;
return ;
}
push_down( id , l , r ) ;
int mid = ( l + r ) >> 1 ;
if( x <= mid ) updata( lson , l , mid , x , y ) ;
if( y > mid ) updata( rson , mid + 1 , r , x , y ) ;
push_up( id ) ;
}
int query( int id , int l , int r , int x , int y )
{
if( x <= l && r <= y )
{
return t[ id ] ;
}
push_down( id , l , r ) ;
int mid = ( l + r ) >> 1 ;
int ans = 0 ;
if( x <= mid ) ans += query( lson , l , mid , x , y ) ;
if( y > mid ) ans += query( rson , mid + 1 , r , x , y ) ;
return ans ;
}
}
using namespace Segment_Tree_Double_interval ;
lic alpha[ N ] ;
bool check( int mid )
{
Clear( ) ;
memset( alpha , 0 ,sizeof( alpha ) ) ;
for( int i = 1 ; i <= mid ; ++ i )
{
alpha[ i ] = a[ i ] ;
}
sort( alpha + 1 , alpha + mid + 1 , cmp ) ;
int j , l1 , l2 , r1 , r2 ;
for( int i = 1 ; i <= mid ; i = j )
{
j = i ;
while( alpha[ i ].v == alpha[ j ].v && j <= mid ) j ++ ;
l1 = l2 = alpha[ i ].x ;
r1 = r2 = alpha[ i ].y ;
for( int k = i + 1 ; k < j ; k ++ )
{
l1 = min ( l1 , alpha[ k ].x ) ;
l2 = max ( l2 , alpha[ k ].x ) ;
r1 = max ( r1 , alpha[ k ].y ) ;
r2 = min ( r2 , alpha[ k ].y ) ;
}
if( l2 > r2 ) return 0 ;
if( query( 1 , 1 , n , l2 , r2 ) == r2 - l2 + 1 ) return 0 ;
updata( 1 , 1 , n , l1 , r1 ) ;
}
return 1 ;
}
signed main( )
{
#ifndef ONLINE_JUDGE
{
freopen( "1.in" , "r" , stdin ) ;
freopen( "1.out" , "w" , stdout ) ;
}
#endif
n = read( ) ; m = read( ) ;
Clear( ) ;
for( int i = 1 ; i <= m ; ++ i )
{
a[ i ].x = read( ) ; a[ i ].y = read( ) ; a[ i ].v = read( ) ;
}
int left = 1 , right = m ;
int ansl = 0 ;
while ( left <= right )
{
//cout << left << ' ' << right << '\n' ;
int mid = ( left + right ) >> 1 ;
if( check ( mid ) )
{
left = mid + 1 ;
}
else
{
right = mid - 1 ;
ansl = mid ;
}
}
cout << ansl ;
}
结尾撒花 \(\color{pink}✿✿ヽ(°▽°)ノ✿\)
猜数游戏[USACO2008] Haybale Guessing G的更多相关文章
- 【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)
1594: [Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面 ...
- 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集
[BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...
- 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]猜数游戏 线段树 + 思维 + 二分
Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...
- Java课程设计——猜数游戏(201521123111 陈伟泽)
Java课程设计--猜数游戏(201521123111 陈伟泽) 1.团队课程设计博客链接 博客作业--猜数游戏 2.个人负责模块或任务说明 Answer:一些基础界面的构造,排行榜的构造,用文件录入 ...
- 【bzoj1594】猜数游戏
1594: [Usaco2008 Jan]猜数游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 556 Solved: 225 Descripti ...
- usaco 猜数游戏
Description 为了提高智商,锻炼思维能力,奶牛设计了一个猜数游戏.游戏开始前,贝西会在牛棚后面摆上N个数字.所有数字排成一条直线,按次序从1到N编号.每个数字在1到10^9之间,没有两个数字 ...
- (一)Python之猜数游戏
猜数游戏由简如深的编码学习过程: 3次机会: print('------------------我爱鱼C工作室------------------')count=0while count < 3 ...
- 猜数游戏-flag的运用
package my;import java.util.Scanner;public class MyJava { public static void main(String[] ar ...
随机推荐
- 执行insmod提示 invalid module format
内核版本和驱动版本不匹配: 1.假如内核版本是2018.3,驱动使用了另外一个版本,可能会出现这样的问题 2.内核和驱动版本一致,但内核进行了一些配置,导致驱动装不上,此时应该: make clean ...
- STM32 CubeMX 学习:001-GPIO的使用
背景 在上一讲STM32 CubeMX 学习:搭建开发环境中,我们已经利用CubeMx搭建了可编译的工程. 今天就开始来介绍STM32 GPIO的有关知识,以及如何驱动它. HOST-OS : Win ...
- 『vulnhub系列』HMS-1
『vulnhub系列』HMS?-1 下载地址: https://www.vulnhub.com/entry/hms-1,728/ 信息搜集: 使用nmap进行存活主机探测,发现开启了21端口(ftp) ...
- “进口”双核A53@1.4GHz仅188元起,超高性价比!“邮票孔”AM62x工业核心板,正式发布!
创龙科技作为TI官方合作伙伴,在2022年9月即推出搭载TI最新明星处理器AM62x的工业核心板-SOM-TL62x(B2B版本).为了让工业客户进一步降低产品成本,并提高产品连接的可靠性,我们再次推 ...
- position的值, relative和absolute分别是相对于谁进行定位的?
relative: 相对定位,相对于自己本身在正常文档流中的位置进行定位 相对它原来的位置,在走100px.原来在标准流中的位置继续占有. absolute: 生成绝对定位,相对于最近一级定位不为s ...
- Java-文件下载案例
文件下载需求 1.页面显示超链接 2.点击超链接后弹出下载框 3.完成图片文件下载 分析 1.超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框.不满足需求 2.任 ...
- TP5.0学习笔记
TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文件夹,它叫做模块儿, ...
- oeasy教您玩转vim - 70 - # 折叠细节
折叠细节 回忆上次 上次我们讲的是折叠 折叠有很多options foldlevel - 显示折叠层次 foldcolumn - 折叠树宽度 foldmethod - 折叠方式 manual - ...
- .NET单元测试使用AutoFixture按需填充属性的几种方式,以及最佳实践
AutoFixture是一个.NET库,旨在简化单元测试中的数据设置过程.通过自动生成测试数据,它帮助开发者减少测试代码的编写量,使得单元测试更加简洁.易读和易维护.AutoFixture可以用于任何 ...
- memset函数&&bzro函数_C
// Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...