# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
245769 | 2020-07-07T11:09:16 Z | vanic | Ili (COI17_ili) | C++14 | 5 ms | 1792 KB |
#include <iostream> #include <cstdio> #include <math.h> #include <algorithm> #include <vector> #include <set> #include <stack> #include <queue> #include <string.h> #include <bitset> using namespace std; const int maxn=2e4+5; int n, m; vector < int > ms[maxn]; vector < int > up[maxn]; vector < int > boje[maxn]; int kol[maxn]; int val[maxn]; int pretvori(string x){ int br=0; for(int i=1; i<x.size(); i++){ br*=10; br+=x[i]-'0'; } return br; } void gore(int x){ val[x]=1; for(int i=0; i<up[x].size(); i++){ if(val[up[x][i]]==-1){ gore(up[x][i]); } } } void dolje(int x){ val[x]=0; for(int i=0; i<ms[x].size(); i++){ if(val[ms[x][i]]==-1){ dolje(ms[x][i]); } } for(int i=0; i<up[x].size(); i++){ if(ms[up[x][i]].size()==1 && val[up[x][i]]==-1){ dolje(up[x][i]); } else if(val[up[x][i]]==-1 && !val[ms[up[x][i]][0]] && !val[ms[up[x][i]][1]]){ dolje(up[x][i]); } } } void probaj(int x){ val[x]=1; if(ms[x].size()==1){ if(val[ms[x][0]]==-1){ gore(ms[x][0]); probaj(ms[x][0]); } } else if(ms[x].size()==2){ if(!val[ms[x][0]] && val[ms[x][1]]==-1){ gore(ms[x][1]); probaj(ms[x][1]); } else if(!val[ms[x][1]] && val[ms[x][0]]==-1){ gore(ms[x][0]); probaj(ms[x][0]); } } } bitset < maxn > bio; bool dfs(int x){ if(val[x]==1){ return 1; } bio[x]=1; for(int i=0; i<ms[x].size(); i++){ if(val[ms[x][i]]==-1 && !bio[ms[x][i]]){ if(dfs(ms[x][i])){ return 1; } } } bool p; for(int i=0; i<up[x].size(); i++){ if(bio[up[x][i]]){ continue; } p=1; for(int j=0; j<ms[up[x][i]].size(); j++){ if(!bio[ms[up[x][i]][j]] && val[ms[up[x][i]][j]]!=0){ p=0; } } if(p){ if(dfs(up[x][i])){ return 1; } } } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; string s; cin >> s; string a, b; int br1, br2; memset(val, -1, sizeof(val)); for(int i=0; i<m; i++){ cin >> a >> b; br1=pretvori(a); br2=pretvori(b); br1--; br2--; if(a[0]=='c'){ br1+=n; } if(b[0]=='c'){ br2+=n; } if(br1!=br2){ up[br1].push_back(i+n); up[br2].push_back(i+n); ms[i+n].push_back(br1); ms[i+n].push_back(br2); } else{ up[br1].push_back(i+n); ms[i+n].push_back(br1); } } for(int i=0; i<m; i++){ if(val[i+n]==-1){ if(s[i]=='0'){ dolje(i+n); } else if(s[i]=='1'){ gore(i+n); } } } for(int i=0; i<m; i++){ if(val[i+n]==1){ probaj(i+n); } } int p; for(int i=0; i<m; i++){ if(val[i+n]==-1){ if(dfs(i+n)){ gore(i+n); probaj(i+n); } bio.reset(); } } // cout << val[111] << " " << val[17] << " " << val[19] << endl; for(int i=0; i<m; i++){ /* if(i==184){ cout << endl; cout << val[i+n] << endl; }*/ if(val[i+n]==-1){ cout << '?'; } else{ cout << val[i+n]; } } return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 5 ms | 1792 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 5 ms | 1792 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Incorrect | 5 ms | 1792 KB | Output isn't correct |
2 | Halted | 0 ms | 0 KB | - |