题目链接
题意:给定了一个长度为n的 只有0/1组成的数列,给出t行,每行给出一个整数k,可以询问若干次区间和,然后输出第k个0所在的位置下标。 总的询问次数不超过6e4。每次输出结果之后把第k个0改成1。
(1<=t<=1e4 , 1<=n<=2e5 保证第k个0一定存在。 )
分析:首先可以想到二分,但是这里又涉及单点修改。所以可以用线段树来维护区间和。 可以用数组vis[i]标记以i为根的区间的区间和是否已知。 细节见代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int maxn = 2e5+10;
const int mx = 40;
const int mod = 1e9+7;
const ll inf = 0x3f3f3f3f3f3f3f3f;
const int INF = 1e9+7;
int tree[maxn<<2];
bool vis[maxn<<2];//是否已经 线段树i号节点对应的区间是否已知
inline int lc(int rt