已AC,但有点小问题
查看原帖
已AC,但有点小问题
552454
洛苡hh楼主2024/1/26 08:38

rt

#include<bits/stdc++.h>
#define MAXN 600005
#define inf 1000000000
using namespace std;

inline long long read(){
	long long x=0;
	char c=getchar();
	while(c<'0' || c>'9'){
		c=getchar();
	}
	while(c>='0' && c<='9'){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x;
}

int n,m,k;
long long c[MAXN];
vector<int> edge[MAXN];
struct node1{
	int l,r;
	long long val;
}a[MAXN];
struct node2{
	long long nd;
	int id;
}p[MAXN],tmp[MAXN];
int ans[MAXN];

int lowbit(int x){
	return x&(-x);
}

void update(int x,long long v){
	while(x<=2*m){
		c[x]+=v;
		x+=lowbit(x);
	}
}

long long query(int x){
	long long res=0;
	while(x){
		res+=c[x];
		x-=lowbit(x);
	}
	return res;
}

void whole_bny(int l,int r,int ql,int qr){
	if(qr<ql) return;
	if(l==r){
		for(int i=ql;i<=qr;i++){
			ans[p[i].id]=l;
		}
		return;
	}
	int mid=(l+r)>>1;
	for(int i=l;i<=mid;i++){
		update(a[i].l,a[i].val);
		update(a[i].r+1,-a[i].val);
	}
	int cnt1=0,cnt2=n;
	for(int i=ql;i<=qr;i++){
		long long sum=0;
		for(auto y:edge[p[i].id]){
			sum+=query(y)+query(y+m);
			if(sum>p[i].nd) break;
		}
		if(sum>=p[i].nd){
			tmp[++cnt1]=p[i]; 
		}else{
			tmp[++cnt2]=p[i];
			tmp[cnt2].nd-=sum;
		}
	}
	for(int i=l;i<=mid;i++){
		update(a[i].l,-a[i].val);
		update(a[i].r+1,a[i].val);
	}
	for(int i=1;i<=cnt1;i++){
		p[ql+i-1]=tmp[i]; 
	}
	for(int i=n+1;i<=cnt2;i++){
		p[ql+cnt1+i-n-1]=tmp[i];
	}
	whole_bny(l,mid,ql,ql+cnt1-1);
	whole_bny(mid+1,r,ql+cnt1,qr);
}
 
int main(){
	n=read();m=read();
	int o;
	for(int i=1;i<=m;i++){
		o=read();
		edge[o].push_back(i);
	}
	for(int i=1;i<=n;i++){
		p[i].nd=read();
		p[i].id=i;
	}
	k=read();
	for(int i=1;i<=k;i++){
		a[i].l=read();
		a[i].r=read();
		a[i].val=read();
		if(a[i].r<a[i].l) a[i].r+=m;
	}
	whole_bny(1,k+1,1,n);
	for(int i=1;i<=n;i++){
		if(ans[i]>k){
			puts("NIE");
		}else{
			printf("%d\n",ans[i]);
		}
	}
	return 0;
}

之前一直90pts调不出来 但在统计陨石数量的部分加上 if(sum>p[i].nd) break;就莫名可以了 但又想了想没看出来有什么本质区别 有没有佬教教QwQ

2024/1/26 08:38
加载中...