QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#470551 | #5504. Flower Garden | zyxawa | WA | 11ms | 110704kb | C++23 | 2.1kb | 2024-07-10 15:03:25 | 2024-07-10 15:03:25 |
Judging History
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!