Submission #1225293

#TimeUsernameProblemLanguageResultExecution timeMemory
1225293KALARRYMars (APIO22_mars)C++20
Compilation error
0 ms0 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <string>
#include <bitset>

using namespace std;

static void WA(string msg)
{
	cout << "WA: " << msg << endl;
	exit(0);
}

static long long to_longlong(string s)
{
  long long ans=0;
  for(int i=(int)s.size()-1;i>=0;i--)
    ans=(ans*2)+s[i]-'0';
  return ans;
}

//chockolateman

#include<bits/stdc++.h>

using namespace std;

int N,status[100][100][1000];
pair<int,int> info[100][100][1000]; //info[i][j][k] = shows that for (i,j) the kth bit has info for info[i][j][k]
pair<pair<int,int>,int> take_it_from[100][100][1000];
int s_i[100][100];
bool found[100][100];

void calc_info()
{
    for(int i = 0 ; i < N ; i++)
        for(int j = 0 ; j < N ; j++)
        {
            s_i[i][j] = 1;
            info[i][j][0] = {i,j};
        }
    for(int i = N-1 ; i >= 0 ; i--)
        for(int j = N-1 ; j >= 0 ; j--)
        {
            for(int x = 0 ; x < N ; x++)
                for(int y = 0 ; y < N ; y++)
                    found[x][y] = false;
            found[i][j] = true;
            take_it_from[i][j][0] = {{i,j},0};
            int cur_pos = 1;
            for(int x = i+2 ; x >= i ; x--)
                for(int y = j+2 ; y >= j ; y--)
                {
                    if(x==i && y==j)
                        continue;
                        s_i[i][j] += s_i[x][y];
                    for(int l = 0 ; l < s_i[x][y] ; l++)
                    {
                        int r = info[x][y][l].first;
                        int t = info[x][y][l].second;
                        if(found[info[x][y][l].first][info[x][y][l].second] || (((r - i <= 1) && (t - j <= 1))))
                        {
                            s_i[i][j]--;
                            continue;
                        }
                        info[i][j][cur_pos++] = info[x][y][l];
                        take_it_from[i][j][cur_pos - 1] = {{x,y},l};
                        found[info[x][y][l].first][info[x][y][l].second] = true;
                    }
                }
        }

}

int grid[100][100],di[4] = {1,-1,0,0},dj[4] = {0,0,1,-1};
bool visited[100][100];

void dfs(int i,int j)
{
    if(i < 0 || i >= N || j < 0 || j >= N)
        return;
    if(visited[i][j])
        return;
    visited[i][j] = true;
    for(int k = 0 ; k <= 3 ; k++)
    {
        int x = i + di[k];
        int y = j + dj[k];
        dfs(x,y);
    }
}

long long solve()
{
    memset(visited,false,sizeof(visited));
    for(int i = 0 ; i < N ; i++)
        for(int j = 0 ; j < N ; j++)
            if(grid[i][j]==0)
                visited[i][j] = true;
    int ret = 0;
    for(int i = 0 ; i < N ; i++)
        for(int j = 0 ; j < N ; j++)
            if(!visited[i][j])
            {
                ret++;
                dfs(i,j);
            }
    return ret;
}

std::string process(std::vector <std::vector<std::string>> a, int i, int j, int k, int n)
{
    N = 2*n + 1;
    calc_info();
    std::string ret(100 ,'0');
    for(int l = 0 ; l < s_i[i][j] ; l++)
    {
        int x = take_it_from[i][j][l].first.first;
        int y = take_it_from[i][j][l].first.second;
        int r = take_it_from[i][j][l].second;
        status[i][j][l] = a[x-i][y-j][r] - '0';

        ret[l] = a[x-i][y-j][r];
    }
    if(k==n-1)
    {
        while(i <= 2)
        {
            j= 0;
            while(j <= 2)
            {
                for(int l = 0 ; l < s_i[i][j] ; l++)
                {
                    int x = info[i][j][l].first;
                    int y = info[i][j][l].second;
                    grid[x][y] = status[i][j][l];
                }
                int ans = solve();
                int pos = 0;
                for(int l = 0 ; l <= 99 ; l++)
                {
                    ret[l] = ans%2 + '0';
                    ans /= 2;
                }
                j++;
            }
            i++;
        }
    }
    return ret;
}


int main()
{
	int t;
	assert(scanf("%d",&t) == 1);
	while(t--)
	{
		int n;
		assert(scanf("%d",&n) == 1);

		vector <vector<char>> s(2*n+1, vector<char>(2*n+1));
		for(int i = 0; i < 2*n+1; i++)
			for(int j = 0; j < 2*n+1; j++)
				assert(scanf(" %c",&s[i][j]) == 1);

		vector <vector<string>> h(2*n+1, vector<string>(2*n+1, string(100 ,'0')));
		for(int i = 0; i < 2*n+1; i++)
			for(int j = 0; j < 2*n+1; j++)
				h[i][j][0] = s[i][j];

		vector <vector<string>> subarr(3, vector<string>(3));
		for(int k = 0; k < n; k++)
		{
			int m = 2*(n-k-1);
			for(int i = 0; i <= m; i++)
			{
				for(int j = 0; j <= m; j++)
				{
					for(int y = 0; y < 3; y++)
					{
						for(int x = 0; x < 3; x++)
						{
							subarr[y][x] = h[i+y][j+x];
						}
					}
					h[i][j] = process(subarr, i, j, k, n);

					if(h[i][j].size() != 100) WA("Invalid return length");
					for(int l = 0; l < 100; l++)
						if(h[i][j][l] != '0' && h[i][j][l] != '1') WA("Invalid return");
				}
			}
		}

		printf("%lld\n",to_longlong(h[0][0]));
	}
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccV75LHe.o: in function `main':
stub.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/cc4jk0ee.o:mars.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status