整体二分WA#11求调,悬赏一个关注
查看原帖
整体二分WA#11求调,悬赏一个关注
727076
hexz01楼主2023/10/25 19:59
#include <iostream>
#include <vector>
using namespace std;
const int DOWN=1, UP=-1;
const int N=3e5+7;
typedef long long ll;
int n, m, k;
vector<int> o[N];
struct seg{
	ll l, r, A;
}s[N];
ll p[N], id[N], ans[N], LL[N], rr[N];
struct TR{
	ll tree[N];
	int lowbit(int x){
		return (x&(-x));
	}
	void update(int x, ll y){
		while(x<=m){
			tree[x]+=y;
			x+=lowbit(x);
		}
	}
	ll query(int x){
		ll sum=0;
		while(x){
			sum+=tree[x];
			x-=lowbit(x);
		}
		return sum;
	}
	void add(int l, int r, ll v){
		update(l, v);update(r+1, -v);
	}
}T;
void meteor(int l, int r, ll mode){
	for(int i=l;i<=r;i++){
		if(s[i].l<=s[i].r){
			T.add(s[i].l, s[i].r, s[i].A*mode);
		}else{
			T.add(s[i].l, m, s[i].A*mode);
			T.add(1, s[i].r, s[i].A*mode);
		}
	}
}
int check(int L, int R){
	int tot1=0, tot2=0;
	for(int i=L;i<=R;i++){//id[i]
		ll sum=0;
		for(int j=0;j<o[id[i]].size();j++){
			sum+=T.query(o[id[i]][j]);
		}
		if(sum>=p[id[i]])
			LL[++tot1]=id[i];
		else
			rr[++tot2]=id[i];
	}
	for(int i=1;i<=tot1;i++)
		id[L+i-1]=LL[i];
	for(int i=1;i<=tot2;i++)
		id[L+tot1+i-1]=rr[i];
	return tot1;
}
void solve(int l, int r, int L, int R){
	if(l>r || L>R) return;
	if(l==r){
		for(int i=L;i<=R;i++){
			ans[id[i]]=l;
		}
		return;
	}
	int mid=(l+r)>>1;
	meteor(l, mid, DOWN);
	int tot1=check(L, R);
	solve(mid+1, r, L+tot1, R);
	meteor(l, mid, UP);
	solve(l, mid, L, L+tot1-1);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x;
		cin>>x;
		o[x].push_back(i);
	}
	for(int i=1;i<=n;i++){
		id[i]=i;
		cin>>p[i];
	}
	cin>>k;
	for(int i=1;i<=k;i++){
		cin>>s[i].l>>s[i].r>>s[i].A;
	}
    s[k+1].l=1;s[k+1].r=m;s[k+1].A=1000000000;
	solve(1, k+1, 1, n);
	for(int i=1;i<=n;i++){
		if(ans[i]==k+1)
			cout<<"NIE"<<endl;
		else
			cout<<ans[i]<<endl;
	}
	return 0;
}
2023/10/25 19:59
加载中...