Submission #969842

#TimeUsernameProblemLanguageResultExecution timeMemory
969842antonMars (APIO22_mars)C++17
21 / 100
36 ms4748 KiB
#include "mars.h"
#include<bits/stdc++.h>

using namespace std;
#define pii pair<int, int>
#define x real()
#define y imag()
#define point complex<int>


int to_id(int i, int j, int sz){
	return i*sz + j;
}

int geometric(int n){
    return (n*(n+1))/2;
}

int get_sz(int i, int j, int k, int n){
    //cout<<"sz "<<i<<" "<<j<<" "<<k<<endl;
    if(i< 2*(n-k-1) && j <2*(n-k-1)){
        return 1;
    }
    if(k <0){
        return 1;
    }
    if(i<2 && j<2){
        return 1;
    }
    if(i == 0){
        if(j%2 == 1){
            return 1;
        }
        return geometric((2*n)+1 - j);
    }
    else if( j==0){
        if(i%2 == 1){
            return 1;
        }
        return geometric((2*n)+1-i);
    }
    else{
        if(i>=j && i%2 == 1){
            return 1;
        }
        if(j>=i && j%2 ==1){
            return 1;
        }
        //cout<<(2*n)<<" "<<1-j<<endl;
       //cout<<min((2*n)+1-j, (2*n)+1-i)<<endl;
        return min((2*n)+1-j, (2*n)+1-i);
    }
}

void append(vector<int>& v, vector<int>& b){
    for(auto e: b){
        v.push_back(e);
    }
}

vector<int> to_vec(string s, int i, int j, int n, int k){
    vector<int> res;
    for(int l =0; l<get_sz(i, j,k,n); l++){
        res.push_back(s[l]-'0');
    }
    return res;
}
string to_string(vector<int> v){
    string res;
    for(auto e:v){
        res.push_back(e + '0');
    }
    while(res.size()<100){
        res.push_back('0');
    }
    return res;
}

vector<vector<vector<int>>> a_to_vec(vector<vector<string>> a, int _i, int _j, int n, int k){
    vector<vector<vector<int>>> res(3, vector<vector<int>>(3));
    for(int i = 0;i<3; i++){
        for(int j = 0; j<3; j++){
            //cout<<"pos "<<i+_i<<" "<<j+_j<<endl;
            //cout<<"n: "<<n<<endl;
            //cout<<"sz: "<<get_sz(i+_i, j+_j, k, n)<<endl;
            //cout<<a[i][j]<<endl;
            res[i][j] =  to_vec(a[i][j],i+_i,j+_j,n, k-1);
            /*for(auto e: res[i][j]){
                cout<<e<<" ";
            }
            cout<<endl;*/
        }
    }
    return res;
}

vector<int> merge_left(vector<vector<vector<int>>>& a){
    vector<int> res;
    for(int i = 0; i<3; i++){
        for(int j = 0; j<=i; j++){
            append(res, a[i][j]);
        }
    }
    return res;
}
vector<int> merge_right(vector<vector<vector<int>>>& a){
    vector<int> res;
    for(int i = 0; i<3; i++){
        for(int j = i; j<3; j++){
            //cout<<"inc "<<i<<" "<<j<<" "<<a[i][j].size()<<endl;
            append(res, a[i][j]);

        }
    }
    return res;
}

vector<int> merge_diag(vector<vector<vector<int>>>& a){
    vector<int> res;
    for(int i = 0; i<3; i++){
        append(res, a[i][i]);

    }
    return res;
}
void dfs(vector<vector<char>>&r, point pos, vector<vector<bool>>& vis, int h){
	vis[pos.x][pos.y] = true;
	
	vector<point> d = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
	for(auto e: d){
		point np = pos + e;
		if(np.x>=0 && np.x<h){
			if(np.y>=0 && np.y<h){
				if(!vis[np.x][np.y]){
					if(r[np.x][np.y] == '1'){
						dfs(r, np, vis, h);
					}
				}
			}
		}
	}
}

int count_components(vector<vector<char>> r, int k){
	
	int h = (2*k+3);
	vector<vector<bool>> vis(h, vector<bool>(h));

	
	int res=  0;
	for(int i = 0; i<h; i++){
		for(int j = 0; j<h; j++){
			if(!vis[i][j]){
				if(r[i][j] == '1'){
					res++;
					dfs(r, {i, j}, vis, h);
				}
			}
		}
	}
	return res;
}



string to_str(int v){
	string res(100, '0');
	for(int i = 0; i<20; i++){
		if(v & (1<<i)){
			res[i] = '1';
		}
	}
	return res;
}


vector<int> process_edge(vector<vector<vector<int>>> a, int i, int j, int k){
    if(j==0){
        return merge_left(a);
    }
    else{
        if(i==0){
            return merge_right(a);
        }
        else{
            return merge_diag(a);
        }
    }
}

vector<vector<vector<int>>> simulate(int n){
    int sz = 2*n+1;
    vector<vector<vector<int>>> content(sz, vector<vector<int>>(sz));
    for(int i = 0; i<sz; i++){
        for(int j = 0; j<sz; j++){
            content[i][j].push_back(i*sz + j);
            //cout<<i<<" "<<j<<" "<<i*sz+j<<endl;
        }
    }

    for(int k = 0; k<n-1; k++){
        for(int i = 0; i<=2*(n-k-1); i++){
            for(int j = 0; j<=2*(n-k-1); j++){
                if(i == 2*(n-k-1) || j == 2*(n-k-1)){
                    vector<vector<vector<int>>>a (3, vector<vector<int>>(3));
                    for(int h= 0; h<3; h++){
                        for(int l = 0; l<3; l++){
                            a[h][l] = content[i+h][j+l];
                        }
                    }
                    content[i][j]= process_edge(a, i, j, k);
                }
            }
        }
    }

    return content;
}

vector<vector<char>> get_final(vector<vector<vector<int>>> a, int n){
    vector<vector<vector<int>>> final_pos = simulate(n);
    vector<vector<char>> m(2*n+1, vector<char>(2*n+1, '0'));
    int sz = 2*n+1;
    for(int i = 0; i<3; i++){
        for(int j = 0; j<3; j++){
            if(final_pos[i][j].size() != a[i][j].size()){
                //cout<<"error "<<i<<" "<<j<<" "<<final_pos[i][j].size()<<" "<<a[i][j].size()<<endl;
            }
            for(int k = 0;k<final_pos[i][j].size(); k++){
                auto e = final_pos[i][j][k];
                m[e/sz][e%sz] = a[i][j][k] + '0';
            }
        }
    }

    return m;
}
std::string process(std::vector <std::vector<std::string>> a, int i, int j, int k, int n)
{
	/*simulate(n);
    return string(101, '0');*/
	
    if(k ==n-1){
        return to_str(count_components(get_final(a_to_vec(a, i, j, n, k), n), k));
    }
    else{
        if(i == 2*(n-k-1) || j == 2*(n-k-1)){
            vector<int> res =process_edge(a_to_vec(a, i, j, n, k), i, j, k);
            return to_string(res);
        }
        else{
            return a[0][0];
        }
    }
}	
	

Compilation message (stderr)

mars.cpp: In function 'std::vector<std::vector<char> > get_final(std::vector<std::vector<std::vector<int> > >, int)':
mars.cpp:229:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  229 |             for(int k = 0;k<final_pos[i][j].size(); k++){
      |                           ~^~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...