样例不过求调
查看原帖
样例不过求调
616964
Adolfo_North楼主2024/4/4 22:34
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
const int N=4e5+7;
const int M=2e5;
int n,m,cnt;
struct node{
	int flag,id,x1,x2,s;
}q[N],q1[N],q2[N];
int x[N],y[N],ss[N];
int ans[N];
int tr[N];
void add(int p,int sum){
	for(;p<=M;p+=p&-p) tr[p]+=sum;
}
int query(int p){
	int ans=0;
	for(;p;p-=p&-p) ans+=tr[p];
	return ans;
}
void Work(int l,int r,int L,int R){
	if(l>r) return;
	if(L==R){
		for(int i=l;i<=r;i++) if(q[i].flag) ans[L]++;
		return;
	}
	int mid=(L+R)>>1,p1=0,p2=0;
	for(int i=l;i<=r;i++){
		if(!q[i].flag){
			if(q[i].id<=mid) q1[++p1]=q[i],add(q[i].s,1);
			else q2[++p2]=q[i];
		}
		else{
			int sum=query(q[i].x2)-query(q[i].x1-1);
			if(q[i].s<=sum) q1[++p1]=q[i];
			else q[i].s-=sum,q2[++p2]=q[i];
		}
	}
//	cout<<l<<' '<<r<<' '<<L<<' '<<R<<' '<<p1<<' '<<p2<<'\n';
	Sleep(1000);
	for(int i=1;i<=p1;i++) if(!q1[i].flag) add(q1[i].s,-1);
	for(int i=1;i<=p1;i++) q[l+i-1]=q1[i];
	for(int i=1;i<=p2;i++) q[l+p1+i-1]=q2[i];
	Work(l,l+p1-1,L,mid);
	Work(l+p1,r,mid,R);
}
int main(){
//	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>x[i]>>y[i]>>ss[i];
	for(int i=1,li;i<=m;i++){
		cin>>li;
		q[++cnt]={0,i,0,0,li};
	}
	for(int i=1;i<=n;i++) q[++cnt]={1,i,x[i],y[i],ss[i]};
	Work(1,cnt,1,m+1);
	for(int i=1;i<=m;i++) cout<<ans[i];
	return 0;
}

2024/4/4 22:34
加载中...