QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#439567#6872. Magma CaveAcoippML 0ms0kbC++143.8kb2024-06-12 11:25:172024-06-12 11:25:17

Judging History

你现在查看的是最新测评结果

  • [2024-06-12 11:25:17]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:0kb
  • [2024-06-12 11:25:17]
  • 提交

answer

#include<bits/stdc++.h>
#define ll int
#define inf 0x3f3f3f3f
#define get(x) (tr[tr[x].fa].ch[1]==x)
#define isroot(p) (tr[tr[p].fa].ch[0]!=p&&tr[tr[p].fa].ch[1]!=p)
#define N 100005
#define Q 1000005
using namespace std;
inline char nc(){
	static char buf[1000000],*p=buf,*q=buf;
	return p==q&&(q=(p=buf)+fread(buf,1,1000000,stdin),p==q)?EOF:*p++;
}
inline ll read(){
	ll res = 0;
	char c = nc();
	while(c<'0'||c>'9')c=nc();
	while(c<='9'&&c>='0')res=res*10+c-'0',c=nc();
	return res;
}
char obuf[1<<21],*p3=obuf; 
inline void pc(char c){ 
	p3-obuf<=(1<<20)?(*p3++=c):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=c); 
} 
inline void write(ll x){ 
	if(x<0) pc('-'),x=-x; 
	if(x>9) write(x/10); 
	pc(x%10+'0'); 
}
ll T,n,m,q,opt,u,v,w,vis[Q];
struct poly{ll x,y,z;};
inline poly max(poly a,poly b,poly c){
	if(a.z>=b.z&&a.z>=c.z) return a;
	if(b.z>=a.z&&b.z>=c.z) return b;
	return c;
}
struct node{ll ch[2],tag,fa;poly val,p;}emp;
struct bit{
	ll tr[Q];
	inline void add(ll k,ll x){
		while(k<=q) tr[k]+=x,k+=k&(-k);
	}
	inline ll query(ll k){
		ll num = 0;
		while(k) num+=tr[k],k-=k&(-k);
		return num;
	}
};
struct lct{
	ll m;
	node tr[N];
	map<ll,ll> maps[N];
	bit bitt;
	inline void pushup(ll p){tr[p].p = max(tr[tr[p].ch[0]].p,tr[tr[p].ch[1]].p,tr[p].val);}
	inline void pushtag(ll p){
		if(!p) return ;
		swap(tr[p].ch[0],tr[p].ch[1]),tr[p].tag^=1;
	}
	inline void pushdown(ll p){if(tr[p].tag) pushtag(tr[p].ch[0]),pushtag(tr[p].ch[1]),tr[p].tag=0;}
	inline void upd(ll p){pushup(p);if(!isroot(p)) upd(tr[p].fa);pushdown(p);}
	inline void rotate(ll p){
		ll y=tr[p].fa,z=tr[y].fa,k=get(p);
		if(!isroot(y)) tr[z].ch[tr[z].ch[1]==y]=p;
		tr[y].ch[k]=tr[p].ch[!k],tr[tr[p].ch[!k]].fa=y,tr[p].ch[!k]=y,tr[y].fa=p,tr[p].fa=z;
		pushup(y),pushup(p);
	}
	inline void splay(ll p){
		upd(p);
		for(ll f;f=tr[p].fa,!isroot(p);rotate(p)) if(!isroot(f)) rotate(get(f)==get(p)?f:p);
	}
	inline ll access(ll p){
		ll i;
		for(i=0;p;i=p,p=tr[p].fa) splay(p),tr[p].ch[1]=i,pushup(p);
		return i;
	}
	inline void makeroot(ll p){pushdown(p),access(p),splay(p),pushtag(p),pushup(p);}
	inline void link(ll x,ll y){
		makeroot(x),splay(x),tr[x].fa=y,pushup(x),pushup(y);
	}
	inline void cut(ll x,ll y){
		makeroot(x),access(y),splay(y),tr[x].fa=0,tr[y].ch[0]=0,pushup(x),pushup(y);
	}
	inline ll find(ll p){
		access(p),splay(p),pushdown(p);
		while(tr[p].ch[0]) p=tr[p].ch[0],pushdown(p);
		splay(p);
		return p;
	}
	inline poly query(ll x,ll y){return makeroot(x),access(y),splay(y),tr[y].p;}
	inline void add(ll u,ll v,ll w){
		if(find(u)!=find(v)){
			m++,tr[m].val = tr[m].p = (poly){u,v,w},link(u,m),link(m,v);
			bitt.add(w,1);
			maps[u][v] = maps[v][u] = w;
			return ;
		}
		poly res = query(u,v);
		if(res.z>w){
			ll id = maps[res.x][res.y];
			bitt.add(res.z,-1),bitt.add(w,1),maps[res.x][res.y] = maps[res.y][res.x] = 0,maps[u][v] = maps[v][u] = id;
			cut(res.x,id),cut(id,res.y),tr[id].val = tr[id].p = (poly){u,v,w},link(u,id),link(id,v);
		}
	}
	inline void clear(){
		for(ll i=1;i<=q;i++) bitt.tr[i]=0;
		for(ll i=1;i<=m;i++) tr[i]=emp;
		for(ll i=1;i<=n;i++) maps[i].clear();
	}
}lct1,lct2;
inline void add(ll u,ll v,ll w){
	vis[w] = 1,lct1.add(u,v,w),lct2.add(u,v,q-w+1);
}
inline void solve(){
	n=read(),q=read(),lct1.m = n,lct2.m = n;
	for(ll i=1;i<=q;i++){
		opt=read();
		if(opt==1) u=read(),v=read(),w=read(),add(u,v,w);
		else{
			u=read(),w=read();
			if(lct1.m==2*n-1&&vis[w]&&lct1.bitt.query(w)>=u&&lct2.bitt.query(q-w+1)<=u) pc('Y'),pc('E'),pc('S'),pc('\n');
			else pc('N'),pc('O'),pc('\n');
		}
	}
}
inline void clear(){
	for(ll i=1;i<=q;i++) vis[i]=0;
	lct1.clear(),lct2.clear();
}
int main(){
	T=read();
	while(T--){
		solve();
		clear();
	}
	return fwrite(obuf,p3-obuf,1,stdout),0;
}

詳細信息

Test #1:

score: 0
Memory Limit Exceeded

input:

100
500 1999
1 112 419 318
1 419 208 1700
1 208 255 603
1 255 202 306
1 202 54 326
1 54 468 1506
1 468 23 856
1 23 90 758
1 90 271 1104
1 271 442 1900
1 442 441 19
1 441 378 1227
1 378 466 24
1 466 186 228
1 186 399 1387
1 399 288 297
1 288 144 1763
1 144 418 1896
1 418 217 673
1 217 281 1259
1 281 ...

output:


result: