这场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*