Submission #145730

#TimeUsernameProblemLanguageResultExecution timeMemory
145730oscarsierra12Vision Program (IOI19_vision)C++14
44 / 100
132 ms4668 KiB
#include "vision.h"
#include <bits/stdc++.h>
using namespace std ;

int cnt ;
vector <int> Ns, Ns2 ;
int pos1 = 0, pos2 = 0, var ;
set <int> st ;

int go () {
    if ( min ( Ns.size(), Ns2.size() ) == 0 ) return 0 ;
    add_or ( Ns ) ;
    add_or ( Ns2 ) ;
    add_and ( vector <int>{cnt, cnt+1} ) ;
    cnt+=3 ;
}

void ini() {
    Ns = vector<int>(), Ns2 = vector<int>() ;
    st = set <int>() ;
}

int filCol ( int H, int W, int K, int flag ) {
    for ( int i = 0 ; i < H ;++i ) {
        ini() ;
        for ( int j = 0 ; j < W ;++j ) Ns2.push_back ( (flag==1?i*W+j:j*H+i) );
        for ( int j = 0 ; j < H ;++j ) {
            if ( abs(i-j) > K )
                for ( int k = 0 ; k < W; ++k ) Ns.push_back ( (flag==1?j*W+k:k*H+j) ) ;
        }
        go() ;
	}
}

int goDiagonal ( int fil, int col, int flag, int H, int W ) {
    while ( fil >= 0 && col < W ) {
        if ( fil >= H || col < 0 ) {}
        else{
            if ( flag ) Ns.push_back ( fil*W+col ) ;
            st.insert (fil*W+col);
        }
        fil-- ;
        col++ ;
    }
}

int otDiag ( int fil, int col, int flag, int H, int W ) {
    while ( fil >= 0 && col >= 0 ) {
        if ( fil >= H || col >= W ) {}
        else{
            if ( flag ) Ns.push_back ( fil*W+col ) ;
            st.insert (fil*W+col);
        }
        fil-- ;
        col-- ;
    }
}

int diagDer ( int H, int W, int K ) {
    for ( int i = 0 ; i < H; ++i ) {
        ini() ;
        goDiagonal ( i, 0,1, H, W ) ;
        for ( int j = 1 ; j <= K ; ++j )
            goDiagonal ( i+j, 0, 0, H, W ) ,
            goDiagonal ( i-j, 0, 0, H, W ) ;
        for ( int j = 0 ; j < H ; ++j ) {
            for (int k = 0 ; k < W ; ++k ) {
                if ( !st.count (j*W+k) ) Ns2.push_back ( j*W+k ) ;
            }
        }
        go() ;
    }
    for ( int i = 0 ; i < W ; ++i ) {
        ini() ;
        goDiagonal ( H-1, i, 1, H, W ) ;
        for ( int j = 1 ; j <= K ; ++j )
            goDiagonal ( H-1, i-j, 0, H, W ) ,
            goDiagonal ( H-1, i+j, 0, H, W ) ;
        for ( int j = 0 ; j < H ; ++j ) {
            for (int k = 0 ; k < W ; ++k ) {
                if ( !st.count (j*W+k) ) Ns2.push_back ( j*W+k ) ;
            }
        }
        go() ;
    }
}

int diagIzq ( int H, int W, int K ) {
    for ( int i = 0 ; i < H; ++i ) {
        ini() ;
        otDiag ( i, W-1,1, H, W ) ;
        for ( int j = 1 ; j <= K ; ++j )
            otDiag ( i+j, W-1, 0, H, W ) ,
            otDiag ( i-j, W-1, 0, H, W ) ;
        for ( int j = 0 ; j < H ; ++j ) {
            for (int k = 0 ; k < W ; ++k ) {
                if ( !st.count (j*W+k) ) Ns2.push_back ( j*W+k ) ;
            }
        }
        go() ;
    }
    for ( int i = 0 ; i < W ; ++i ) {
        ini() ;
        otDiag ( H-1, i,1, H, W ) ;
        for ( int j = 1 ; j <= K ; ++j )
            otDiag ( H-1, i+j, 0, H, W ) ,
            otDiag ( H-1, i-j, 0, H, W ) ;
        for ( int j = 0 ; j < H ; ++j ) {
            for (int k = 0 ; k < W ; ++k ) {
                if ( !st.count (j*W+k) ) Ns2.push_back ( j*W+k ) ;
            }
        }
        go() ;
    }
}

void solve ( int H, int W, int K, int flag ) {
    filCol ( H, W,K, 1 ) ;
    filCol ( W, H,K, 0 ) ;
    diagDer ( H, W, K ) ;
    diagIzq ( H, W, K ) ;
    vector <int> frOr ;
    int cur = 0 ;
    vector <int> xorAdd ;
    for ( int i = 0 ; i < H ; ++i ) {
        for ( int j = 0 ; j < W ;++j ) xorAdd.push_back(i*W+j) ;
    }
    add_xor(xorAdd) ;
    add_xor(xorAdd) ;
    add_xor(xorAdd) ;
    cnt+=3 ;
    for ( int i = var ; i < cnt ; ++i ) {
        if ( cur==2 ) frOr.push_back ( i );
        cur++ ;
        cur%=3 ;
    }
    add_or ( frOr ) ;
    if ( flag ) pos1 = cnt ;
    else pos2 = cnt ;
    cnt++ ;
    var = cnt ;
}

void construct_network(int H, int W, int K) {
    var = cnt = H*W ;
    solve ( H, W, K, 1 ) ;
    solve ( H, W, K-1, 0 ) ;
    add_xor ( vector <int>{pos1,pos2} ) ;
}

Compilation message (stderr)

vision.cpp: In function 'int filCol(int, int, int, int)':
vision.cpp:33:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
vision.cpp: In function 'int goDiagonal(int, int, int, int, int)':
vision.cpp:45:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
vision.cpp: In function 'int otDiag(int, int, int, int, int)':
vision.cpp:57:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
vision.cpp: In function 'int diagDer(int, int, int)':
vision.cpp:86:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
vision.cpp: In function 'int diagIzq(int, int, int)':
vision.cpp:115:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
vision.cpp: In function 'int go()':
vision.cpp:16:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...