QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#470551#5504. Flower GardenzyxawaWA 11ms110704kbC++232.1kb2024-07-10 15:03:252024-07-10 15:03:25

Judging History

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

  • [2024-07-10 15:03:25]
  • 评测
  • 测评结果:WA
  • 用时:11ms
  • 内存:110704kb
  • [2024-07-10 15:03:25]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
int t,n,m,a,b,c,d,tot,cnt,top,w[100001],sum[1000001],dfn[1000001],low[1000001],ins[1000001],stk[1000001],col[1000001];
basic_string <int> ans,G[1000001],S[1000001],E[1000001];
void build(int u,int l,int r){
	if(l==r) return (void)(G[l]+=u+n*3+m,G[u+n*15+m]+=l);
	int mid=(l+r)/2;
	build(u*2,l,mid),build(u*2+1,mid+1,r);
	G[u*2+n*3+m]+=u,G[u*2+1+n*3+m]+=u;
	G[u+n*15+m]+=u*2+n*15+m,G[u+n*15+m]+=u*2+1+n*15+m;
}
void link(int u,int l,int r,int L,int R,int k){
	if(L<=l&&r<=R) return (void)(k>0?G[u+n*3+m]+=k:G[-k]+=u+n*15+m);
	int mid=(l+r)/2;
	if(L<=mid) link(u*2,l,mid,L,R,k);
	if(R>mid) link(u*2+1,mid+1,r,L,R,k);
}
void tarjan(int u){
	low[u]=dfn[u]=++tot,ins[u]=1,stk[++top]=u;
	for(int v:G[u]){
		if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
		else if(ins[v]) low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]){
		col[u]=++cnt;
		while(stk[top]!=u) col[stk[top--]]=cnt;
		top--;
	}
}
void dfs(int x){
	for(int i:S[x]) ans+=i;
	for(int y:E[x]) dfs(y);
}
int calc(){
	ans.clear();
	for(int i=1;i<=cnt;i++){
		if(ans.size()<n&&S[i].size()<=n) for(int j:S[i]) ans+=j;
		sum[i]=S[i].size();
		for(int j:E[i]) sum[i]+=sum[j];
	}
	if(ans.size()>=n&&ans.size()<=n*2){
		for(int i:ans) w[i]=1;
		return 1;
	}
	for(int i=1;i<=cnt;i++) if(ans.empty()&&S[i].size()>=n&&S[i].size()<=n*2&&sum[i]>=n&&sum[i]<=n*2) dfs(i);
	if(ans.size()>=n&&ans.size()<=n*2){
		for(int i:ans) w[i]=1;
		return 1;
	}
	return 0;
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m),tot=cnt=0;
		for(int i=1;i<=m+n*27;i++) G[i].clear(),E[i].clear(),S[i].clear(),dfn[i]=low[i]=0;
		build(1,1,n*3);
		for(int i=1;i<=m;i++){
			scanf("%d%d%d%d",&a,&b,&c,&d);
			link(1,1,n*3,a,b,n*3+i);
			link(1,1,n*3,c,d,-n*3-i);
		}
		for(int i=1;i<=m+n*27;i++) tarjan(i);
		for(int i=1;i<=m+n*27;i++) for(int j:G[i]) if(col[i]!=col[j]) E[col[i]]+=col[j];
		for(int i=1;i<=n*3;i++) S[col[i]]+=i;
		if(!calc()) printf("NIE\n");
		else{
			printf("TAK\n");
			for(int i=1;i<=n*3;i++) printf(!w[i]?"R":"F"),w[i]=0;
			printf("\n");
		}
	}
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 11ms
memory: 110704kb

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
RFR
NIE

result:

wrong answer odpowiedz nie spelnia wymogow!