QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#565770 | #9319. Bull Farm | qdsdsy | TL | 109ms | 10236kb | C++14 | 2.7kb | 2024-09-15 22:12:48 | 2024-09-15 22:12:51 |
Judging History
answer
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXN 2010
#define MAXQ 1000010
int n,l,q;
int t[MAXN][MAXN];
struct node{
int a,b,c,id;
friend bool operator < (node a,node b){
return a.c<b.c;
}
} op[MAXQ];
bool ans[MAXQ];
bool e[MAXN][MAXN];
int bel[MAXN],belp[MAXN],cnt=0;
bool vis[MAXN];
int typ[MAXN];
char s[MAXN*2];
queue <int> qu;
bool bfs(int s,int t){
if(e[s][t]) return true;
for(int i=1;i<=n;i++)
vis[i]=false;
queue <int> qu;
while(!qu.empty()) qu.pop();
qu.push(s);
vis[s]=true;
while(!qu.empty()){
int u=qu.front();
if(u==t) return true;
qu.pop();
for(int i=1;i<=n;i++){
if(vis[i]) continue;
if(e[u][i]) {
e[s][i]=true;
if(i==t) return true;
vis[i]=true;
qu.push(i);
}
}
}
return false;
}
void solve(){
scanf("%d%d%d",&n,&l,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
e[i][j]=false;
for(int i=1;i<=n;i++){
e[i][i]=true;
bel[i]=0;
}
while(cnt) belp[cnt--]=0;
for(int i=1;i<=l;i++){
scanf("%s",s+1);
for(int j=1;j<=n;j++)
t[i][j]=(s[2*j-1]-'0')*50+(s[2*j]-'0');
}
for(int i=1;i<=q;i++){
scanf("%s",s+1);
op[i].a=(s[1]-'0')*50+(s[2]-'0');
op[i].b=(s[3]-'0')*50+(s[4]-'0');
op[i].c=(s[5]-'0')*50+(s[6]-'0');
op[i].id=i;
ans[i]=0;
}
sort(op+1,op+1+q);
int now=0;
for(int i=1;i<=q;i++){
int a=op[i].a,b=op[i].b,c=op[i].c,id=op[i].id;
while(now<c){
now++;
typ[now]=0;
for(int j=1;j<=n;j++)
vis[j]=false;
for(int j=1;j<=n;j++){
if(!vis[t[now][j]]) vis[t[now][j]]=true;
else {
if(!typ[now]) typ[now]=t[now][j];
else typ[now]=-1;
}
}
if(typ[now]==-1) continue;
if(typ[now]){
int id1=0,id2=0,id3=0;
for(int j=1;j<=n;j++) vis[j]=false;
for(int j=1;j<=n;j++){
if(t[now][j]==typ[now])
if(!id1) id1=j;
else id2=j;
vis[t[now][j]]=true;
}
for(int j=1;j<=n;j++)
if(!vis[j]) id3=j;
e[id1][id3]=e[id2][id3]=true;
}else {
for(int j=1;j<=n;j++)
vis[j]=false;
for(int j=1;j<=n;j++){
if(!vis[j]){
int nowj=j;
if(!bel[j]){
bel[j]=++cnt;
belp[cnt]=j;
}
do{
vis[nowj]=true;
if(nowj!=j){
if(bel[nowj])
e[belp[bel[nowj]]][j]=e[j][belp[bel[nowj]]]=true;
else {
bel[nowj]=bel[j];
e[nowj][j]=e[j][nowj]=true;
}
}
nowj=t[now][nowj];
} while(nowj!=j);
}
}
}
}
ans[id]=bfs(a,b);
}
for(int i=1;i<=q;i++)
printf("%d",(int)ans[i]);
printf("\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 10236kb
input:
2 5 2 4 0305040201 0404040404 030300 020500 050102 020501 6 2 4 030603010601 010203060504 030202 060402 050602 060401
output:
1011 0100
result:
ok 2 lines
Test #2:
score: 0
Accepted
time: 0ms
memory: 9964kb
input:
1 3 3 6 020202 030301 030201 020102 030203 010201 010303 020303 010202
output:
010101
result:
ok single line: '010101'
Test #3:
score: 0
Accepted
time: 109ms
memory: 8240kb
input:
200 10 10 5000 01060:04020305080709 0103070:060204050908 09070503080401060:02 050308010204090:0607 03010502040607080:09 03080109020504060:07 06050:09040302080107 07080305010409060:02 030809010:0204060507 0:060908070201050304 060700 090:03 09080: 070405 010703 0:0100 080601 030600 070206 0:0:09 08040...
output:
011110001101101111111111111111111101111111110111011110110110111011010111111111111111111101111111111110111111110111111111111101111111111110111111111111111111110001100111111111111111111111111011101111111111111111111111111111111111111111011011110100111110111111110111111100111111101110111111111101111110...
result:
ok 200 lines
Test #4:
score: -100
Time Limit Exceeded
input:
1 2000 1 1000000 M=:]A@8UAY7W2JJ4KEHIA[HSCQ1ENSC`JXR;F3PJ:_@41P9Z=9HR8P<<:DUXRR9^WOQFL?NZP6S@=J0^WE32=6;\U0?88]Q_RNPUMT6YU<4<S]H?:7OCQYOT4YAV1^764ENWSDBED>M7A:BI>KSIR48JQ9B=N\5T3N4A2aF0@>3TI81<G7;YE>W`NMP<:IT4CI3D0=GZC3I\CLQJQBA9BDIS9SAM55KaVA<Z@D=>:Y?CQHUQ5U3a6UVI8OKX9_FAF^7=5M85;<0;8YPAM<7Z7PP7A=N...