Submission #1187683

#TimeUsernameProblemLanguageResultExecution timeMemory
1187683AvianshHexagonal Territory (APIO21_hexagon)C++20
0 / 100
2110 ms422364 KiB
#include "hexagon.h"

#include <bits/stdc++.h>

using namespace std;

const int mod = 1e9+7;
const int mxn = 100;
bool vis[mxn][mxn];

long long modinv(long long x){
    int need  = mod-2;
    long long ans = 1;
    long long curr = x;
    for(int i = 0;i<32;i++){
        if((1<<i)&need){
            ans*=curr;
            ans%=mod;
        }
        curr*=curr;
        curr%=mod;
    }
    return ans;
}

void dfs(int x, int y,set<array<int,2>>&s){
    //cout << "here1" << endl;
    if(s.find({x,y})!=s.end()){
        return;
    }
    if(x<0||y<0||x>=mxn||y>=mxn){
        return;
    }
    if(vis[x][y]){
        return;
    }
    //cout << "here2" << endl;
    vis[x][y]=1;
    dfs(x-2,y,s);
    dfs(x-1,y-1,s);
    dfs(x-1,y+1,s);
    dfs(x+1,y-1,s);
    dfs(x+1,y+1,s);
    dfs(x+2,y,s);
}

int draw_territory(int n, int A, int b,vector<int> d, vector<int> l) {
    for(int i = 0;i<mxn;i++){
        fill(vis[i],vis[i]+mxn,0);
    }
    int x,y;
    x=mxn/2;
    y=mxn/2;
    set<array<int,2>>s;
    for(int i = 0;i<n;i++){
        while(l[i]){
            s.insert({x,y});
            if(d[i]==1){
                x-=2;
            }
            else if(d[i]==2){
                x--;
                y++;
            }
            else if(d[i]==3){
                x++;
                y++;
            }
            else if(d[i]==4){
                x+=2;
            }
            else if(d[i]==5){
                x++;
                y--;
            }
            else if(d[i]==6){
                x--;y--;
            }
            l[i]--;
        }
    }
    assert(x==mxn/2&&y==mxn/2);
    dfs(0,0,s);
    priority_queue<array<int,3>,vector<array<int,3>>,greater<array<int,3>>>pq;
    pq.push({0,x,y});
    long long ans = 0;
    while(!pq.empty()){
        array<int,3>a = pq.top();
        pq.pop();
        if(vis[a[1]][a[2]])
            continue;
        vis[a[1]][a[2]]=1;
        ans+=A;
        ans%=mod;
        ans+=1LL*b*a[0];
        ans%=mod;
        pq.push({a[0]+1,a[1]+2,a[2]});
        pq.push({a[0]+1,a[1]-2,a[2]});
        pq.push({a[0]+1,a[1]+1,a[2]+1});
        pq.push({a[0]+1,a[1]-1,a[2]+1});
        pq.push({a[0]+1,a[1]+1,a[2]-1});
        pq.push({a[0]+1,a[1]-1,a[2]-1});
        //cout << a[0] << " " << a[1] << " " << a[2] << endl;
    }
    return ans;
}
#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...