CodeChef submission 130761 (C++ 4.0.0-8) plaintext list. Status: WA, problem J6, contest NOV09. By srirams (sriram), 2009-11-11 12:40:12.
using namespace std; #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #define REP(i,n) for(i=0;i<n;i++) #define FOR(i,A,n) for(i=A;i<n;i++) #define sz(c) (signed int) c.size() #define pb(c) push_back(c) #define INF (int) 1e9 #define all(c) c.begin(),c.end() #define GI(t) scanf("%d",&t); typedef long long LL; typedef vector<int> VI; typedef pair<int,int> PII; struct Person { vector<int>evi; // Evidence Nos int status; // indicates involvement/non-involvement/uncertain bool visit; }; typedef struct Person person; #define inv 1 #define ninv -1 #define not_sure 0 int DFS(vector<person>& v,vector<PII>& R,int i); int main() { int i,j; int n,k; int t; GI(t); int l,m; PII s; int p,q; bool f1,f2; while(t--) { GI(n);GI(k); vector<person>v; vector<PII>R; person P; map<PII,int>M; int flag=0; // Initialise the N persons REP(i,n) { P.status=not_sure; P.visit=false; v.pb(P); } REP(i,k) { GI(p);GI(q); s.first=p;s.second=q; R.pb(s); // Store the evidence, we may need it later f1=true; f2=true; // Check for clinching evidence if(l==m) { // same person if(p==q) { // true evidence if((v[l-1].status==inv && p<0) || (v[l-1].status==ninv && p>0)) { flag=1; break; } else { if(p>0) v[l-1].status=inv; else v[l-1].status=ninv; } } } else { // Different person // Test each part separately if((v[l-1].status==inv && p<0) || (v[l-1].status==ninv && p>0)) { // 1st part is false f1=false; } if((v[m-1].status==inv && q<0) || (v[m-1].status==ninv && q>0)) { // 2nd part is false; f2=false; } if(!f1 && !f2) { flag=1; break; } if(!f1) { // 2nd part is true v[m-1].status=(q>0)?inv:ninv; continue; } if(!f2) { // 1st part is true v[l-1].status=(p>0)?inv:ninv; continue; } // Check for boolean table // Consider 2 vars A&B, the possible values are (00,01,10,11) // 0 is = not involved // For 00,score =1,01 score=2,10 score=4,11 score =8 // Store the score in map<PII>, pair shud be unique,so make it ordered if(l<m) { s.first=l;s.second=m; } else { s.first=m;s.second=l; swap(p,q); } if(p>0) { if(q>0) M[s]+=8; else M[s]+=4; } else { if(q>0) M[s]+=2; else M[s]+=1; } // We dont have clinching evidence now,so store it for later use v[l-1].evi.pb(i); v[m-1].evi.pb(i); } } if(flag) continue; // Get answer from boolean table if possible map<PII,int>::iterator it; for(it=M.begin();it!=M.end();it++) { s=it->first; //cout<<s.first<<" "<<s.second<<" "<<M[s]<<endl; // 2 of the values in the table are avail,so we can determine l or m for some scores. if(M[s]==3) { l=s.first; if(v[l-1].status==inv) { flag=1; break; } else v[l-1].status=ninv; } if(M[s]==12) { l=s.first; if(v[l-1].status==ninv) { flag=1; break; } else v[l-1].status=inv; } if(M[s]==5) { m=s.second; if(v[m-1].status==inv) { flag=1; break; } else v[m-1].status=ninv; } if(M[s]==10) { m=s.second; if(v[m-1].status==ninv) { flag=1; break; } else v[m-1].status=inv; } // 3 values in the table are avail, so we can determine value of l & m uniquely. if(M[s]==7) { l=s.first;m=s.second; if(v[l-1].status==inv || v[m-1].status==inv) { flag=1; break; } else { v[l-1].status=ninv; v[m-1].status=ninv; } } if(M[s]==11) { l=s.first;m=s.second; if(v[l-1].status==inv || v[m-1].status==ninv) { flag=1; break; } else { v[l-1].status=ninv; v[m-1].status=inv; } } if(M[s]==13) { l=s.first;m=s.second; if(v[l-1].status==ninv || v[m-1].status==inv) { flag=1; break; } else { v[l-1].status=inv; v[m-1].status=ninv; } } if(M[s]==14) { l=s.first;m=s.second; if(v[l-1].status==ninv || v[m-1].status==ninv) { flag=1; break; } else { v[l-1].status=inv; v[m-1].status=inv; } } // All 4 values available, no solution possible if(M[s]==15) { flag=1; break; } } if(flag) continue; // Ok, now we have some results, we need more // DFS seems to be good REP(i,n) { if((v[i].status==inv || v[i].status==ninv) && v[i].visit==false) { int ret=DFS(v,R,i); if(ret==-1) { flag=1; break; } } } if(flag) continue; REP(i,n) { if(v[i].status==not_sure) { flag=1; break; } } } return 0; } int DFS(vector<person>& v,vector<PII>& R,int i) { int j; PII s; int l,m,p,q; int flag=0; int ret=0; REP(j,sz(v[i].evi)) { s=R[v[i].evi[j]]; p=s.first;q=s.second; bool f1=true,f2=true; if((v[l-1].status==inv && p<0) || (v[l-1].status==ninv && p>0)) { // 1st part is false f1=false; } if((v[m-1].status==inv && q<0) || (v[m-1].status==ninv && q>0)) { // 2nd part is false; f2=false; } if(!f1 && !f2) { flag=1; break; } if(!f1) { // 2nd part is true if(v[m-1].status==not_sure) { v[m-1].status=(q>0)?inv:ninv; if(v[m-1].visit==false) { ret=DFS(v,R,m-1); if(ret==-1) break; } } } if(!f2) { // 1st part is true if(v[l-1].status==not_sure) { v[l-1].status=(p>0)?inv:ninv; if(v[l-1].visit==false) { ret=DFS(v,R,l-1); if(ret==-1) break; } } } //cout<<v[l-1].status<<" "<<v[m-1].status<<endl; } v[i].visit=true; if(flag==1 || ret==-1) return -1; else return 0; }
Comments

