QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#471170 | #5504. Flower Garden | cppcppcpp3 | ML | 0ms | 0kb | C++14 | 3.3kb | 2024-07-10 18:57:56 | 2024-07-10 18:57:56 |
answer
#include<bits/stdc++.h>
#define pc putchar
using namespace std;
const int N=2e6+5;
static char buf[1000000],*p1=buf,*p2=buf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
inline int wrd(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+c-48;c=getchar();}return x*f;}
inline void write(long long x){static char buf[20];static int len=-1;if(x<0)putchar('-'),x=-x;do buf[++len]=x%10,x/=10;while(x);while(len>=0)putchar(buf[len--]+48);}
int sz,n,m,idx;
vector<int> g[N<<3];
void add(int u,int v){g[u].push_back(v);}
namespace SGT{
#define ls (t<<1)
#define rs (t<<1|1)
#define md ((l+r)>>1)
int s1[N<<2],s2[N<<2];
void bld(int l,int r,int t){
if(l==r) return s1[t]=s2[t]=l,void();
s1[t]=++idx,s2[t]=++idx;
bld(l,md,ls),bld(md+1,r,rs);
add(s1[t],s1[ls]),add(s1[t],s1[rs]);
add(s2[ls],s2[t]),add(s2[rs],s2[t]);
}
void ad(int l,int r,int t,int x,int y,int to){
if(l>y || r<x) return;
if(l>=x&&r<=y){to>0?add(s1[t],to):add(-to,s2[t]);return;}
ad(l,md,ls,x,y,to),ad(md+1,r,rs,x,y,to);
}
}
int low[N<<3],dfn[N<<3],bl[N<<3],st[N<<3],tot,sc,tp;
bool vs[N<<3];
int w[N<<3],deg[N<<3];
void dfs(int u){
low[u]=dfn[u]=++tot,st[++tp]=u,vs[u]=1;
for(int v:g[u]){
if(!dfn[v]) dfs(v),low[u]=min(low[u],low[v]);
else if(vs[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
bl[u]=++sc,w[sc]=u<=n;
while(st[tp]^u)
vs[st[tp]]=0,bl[st[tp]]=sc,
w[sc]+=((st[tp]--)<=n);
vs[st[tp--]]=0;
}
}
vector<int> pr[N<<3],sf[N<<3];
void clr(){
for(int u=1;u<=idx;++u){
g[u].clear();
low[u]=dfn[u]=bl[u]=st[u]=w[u]=deg[u]=0;
}
tot=sc=tp=idx=0;
}
bool co[N<<3];
void co1(int u,int &cnt){
if(co[u]) return;
co[u]=1,cnt+=w[u];
for(int v:pr[u]) co1(v,cnt);
}
void co2(int u,int &cnt){
if(co[u]) return;
co[u]=1,cnt+=w[u];
for(int v:sf[u]) co1(v,cnt);
}
void clr(int u,int o){
if(!co[u]) return;
co[u]=0; for(int v:(o?pr[u]:sf[u])) clr(v,o);
}
void solve(){
sz=wrd(),m=wrd(),n=3*sz,idx=n;
SGT::bld(1,n,1);
for(int i=1;i<=m;++i){
int lx=wrd(),rx=wrd(),ly=wrd(),ry=wrd(),tt=++idx;
SGT::ad(1,n,1,lx,rx,tt),SGT::ad(1,n,1,ly,ry,-tt);
}
for(int i=1;i<=idx;++i) if(!dfn[i]) dfs(i);
for(int u=1;u<=idx;++u){
for(int v:g[u]){
if(bl[u]^bl[v]){
pr[bl[v]].push_back(bl[u]);
sf[bl[u]].push_back(bl[v]);
++deg[bl[u]];
}
}
}
for(int i=1;i<=sc;++i){
if(w[i]<sz) continue;
int cnt=0;
co1(i,cnt);
if(cnt>=sz && cnt<=2*sz){
puts("TAK");
for(int pp=1;pp<=n;++pp) pc(co[bl[pp]]?'R':'F');
puts("");
clr(i,1);
clr(); return;
}
clr(i,1);
co2(i,cnt);
if(cnt>=sz && cnt<=2*sz){
puts("TAK");
for(int pp=1;pp<=n;++pp) pc(co[bl[pp]]?'F':'R');
puts("");
clr(i,0);
clr(); return;
}
clr(i,0);
}
queue<int> q; int cnt=0;
for(int i=1;i<=sc;++i) if(!deg[i]) q.push(i);
while(q.size()){
int u=q.front(); q.pop();
co[u]=1,cnt+=w[u];
if(cnt>=sz && cnt<=2*sz){
puts("TAK");
for(int pp=1;pp<=n;++pp) pc(co[bl[pp]]?'F':'R');
puts("");
for(int i=1;i<=sc;++i) co[i]=0;
clr(); return;
}
if(cnt>2*sz) break;
for(int v:pr[u]) if(!--deg[v]) q.push(v);
}
puts("NIE");
clr();
}
signed main(){
int T=wrd();
while(T--) solve();
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:
TAK RRF NIE