QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#523869 | #5504. Flower Garden | z | ML | 0ms | 0kb | C++14 | 3.1kb | 2024-08-18 20:37:28 | 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