整体二分Wa10个T1个求助
查看原帖
整体二分Wa10个T1个求助
220824
yyz1005楼主2023/11/27 16:11

按照第4篇题解写的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 300010;
const ll INF = 1e18;
ll n,m,k;
struct Question{
	ll id,l,r,val;
} q[N];
struct Node{
	ll id,dem;
};
Node p[N],p1[N],p2[N]; 
ll tree[N],ans[N];
vector<ll> core[N];
#define lowbit(x) (x&-x)
void add(ll id,ll x){
	for(; id <= m; id+=lowbit(id)) tree[id]+=x;
}
ll query(ll id){
	ll res = 0;
	for(; id; id-=lowbit(id)) res+=tree[id];
	return res;
}
ll read(){
	ll x = 0,h = 1;
	char ch = getchar();
	while(!(ch=='-'||('0'<=ch&&ch<='9'))) ch = getchar();
	if(ch=='-') h = -1;
	else x = ch-'0';
	ch = getchar();
	while('0'<=ch&&ch<='9'){
		x = x*10+ch-'0';
		ch = getchar();
	}
	return x*h;
}
void solve(ll l,ll r,ll L,ll R){
	if(L>R) return;
	if(l==r){
		//printf("[%lld,%lld]ans->%lld\n",L,R,l);
		for(ll i = L; i <= R; i++) ans[p[i].id] = l;
		return;
	}
	ll mid = (l+r)>>1,tot1 = 0,tot2 = 0;
	//printf("考虑第 %lld 到 %lld 的修改操作与 p 上的 %lld->%lld 区间----------\n",l,r,L,R);
	//printf("进行前一半操作...\n");
	for(ll i = l; i <= mid; i++){
		//printf("操作 %lld:[%lld,%lld]+%lld\n",i,q[i].l,q[i].r,q[i].val);
		if(q[i].l>q[i].r){
			add(q[i].l,q[i].val);
			add(m+1,-q[i].val);
			add(1,q[i].val);
			add(q[i].r+1,-q[i].val);
		} else {
			add(q[i].l,q[i].val);
			add(q[i].r+1,-q[i].val);
		}
	}
	for(ll i = L; i <= R; i++){
		//printf("p[%lld]: %lld 需求为 %lld\n",i,p[i].id,p[i].dem);
		ll sum = 0;
		for(auto v : core[p[i].id]){
			//printf("核心 %lld:%lld\n",v,query(v));
			sum+=query(v);
		}
		//printf("其核心地区总和 sum = %lld\n",sum);
		if(p[i].dem<=sum) p1[++tot1] = p[i];
		else p[i].dem-=sum,p2[++tot2] = p[i];
	}
	for(ll i = l; i <= mid; i++){
		if(q[i].l>q[i].r){
			add(q[i].l,-q[i].val);
			add(m+1,q[i].val);
			add(1,-q[i].val);
			add(q[i].r+1,q[i].val);
		} else {
			add(q[i].l,-q[i].val);
			add(q[i].r+1,q[i].val);
		}
	}
	for(ll i = L; i <= L+tot1-1; i++) p[i] = p1[i-L+1];
	for(ll i = L+tot1; i <= L+R; i++) p[i] = p2[i-L-tot1+1];
	//printf("DONE-------[%lld,%lld](%lld,%lld)\n",l,r,L,R);
	solve(l,mid,L,L+tot1-1);solve(mid+1,r,L+tot1,R);
}
int main(){
	n = read(),m = read();
	for(ll i = 1; i <= m; i++) core[read()].push_back(i);
	for(ll i = 1; i <= n; i++) p[i].dem = read(),p[i].id = i;
	k = read();
	for(ll i = 1; i <= k; i++){
		q[i].id = i;
		q[i].l = read(),q[i].r = read(),q[i].val = read();
	} 
	k++;
	q[k].id = k;
	q[k].l = 1,q[k].r = m,q[k].val = INF;
	solve(1,k,1,n);
	for(ll i = 1; i <= n; i++) if(ans[i]==k) puts("NIE"); else printf("%lld\n",ans[i]);
	return 0;
}
2023/11/27 16:11
加载中...