MnZn不过样例值域线段树求调
查看原帖
MnZn不过样例值域线段树求调
299922
atarashiTLE楼主2023/9/24 12:53

Rt.能过样例就行(

感觉写了一坨屎山(

#include<bits/stdc++.h>
#define re register
#define N 2000010
using namespace std;
inline int read(){
	char c;int t=1,ans;
	while(!isdigit(c=getchar()))
		if(c=='-')t=-t;
	ans=c-'0';
	while(isdigit(c=getchar()))
		ans=ans*10+c-'0';
	return ans;
}
struct pii{long long first;int second;pii(){};pii(long long a,int b):first(a),second(b){};};
pii mp(long long a,int b){return pii(a,b);}
bool operator < (const pii a,const pii b){return a.first<b.first;} 
int n,m,p,x,y,k,tmp,pearl,op,nwtp=5,tps[N],l,argy[N],tp,lbtps[N];
map<int,int> maap;
struct sgm_pre{
	int L,R,lson,rson,bh,sum;
	pii ans;
	sgm_pre(){};
	sgm_pre(int lb,int rb,int bih){L=ans.second=lb,R=rb,ans.first=lson=rson=sum=0,bh=bih;}
};
struct Segment_tree{
	sgm_pre arr[N];
	void pushup(int tag){
		arr[tag].sum=(arr[arr[tag].lson].sum+arr[arr[tag].rson].sum);
		arr[tag].ans=max(arr[arr[tag].lson].ans,arr[arr[tag].rson].ans);
		if(arr[arr[tag].lson].ans.second==arr[arr[tag].rson].ans.second)arr[tag].ans=mp(arr[arr[tag].lson].ans.first+arr[arr[tag].rson].ans.first,arr[arr[tag].lson].ans.second);
	}
	void add(int tag,int pos,int c){
		if(arr[tag].L==pos&&arr[tag].R==pos){
 			arr[tag].ans.first+=c;
 			arr[tag].sum+=c;
			return;
		}
		if(!arr[tag].lson)
			++nwtp,arr[tag].lson=nwtp,arr[arr[tag].lson]=sgm_pre(arr[tag].L,(arr[tag].L+arr[tag].R)>>1,nwtp);
		if(!arr[tag].rson)
			++nwtp,arr[tag].rson=nwtp,arr[arr[tag].rson]=sgm_pre(1+((arr[tag].L+arr[tag].R)>>1),arr[tag].R,nwtp);
		if(pos<=((arr[tag].L+arr[tag].R)>>1)){
			if(!arr[tag].lson)
				++nwtp,arr[tag].lson=nwtp,arr[arr[tag].lson]=sgm_pre(arr[tag].L,(arr[tag].L+arr[tag].R)>>1,nwtp);
			add(arr[tag].lson,pos,c);
		}
		else{
			if(!arr[tag].rson)
				++nwtp,arr[tag].rson=nwtp,arr[arr[tag].rson]=sgm_pre(1+((arr[tag].L+arr[tag].R)>>1),arr[tag].R,nwtp);
			add(arr[tag].rson,pos,c);
		}
		pushup(tag);
	}
	pii ask1(int tag,int l,int r){
		if(!tag)return mp(-19191919,11115555);
		if(arr[tag].L>=l&&arr[tag].R<=r)
			return arr[tag].ans;
		if(r<=arr[arr[tag].lson].R)
			return ask1(arr[tag].lson,l,r);
		if(l>=arr[arr[tag].rson].L)
			return ask1(arr[tag].rson,l,r);
		return max(ask1(arr[tag].lson,l,arr[arr[tag].lson].L),ask1(arr[tag].rson,arr[arr[tag].rson].R,r));
	}
	int ask2(int tag=1,int l=0,int r=0){
		if(!tag)return 0;
		if(arr[tag].L>=l&&arr[tag].R<=r)
			return arr[tag].sum;
		if(r<=arr[arr[tag].lson].R)
			return ask2(arr[tag].lson,l,r);
		if(l>=arr[arr[tag].rson].L)
			return ask2(arr[tag].rson,l,r);
		return (ask2(arr[tag].lson,l,arr[arr[tag].lson].L)+ask2(arr[tag].rson,arr[arr[tag].rson].R,r));
	}
	void merge(int frm,int to,int copy){
		if(!arr[frm].sum)
			return arr[copy]=arr[to],void();
		if(!arr[to].sum)
			return arr[copy]=arr[frm],void();
		if(arr[copy].L==arr[copy].R){
			arr[copy].sum=(arr[to].sum+arr[frm].sum);
			arr[copy].ans=max(arr[to].ans,arr[frm].ans);
			if(arr[to].ans.second==arr[frm].ans.second)arr[copy].ans=mp(arr[to].ans.first+arr[frm].ans.first,arr[to].ans.second);
			return;
		}
		if(!arr[copy].lson)
			++nwtp,arr[copy].lson=nwtp,arr[arr[copy].lson]=sgm_pre(arr[copy].L,(arr[copy].L+arr[copy].R)>>1,nwtp);
		if(!arr[copy].rson)
			++nwtp,arr[copy].rson=nwtp,arr[arr[copy].rson]=sgm_pre(1+((arr[copy].L+arr[copy].R)>>1),arr[copy].R,nwtp);
		merge(arr[frm].lson,arr[to].lson,arr[copy].lson);
		merge(arr[frm].rson,arr[to].rson,arr[copy].rson);
		pushup(copy);
		return; 
	}
}T;
list<int> lb[500010];
vector<int> A[500010];
signed main(){
	n=read();m=read();
	for(re int i=1;i<=n;i++){
		l=read();
		A[i]=vector<int>(l);
		for(int j=0;j<l;j++)
			argy[++tp]=A[i][j]=read();
	}
	sort(argy+1,argy+1+tp);//1专门用于TEMP 
	for(int i=1;i<=tp;i++)if(!maap[argy[i]])maap[argy[i]]=++pearl,argy[pearl]=argy[i];
	for(int i=1;i<=n;i++){
		tps[i]=++nwtp;
		T.arr[tps[i]]=sgm_pre(1,524288,tps[i]);
		for(unsigned int j=0;j<A[i].size();j++)
			T.add(tps[i],maap[A[i][j]],1),lb[i].push_back(A[i][j]);
	}
	while(m--){
		op=read();
		if(op==1){
			x=read();k=read();
			if(!maap[k])maap[k]=++pearl,argy[pearl]=k;
			T.add(tps[x],maap[k],1);
		}
		else if(op==2){
			x=read();
			T.add(tps[x],lb[x].back(),-1);
			lb[x].pop_back();
		}
		else if(op==3){
			y=read();
			T.arr[1]=sgm_pre(1,524288,1);
			T.arr[2]=sgm_pre(1,524288,1);
			while(y--){
				k=read();
				T.merge(1,tps[k],2);
				T.arr[1]=T.arr[2];
			}
			pii tamp=T.ask1(1,1,524288);
			if(T.ask2(1,tamp.second,tamp.second)*2<=T.ask2(1,1,524288))
				cout<<-1<<endl;
			else
				cout<<argy[tamp.second]<<endl;
		}
		else{
			k=read();y=read();tmp=read();
			tps[tmp]=++nwtp;
			T.arr[tps[tmp]]=sgm_pre(1,524288,tmp);
			T.merge(tps[y],tps[k],tps[tmp]);
			list<int> TEMP(lb[k]);
			lb[tmp].splice(lb[tmp].end(),TEMP);
			TEMP=lb[y]; 
			lb[tmp].splice(lb[tmp].end(),TEMP);
		}
	}
	return 0;
}
2023/9/24 12:53
加载中...