QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#471170#5504. Flower Gardencppcppcpp3ML 0ms0kbC++143.3kb2024-07-10 18:57:562024-07-10 18:57:56

Judging History

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

  • [2024-07-10 18:57:56]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:0kb
  • [2024-07-10 18:57:56]
  • 提交

answer

#include<bits/stdc++.h>
#define pc putchar
using namespace std;
const int N=2e6+5;

static char buf[1000000],*p1=buf,*p2=buf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
inline int wrd(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+c-48;c=getchar();}return x*f;}
inline void write(long long x){static char buf[20];static int len=-1;if(x<0)putchar('-'),x=-x;do buf[++len]=x%10,x/=10;while(x);while(len>=0)putchar(buf[len--]+48);}

int sz,n,m,idx;
vector<int> g[N<<3];
void add(int u,int v){g[u].push_back(v);}

namespace SGT{
	#define ls (t<<1)
	#define rs (t<<1|1)
	#define md ((l+r)>>1)
	int s1[N<<2],s2[N<<2];
	
	void bld(int l,int r,int t){
		if(l==r) return s1[t]=s2[t]=l,void();
		s1[t]=++idx,s2[t]=++idx;
		bld(l,md,ls),bld(md+1,r,rs);
		add(s1[t],s1[ls]),add(s1[t],s1[rs]);
		add(s2[ls],s2[t]),add(s2[rs],s2[t]);
	}
	
	void ad(int l,int r,int t,int x,int y,int to){
		if(l>y || r<x) return;
		if(l>=x&&r<=y){to>0?add(s1[t],to):add(-to,s2[t]);return;}
		ad(l,md,ls,x,y,to),ad(md+1,r,rs,x,y,to);
	}
}

int low[N<<3],dfn[N<<3],bl[N<<3],st[N<<3],tot,sc,tp;
bool vs[N<<3];
int w[N<<3],deg[N<<3];

void dfs(int u){
	low[u]=dfn[u]=++tot,st[++tp]=u,vs[u]=1;
	for(int v:g[u]){
		if(!dfn[v]) dfs(v),low[u]=min(low[u],low[v]);
		else if(vs[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		bl[u]=++sc,w[sc]=u<=n;
		while(st[tp]^u)
			vs[st[tp]]=0,bl[st[tp]]=sc,
			w[sc]+=((st[tp]--)<=n); 
		vs[st[tp--]]=0;
	}
}

vector<int> pr[N<<3],sf[N<<3];

void clr(){
	for(int u=1;u<=idx;++u){
		g[u].clear();
		low[u]=dfn[u]=bl[u]=st[u]=w[u]=deg[u]=0;
	}
	tot=sc=tp=idx=0;
}

bool co[N<<3];
void co1(int u,int &cnt){
	if(co[u]) return;
	co[u]=1,cnt+=w[u];
	for(int v:pr[u]) co1(v,cnt);
}
void co2(int u,int &cnt){
	if(co[u]) return;
	co[u]=1,cnt+=w[u];
	for(int v:sf[u]) co1(v,cnt);
}
void clr(int u,int o){
	if(!co[u]) return;
	co[u]=0; for(int v:(o?pr[u]:sf[u])) clr(v,o);
}

void solve(){
	sz=wrd(),m=wrd(),n=3*sz,idx=n;
	SGT::bld(1,n,1);
	for(int i=1;i<=m;++i){
		int lx=wrd(),rx=wrd(),ly=wrd(),ry=wrd(),tt=++idx;
		SGT::ad(1,n,1,lx,rx,tt),SGT::ad(1,n,1,ly,ry,-tt);
	}
	for(int i=1;i<=idx;++i) if(!dfn[i]) dfs(i);
	for(int u=1;u<=idx;++u){
		for(int v:g[u]){
			if(bl[u]^bl[v]){
				pr[bl[v]].push_back(bl[u]);
				sf[bl[u]].push_back(bl[v]);
				++deg[bl[u]];
			}
		}
	}

	for(int i=1;i<=sc;++i){
		if(w[i]<sz) continue;
		int cnt=0;
		co1(i,cnt);
		if(cnt>=sz && cnt<=2*sz){
			puts("TAK");
			for(int pp=1;pp<=n;++pp) pc(co[bl[pp]]?'R':'F');
			puts("");
			clr(i,1);
			clr(); return;
		}
		clr(i,1);
		co2(i,cnt);
		if(cnt>=sz && cnt<=2*sz){
			puts("TAK");
			for(int pp=1;pp<=n;++pp) pc(co[bl[pp]]?'F':'R');
			puts("");
			clr(i,0);
			clr(); return;
		}
		clr(i,0);
	}
	
	queue<int> q; int cnt=0;
	for(int i=1;i<=sc;++i) if(!deg[i]) q.push(i);
	while(q.size()){
		int u=q.front(); q.pop();
		co[u]=1,cnt+=w[u];
		if(cnt>=sz && cnt<=2*sz){
			puts("TAK");
			for(int pp=1;pp<=n;++pp) pc(co[bl[pp]]?'F':'R');
			puts("");
			for(int i=1;i<=sc;++i) co[i]=0;
			clr(); return;
		}
		if(cnt>2*sz) break;
		for(int v:pr[u]) if(!--deg[v]) q.push(v);
	}
	puts("NIE");
	clr();
}

signed main(){
	int T=wrd();
	while(T--) solve();
	return 0;
}

详细

Test #1:

score: 0
Memory Limit Exceeded

input:

2
1 3
1 1 2 2
1 2 3 3
1 1 3 3
1 3
1 1 2 2
2 2 3 3
3 3 1 1

output:

TAK
RRF
NIE

result: