分析
题意就是,在q不断增加的过程中,第几个操作之后就会出现某个输入中的区间当中1的个数大于0的个数。
首先想到这是一个单点修改区间查询,指向树状数组。
然后这里答案又具有单调性,一个比较显然的二分。
但是比赛中没有把这两个想法很好地整合,于是打了一个超时的树状数组。其实关键要跳出单点修改区间查询的惯性思维,看到只有0,1,所以只要一个前缀和就可以求出任意区间1的数量。
这样就很好的适配了二分答案的复杂度,每二分一次就枚举区间前缀和暴力判断。转化为一道签到题。
二分答案的特征:前面都是相同情况,某个操作之后有不同情况
上代码
树状数组
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int t,n,m,q;
int l[100010],r[100010];
int c[1000100];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int y)
{
for(int i=x;i<=n;i+=lowbit(i)) c[i]+=y;
}
int query(int x)
{
int ans=0;
for(int i=x;i;i-=lowbit(i))
{
ans