Guess the K-th Zero (Hard version) (交互式,二分)

TP这场div3和另一场div2都有交互式的题目,以前很少接触CF上面的交互式题目,还是挺有意思的。在c++里,要得到交互式的答案只需要输出的时候注意用endl或者cout.flush()即可,得到的答案可以直接用cin存到变量里。easy version的题目很简单,直接二分位置即可。hard version在easy的基础上多增加了询问和改变值的操作,注意到题目只给了6n次的询问机会,如果和easy version一样粗暴的使用二分,时间复杂度可以接受,但是询问的次数不够用了。所以我们需要把询
摘要由CSDN通过智能技术生成

TP

这场div3和另一场div2都有交互式的题目,以前很少接触CF上面的交互式题目,还是挺有意思的。
在c++里,要得到交互式的答案只需要输出的时候注意用endl或者cout.flush()即可,得到的答案可以直接用cin存到变量里。

easy version的题目很简单,直接二分位置即可。
hard version在easy的基础上多增加了询问和改变值的操作,注意到题目只给了6n次的询问机会,如果和easy version一样粗暴的使用二分,时间复杂度可以接受,但是询问的次数不够用了。
所以我们需要把询问得到的答案存下来,这样次数就够用了,但产生了一个新的问题,每次输出答案后数组都会把当前的0变成1,所以只把答案存下来是不够的,需要用一个数据结构去维护这个答案,这里采用了支持区间加和单点查询的线段树解决问题,要注意一下,当询问的位置有lazy标记且该点从未询问过的时候,要把这个点的lazy清空。

代码:

#define fir(i,a,b) for(int i = a;i <= b; ++ i)
#define afir(i,a,b) for(int i = a;i >= b; -- i)
#define LL long long
#define vi vector<int>
#define pb push_back
#define ALL(a) a.begin(),a.end()
#define mpr make_pair
#define pii pair<int,int>
#define ft first
#define sd second
#include <bits/stdc++.h>

using namespace std;
const int N = 2e5+10;

namespace seg{
   
	#define ls 2*i
	#define rs 2*i+1
	int lz[N*4],a[N*4],v[N*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值