树状数组二分完为啥需要更新??
  • 板块CF1997E Level Up
  • 楼主elpsconr
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/31 17:29
  • 上次更新2024/7/31 19:22:01
查看原帖
树状数组二分完为啥需要更新??
1122530
elpsconr楼主2024/7/31 17:29

树状数组二分完为啥需要change(r,1)??

#include <bits/stdc++.h>
using namespace std;
 
#define N 200005
int n,q,a[N],c[N],k[N];
 
int lowbit(int x) {
	return x&(-x);
}
 
void change(int x,int k)
{
	while(x<=n) {
		c[x]+=k;
		x+=lowbit(x);
	}
}
 
int query(int x)
{
	int sum=0;
	while(x>0) {
		sum+=c[x];
		x-=lowbit(x);
	}
	return sum;
}
 
signed main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) {
		int l=0,r=n+1;
		while(l+1<r) {
			int mid=l+r>>1;
			int sum=query(mid);
			if(sum/mid<a[i]) r=mid;
			else l=mid;
		}
		k[i]=r;
      change(r,1);
	}
	while(q--) {
		int id,x; cin>>id>>x;
		if(k[id]<=x) cout<<"YES\n";
		else cout<<"NO\n";
	}
}
2024/7/31 17:29
加载中...