# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
245772 | vanic | Ili (COI17_ili) | C++14 | 562 ms | 2688 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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;
}
}
}
return 0;
}
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);
}
}
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 (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |