QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#99079 | #5504. Flower Garden | ice_cup | WA | 12ms | 121488kb | C++14 | 4.5kb | 2023-04-21 10:23:55 | 2023-04-21 10:23:58 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
int z,n,Q,head[5001000],to[10001000],nxt[10001000],v[5001000],cnt,tot;
int head1[5001000],to1[10001000],nxt1[10001000],cnt1;
int tr1[100100<<2],tr2[100100<<2];
int dfn[5001000],low[5001000],s[5001000],t,be[5001000],val[5001000],bel,tim,vis[5001000];
int c[5000100];
vector<int>dfs[5000100];
int in[5000100],d[5000100];
int ans=0;
void add(int u,int e){
nxt[++cnt]=head[u];
to[cnt]=e;
head[u]=cnt;
}
void addd(int u,int e){
nxt1[++cnt1]=head1[u];
to1[cnt1]=e;
head1[u]=cnt1;
}
#define ls p<<1
#define rs p<<1|1
#define MID int mid=(l+r)>>1
void build1(int l,int r,int p){
if(l==r){
tr1[p]=l;
v[tr1[p]]=1;
return;
}
tr1[p]=++tot;
MID;
build1(l,mid,ls),build1(mid+1,r,rs);
add(tr1[ls],tr1[p]),add(tr1[rs],tr1[p]);
}
void build2(int l,int r,int p){
if(l==r){
tr2[p]=l;
v[tr2[p]]=1;
return;
}
tr2[p]=++tot;
MID;
build2(l,mid,ls),build2(mid+1,r,rs);
add(tr2[p],tr2[ls]),add(tr2[p],tr2[rs]);
}
void link1(int l,int r,int lin,int rin,int p,int point){
// if(Q==93700)cout<<l<<' '<<r<<' '<<lin<<' '<<rin<<endl;
if(l==lin&&r==rin){
add(tr1[p],point);
return;
}
MID;
if(rin<=mid)link1(l,mid,lin,rin,ls,point);
else if(lin>mid)link1(mid+1,r,lin,rin,rs,point);
else link1(l,mid,lin,mid,ls,point),link1(mid+1,r,mid+1,rin,rs,point);
}
void link2(int l,int r,int lin,int rin,int p,int point){
// cout<<l<<' '<<r<<' '<<lin<<' '<<rin<<endl;
if(l==lin&&r==rin){
add(point,tr2[p]);
return;
}
MID;
if(rin<=mid)link2(l,mid,lin,rin,ls,point);
else if(lin>mid)link2(mid+1,r,lin,rin,rs,point);
else link2(l,mid,lin,mid,ls,point),link2(mid+1,r,mid+1,rin,rs,point);
}
void tarjan(int u){
low[u]=dfn[u]=++tim;
s[++t]=u;
for(int i=head[u];i;i=nxt[i]){
if(!dfn[to[i]]){
tarjan(to[i]);//if(u==3)cout<<to[i]<<' '<<low[to[i]]<<endl;
low[u]=min(low[u],low[to[i]]);
}
else if(!vis[to[i]])low[u]=min(low[u],dfn[to[i]]);
}
if(low[u]==dfn[u]){
bel++;
// cout<<"oh "<<u<<endl;
while(s[t+1]!=u){
// cout<<s[t]<<' ';
be[s[t]]=bel;
vis[s[t]]=1;
val[bel]+=v[s[t]];
t--;
}
// cout<<endl;
}
}
queue<int>q;
int bfs1(int s){
q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
c[u]=1;
ans+=val[u];
for(int i=head1[u];i;i=nxt1[i]){
if(!vis[to1[i]])q.push(to1[i]),vis[to1[i]]=1;
}
}
return ans;
}
void bfs(){
for(int i=1;i<=bel;i++){
d[i]=-1;
if(!in[i])q.push(i),d[i]=0;
}
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=0;
// cout<<u<<' '<<d[u]<<endl;
for(int i=head1[u];i;i=nxt1[i]){
if(d[to1[i]]<d[u]+(val[to1[i]]!=0)){
d[to1[i]]=d[u]+(val[to1[i]]!=0);
if(!vis[to1[i]])q.push(to1[i]);
}
}
}
}
void solve(){
cin>>n>>Q;
tot=3*n;
build1(1,3*n,1);
build2(1,3*n,1);
int a1,a2,b1,b2;
while(Q--){
scanf("%d%d%d%d",&a1,&a2,&b1,&b2);
if(a2<a1)swap(a1,a2);
if(b2<b1)swap(b1,b2);
int ne=++tot;
link1(1,3*n,a1,a2,1,ne);
link2(1,3*n,b1,b2,1,ne);
}
// for(int u=1;u<=tot;u++){
// cout<<"p "<<u<<endl;
// for(int i=head[u];i;i=nxt[i]){
// cout<<to[i]<<' ';
// }
// cout<<endl;
// }
for(int i=1;i<=tot;i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int u=1;u<=tot;u++){
for(int i=head[u];i;i=nxt[i]){
if(be[u]!=be[to[i]]){
addd(be[u],be[to[i]]);
in[be[to[i]]]++;
// cout<<to[i]<<' ';
}
}
vis[u]=0;
}
int f=0;
for(int i=1;i<=bel;i++){
if(val[i]>n){
int re=bfs1(i);
if(re>=n&&re<=2*n){
f=1;
cout<<"TAK\n";
for(int i=1;i<=3*n;i++){
if(c[be[i]]==1)cout<<'F';
else cout<<'R';
}
cout<<'\n';
break;
}
else{
f=1;
cout<<"NIE\n";
}
}
}
if(!f){
bfs();
for(int i=1;i<=bel;i++){
if(val[i]){
dfs[d[i]].push_back(i);
cout<<d[i]<<' ';
}
}
int ans=0;
for(int i=1;i<=bel;i++){
for(int j=0;j<dfs[i].size();j++){
ans+=val[dfs[i][j]];
c[dfs[i][j]]=1;
if(ans<=2*n&&ans>=n)break;
}
if(ans<=2*n&&ans>=n)break;
}
cout<<"TAK\n";
for(int i=1;i<=3*n;i++){
if(c[be[i]]==0)cout<<'F';
else cout<<'R';
}
cout<<'\n';
}
cnt=cnt1=t=0;
for(int i=1;i<=tot;i++){
head[i]=head1[i]=0;
dfn[i]=low[i]=0;
v[i]=0;
}
tot=0;
for(int i=1;i<=bel;i++){
head1[i]=0;
be[i]=val[i]=c[i]=in[i]=0;
vis[i]=d[i]=0;
dfs[i].clear();
}
bel=0;
}
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
cin>>z;
while(z--)solve();
}
/*
1
6 6
14 18 14 15
18 16 14 17
8 3 12 16
8 1 10 18
10 18 15 17
15 3 15 17
*/
詳細信息
Test #1:
score: 0
Wrong Answer
time: 12ms
memory: 121488kb
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:
3 2 1 TAK RFF NIE
result:
wrong answer zla odpowiedz!