树状数组求条
查看原帖
树状数组求条
1389468
ZHAOJJzjj123楼主2025/8/4 20:27

全蛙求条

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,s,a[N],c[N],e[N];
struct node{
	int l,t;
}p[N];
bool cmp(node x,node y){
	return x.t<y.t;
}
int lowbit(int x){
	return x&(-x);
}
void add_c(int x,int v){
	for(int i=x;i<=1e5;i+=lowbit(i)){
		c[i]+=v;
	}
}
int find_c(int x){
	int ans=0;
	for(int i=x;i;i-=lowbit(i)){
		ans+=c[i];
	}
	return ans;
}
void add_e(int x,int v){
	for(int i=x;i<=1e5;i+=lowbit(i)){
		e[i]+=v;
	}
}
int find_e(int x){
	int ans=0;
	for(int i=x;i;i-=lowbit(i)){
		ans+=e[i];
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&s);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&p[i].l,&p[i].t);
	}
	sort(p+1,p+1+n,cmp);
	int ans=0,sum=0;
	for(int i=1;i<=n;i++){
		sum+=p[i].t;
		ans+=p[i].l-sum;
		add_c(p[i].t,1);
		add_e(p[i].t,p[i].t);
	}
	printf("%d\n",ans);
	while(s--){
		int d,l,t;
		scanf("%d%d%d",&d,&l,&t);
		int cnt=find_c(t)-find_c(p[d].t);
		ans+=cnt*p[d].t;
		int cou=find_c(1e5)-find_c(t);
		ans-=cou*(t-p[d].t);
		ans-=p[d].l-find_e(p[d].t);
		add_c(p[d].t,-1);
		add_e(p[d].t,-p[d].t);
		add_c(t,1);
		add_e(t,t);
		p[d].l=l;
		p[d].t=t;
		ans+=p[d].l-find_e(p[d].t);
		printf("%d\n",ans);
	}
	return 0;
}
2025/8/4 20:27
加载中...