QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#523869#5504. Flower GardenzML 0ms0kbC++143.1kb2024-08-18 20:37:282024-08-18 20:37:28

Judging History

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

  • [2024-08-18 20:37:28]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:0kb
  • [2024-08-18 20:37:28]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int testNum,n,Q;
int ptNum,colNum,dfNum;
int t1[N],t2[N];
int sta[N],top;
bool vis[N],ins[N];
int dfn[N],low[N],col[N];
int out[N],num[N];
vector<int>G[N],T[N],R[N];
void add(int x,int y){
	G[x].push_back(y);
}
void Add(int x,int y){
	T[x].push_back(y);
	R[y].push_back(x);
	++out[x];
}
void build(int k,int l,int r){
	if(l==r) {t1[k]=t2[k]=l;return;}
	t1[k]=++ptNum,t2[k]=++ptNum;
	int mid=l+r>>1;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	add(t1[k*2],t1[k]);
	add(t1[k*2+1],t1[k]);
	add(t2[k],t2[k*2]);
	add(t2[k],t2[k*2+1]);
}
void add1(int k,int l,int r,int x,int y,int v){
	if(x<=l&&r<=y) {
		add(t1[k],v);
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) add1(k*2,l,mid,x,y,v);
	if(y>mid) add1(k*2+1,mid+1,r,x,y,v);
}
void add2(int k,int l,int r,int x,int y,int v){
	if(x<=l&&r<=y){
		add(v,t2[k]);
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) add2(k*2,l,mid,x,y,v);
	if(y>mid) add2(k*2+1,mid+1,r,x,y,v);
}
void tarjan(int u){
	dfn[u]=low[u]=++dfNum;
	ins[u]=1;
	sta[++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]){
		int t;
		++colNum;
		do{
			t=sta[top--];
			ins[t]=0;
			if(t<=n*3) ++num[colNum];
			col[t]=colNum;
		}while(t!=u);
	}
}
void init(){
	for(int i=1;i<=ptNum;i++) G[i].clear(),low[i]=dfn[i]=col[i]=0;
	for(int i=1;i<=colNum;i++) T[i].clear(),R[i].clear(),out[i]=num[i]=0,vis[i]=0;
	ptNum=colNum=dfNum=0;
}
int main(){
    scanf("%d",&testNum);
    while(testNum--){
        scanf("%d%d",&n,&Q);
        init();
        ptNum=n*3;
        build(1,1,n*3);
        int a,b,c,d;
        while(Q--){
            scanf("%d%d%d%d",&a,&b,&c,&d);
            ++ptNum;
            add1(1,1,n*3,a,b,ptNum);
            add2(1,1,n*3,c,d,ptNum);
        }
        for(int i=1;i<=ptNum;i++) if(!dfn[i]) tarjan(i);
        for(int i=1;i<=ptNum;i++){
        	for(int j:G[i])
        		if(col[i]!=col[j]) Add(col[i],col[j]);
        }
        queue<int> q;
        for(int i=1;i<=colNum;i++)
        	if(!out[i]) q.push(i);
        int now=0;
        bool f=0;
        while(!q.empty()){
        	int u=q.front();q.pop();
        	if(now+num[u]>n*2) continue;
        	now+=num[u];
        	vis[u]=1;
        	if(now>=n&&now<=n*2){
        		f=1;
        		while(!q.empty()) q.pop();
        		break;
        	}
        	for(int v:R[u])
        		if(!--out[v]) q.push(v);
        }
        for(int i=1;!f&&i<=colNum;i++)
        	if(num[i]>=n){
        		for(int j=1;j<=colNum;j++) vis[j]=0;
        		now=0;
        		q.push(i);
        		while(!q.empty()){
        			int u=q.front();
        			now+=num[u];
        			vis[u]=1;
        			for(int v:T[u]) if(!vis[v]) q.push(v);
        		}
        		if(now<=n*2) {f=1;break;}
        	}
        if(!f){
        	puts("NIE");
        	continue;
        }
		puts("TAK");
		for(int i=1;i<=n*3;i++)
			if(vis[col[i]]) putchar('F');
			else putchar('R');
		putchar('\n');
    }
    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:


result: