1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| #include <iostream> #include <cstring> #include <cstdio> #include <vector> using namespace std; #define N 510 #define cl memset #define pb push_back
vector<int>e[2*N]; int n,num,x[N],y[N]; int dfn[2*N],low[2*N],belong[2*N],stack[2*N],dcnt,bcnt,top; bool ins[2*N];
inline void add(int u ,int v){ e[u].pb(v); }
inline bool check(int p ,int q){ if(x[p] < x[q] && x[q] < y[p] && y[p] < y[q] ) return false; if(x[q] < x[p] && x[p] < y[q] && y[q] < y[p]) return false; return true; }
void build(){ for(int i = 0; i < 2*n; i++) e[i].clear(); for(int i = 0; i < n; i++) for(int j = i+1; j < n; j++) if(!check(i,j)){ add(i<<1,j<<1|1); add(j<<1,i<<1|1); add(i<<1|1,j<<1); add(j<<1|1,i<<1); } }
void tarjan(int u){ dfn[u] = low[u] = ++dcnt; stack[++top] = u; ins[u] = true; for(int i = 0; i < e[u].size(); i++){ int v = e[u][i]; if(!dfn[v]){ tarjan(v); low[u] = min(low[u],low[v]); } else if(ins[v]) low[u] = min(low[u],dfn[v]); } if(dfn[u] == low[u]){ ++bcnt; while(true){ int x = stack[top--]; ins[x] = false; belong[x] = bcnt; if(x == u) break; } } }
void scc(){ dcnt = bcnt = top = 0; cl(dfn,0,sizeof(dfn)); cl(ins,false,sizeof(ins)); for(int i = 0; i < 2*n; i++) if(!dfn[i]) tarjan(i);
}
int main(){ while(scanf("%d%d",&num,&n)!=EOF){ for(int i = 0; i < n ;i++){ scanf("%d%d",&x[i],&y[i]); if(x[i] > y[i]) swap(x[i],y[i]); } build(); scc(); bool res = true; for(int i = 0; i < n; i++) if(belong[i<<1] == belong[i<<1|1]){ res = false; break; } if(res) printf("panda is telling the truth...\n"); else printf("the evil panda is lying again\n"); } return 0; }
|