整体二分WA2求调
查看原帖
整体二分WA2求调
530468
_determination_楼主2024/2/23 16:04
#include<bits/stdc++.h>
#define int __int128
#define endl '\n'
using namespace std;
int n,m,k;
int t[300010];
int lowbit(int x){return x&(-x);}
void upd(int x,int p)
{
	while(x<=m)
	{
		t[x]+=p;
		x+=lowbit(x);
	}
}
int calc(int x)
{
	int ans=0;
	while(x)
	{
		ans+=t[x];
		x-=lowbit(x);
	}
	return ans;
}
vector<int>id_space[300010];
struct Rain{
	int l,r,a;
}R[300010];
struct Query{
	int id,l,r,mid;
}q[300010];
int need[300010];
int check()
{
	for ( int i = 1 ; i <= n ; i++ )
	{
		if(q[i].l<q[i].r)
		{
			return 1;
		}
	}
	return 0;
}
int cmp(Query p,Query q)
{
	return p.mid<q.mid;
}
int ans[300010];
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	long long readnum;
	cin >> readnum;
	n=readnum;
	cin >> readnum;
	m=readnum;
	for ( int i = 1 ; i <= m ; i++ )
	{
		cin >> readnum;
		int x=readnum;
		id_space[x].push_back(i);
	}
	for ( int i = 1 ; i <= n ; i++ )
	{
		cin >> readnum;
		need[i]=readnum;
	}
	cin >> readnum;
	k=readnum;
	for ( int i = 1 ; i <= k ; i++ )
	{
		cin >> readnum;
		R[i].l=readnum;
		cin >> readnum;
		R[i].r=readnum;
		cin >> readnum;
		R[i].a=readnum;
	}
	for ( int i = 1 ; i <= n ; i++ )
	{
		q[i].id=i;
		q[i].l=1;
		q[i].r=k;
	}
	while(check())
	{
		memset(t,0,sizeof(t));
		for ( int i = 1 ; i <= n ; i++ )
		{
			q[i].mid=(q[i].l+q[i].r)/2;
		}
//		for ( int i = 1 ; i <= n ; i++ )
//		{
//			cout << q[i].id << " ";
//		}
//		cout << endl;
//		for ( int i = 1 ; i <= n ; i++ )
//		{
//			cout << q[i].l << " ";
//		}
//		cout << endl;
//		for ( int i = 1 ; i <= n ; i++ )
//		{
//			cout << q[i].r << " ";
//		}
//		cout << endl;
//		for ( int i = 1 ; i <= n ; i++ )
//		{
//			cout << q[i].mid << " ";
//		}
//		cout << endl << endl;
		sort(q+1,q+1+n,cmp);
		int tot=1;
		for ( int i = 1 ; i <= n ; i++ )
		{
			while(tot<=q[i].mid)
			{
				int l=R[tot].l;
				int r=R[tot].r;
				int a=R[tot].a;
				if(l<=r)
				{
					upd(l,a);
					upd(r+1,-a);
				}else{
					upd(l,a);
					upd(1,a);
					upd(r+1,-a);
				}
				tot++;
			}
			int cnt=0,cn=q[i].id;
			for ( int j = 0 ; j < id_space[cn].size() ; j++ )
			{
				int id=id_space[cn][j];
				cnt+=calc(id);
			}
			if(cnt>=need[cn])
			{
				q[i].r=q[i].mid;
			}else{
				q[i].l=q[i].mid+1;
			}
		}
	}
	for ( int i = 1 ; i <= n ; i++ )
	{
		if(q[i].l==q[i].r)
		{
			ans[q[i].id]=q[i].r;
		}else{
			ans[q[i].id]=-1;
		}
	}
	for ( int i = 1 ; i <= n ; i++ )
	{
		if(ans[i]==-1)
		{
			cout << "NIE" <<endl;
		}else{
			long long output=ans[i];
			cout << output << endl;
		}
	}
	return 0;
}

Link

2024/2/23 16:04
加载中...