95分MLE求助
查看原帖
95分MLE求助
531319
thomaswmy楼主2022/8/13 17:48

RT

按照老师的思路写的

但最后一个点不是WA就是MLE

#include <bits/stdc++.h>
using namespace std;
#define ll long
const int N=3e5+5;

int n,m,q;

struct Segment{
	int lc,rc;
	int sum;
	ll num;
	int lazy;
	#define lc(x) t[x].lc
	#define rc(x) t[x].rc
	#define sum(x) t[x].sum
	#define num(x) t[x].num
	#define lazy(x) t[x].lazy
}t[17100000];

int tot;

int build() {
	t[++tot]={0,0,0,0,0};
	return tot;
}

void pushdown(int id,int l,int r) {
	if(!lc(id)) lc(id)=build();
	if(!rc(id)) rc(id)=build();
	if(lazy(id)!=0) {
		int mid=l+r>>1;
		sum(lc(id))+=lazy(id)*(mid-l+1);
		lazy(lc(id))+=lazy(id);
		sum(rc(id))+=lazy(id)*(r-mid);
		lazy(rc(id))+=lazy(id);
		lazy(id)=0;
	}
}

void modify(int id,int L,int R,int l,int r,int val) {
	if(L>=l && R<=r) {
		sum(id)+=val*(R-L+1);
		lazy(id)+=val;
		return ;
	}
	pushdown(id,L,R);
	int mid=L+R>>1;
	if(mid>=l) modify(lc(id),L,mid,l,r,val);
	if(mid+1<=r) modify(rc(id),mid+1,R,l,r,val);
	sum(id)=sum(lc(id))+sum(rc(id));
}

void add(int id,int L,int R,int pos,int val,ll num) {
	if(L==R) {
		sum(id)+=val;
		num(id)=num;
		return ;
	}
	pushdown(id,L,R);
	int mid=L+R>>1;
	if(mid>=pos) add(lc(id),L,mid,pos,val,num);
	else add(rc(id),mid+1,R,pos,val,num);
	sum(id)=sum(lc(id))+sum(rc(id));
}

int binary(int id,int L,int R,int k) {
	if(L==R) return L;
	pushdown(id,L,R);
	int mid=L+R>>1;
	if(sum(lc(id))>=k) return binary(lc(id),L,mid,k);
	return binary(rc(id),mid+1,R,k-sum(lc(id)));
}

ll get(int id,int L,int R,int pos) {
	if(L==R) return num(id);
	pushdown(id,L,R);
	int mid=L+R>>1;
	if(mid>=pos) return get(lc(id),L,mid,pos);
	return get(rc(id),mid+1,R,pos);
}

int rtn[N],lenn[N];
int rtm,lenm;

void init() {
	for(int i=1;i<=n;i++) {
		rtn[i]=build();
		lenn[i]=m-1;
		if(m>1) modify(rtn[i],1,m-1+q,1,m-1,1);
	}
	rtm=build();
	lenm=n;
	modify(rtm,1,n+q,1,n,1);
}

int main() {
	scanf("%d%d%d",&n,&m,&q);
	init();
	for(int i=1;i<=q;i++) {
		int x,y;
		scanf("%d%d",&x,&y);
		if(y<m) {
			int pos=binary(rtn[x],1,m-1+q,y);
			ll ans;
			if(pos<=m-1) ans=(ll)m*(x-1)+pos;
			else ans=get(rtn[x],1,m-1+q,pos);
			add(rtn[x],1,m-1+q,pos,-1,0);
			pos=binary(rtm,1,n+q,x);
			if(pos<=n) add(rtn[x],1,m-1+q,++lenn[x],1,(ll)pos*m);
			else add(rtn[x],1,m-1+q,++lenn[x],1,get(rtm,1,n+q,pos));
			add(rtm,1,n+q,pos,-1,0);
			add(rtm,1,n+q,++lenm,1,ans);
			printf("%ld\n",ans);
		}
		else {
			int pos=binary(rtm,1,n+q,x);
			ll ans;
			if(pos<=n) ans=(ll)pos*m;
			else ans=get(rtm,1,n+q,pos);
			add(rtm,1,n+q,pos,-1,0);
			add(rtm,1,n+q,++lenm,1,ans);
			printf("%ld\n",ans);
		}
	}
	return 0;
}
2022/8/13 17:48
加载中...