Submission #1133691

#TimeUsernameProblemLanguageResultExecution timeMemory
1133691KhoaDuyNavigation 2 (JOI21_navigation2)C++20
100 / 100
282 ms880 KiB
#include "Anna.h"
#include <bits/stdc++.h>
using namespace std;
void Anna(int n,int k,vector<int> r,vector<int> c){
    int pos[3][3];
    memset(pos,0,sizeof(pos));
    for(int i=0;i<k;i++){
        pos[r[i]%3][c[i]%3]=1;
    }
    vector<pair<int,int>> unuse;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(pos[i][j]==0&&unuse.size()<2){
                unuse.push_back({i,j});
            }
            else{
                pos[i][j]=1;
            }
        }
    }
    int dx[]={-1,-1,0,1};
    int dy[]={0,1,1,1};
    for(int k=0;k<4;k++){
        if((unuse.back().first+dx[k]+3)%3==unuse[0].first&&(unuse.back().second+dy[k]+3)%3==unuse[0].second){
            swap(unuse[0],unuse[1]);
            break;
        }
    }
    int ptr=0;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            int x=unuse[0].first+i,y=unuse[0].second+j;
            x%=3,y%=3;
            if(pos[x][y]==0){
                for(int a=x;a<n;a+=3){
                    for(int b=y;b<n;b+=3){
                        SetFlag(a,b,12);
                    }
                }
                continue;
            }
            ptr++;
            pos[x][y]=ptr;
        }
    }
    ptr=0;
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            int x=unuse[0].first+i,y=unuse[0].second+j;
            x%=3,y%=3;
            if(pos[x][y]==0){
                continue;
            }
            for(int a=x;a<n;a+=3){
                for(int b=y;b<n;b+=3){
                    if(abs(a-r[ptr])<=1&&abs(b-c[ptr])<=1){
                        SetFlag(a,b,pos[r[ptr]%3][c[ptr]%3]);
                    }
                    else{
                        int val=-9;
                        if(b-1>c[ptr]){
                            val=1;
                        }
                        else if(a-1>r[ptr]){
                            val=3;
                        }
                        else if(b+1<c[ptr]){
                            val=0;
                        }
                        else if(a+1<r[ptr]){
                            val=2;
                        }
                        val+=8;
                        SetFlag(a,b,val);
                    }
                }
            }
            ptr++;
        }
    }
}
#include "Bruno.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> Bruno(int k,vector<int> value){
    vector<int> ans;
    vector<pair<int,int>> unuse;
    int pos[3][3];
    memset(pos,0,sizeof(pos));
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(value[i*3+j]==12){
                unuse.push_back({i,j});
            }
            else{
                pos[i][j]=1;
            }
        }
    }
    int dx[]={-1,-1,0,1};
    int dy[]={0,1,1,1};
    for(int k=0;k<4;k++){
        if((unuse.back().first+dx[k]+3)%3==unuse[0].first&&(unuse.back().second+dy[k]+3)%3==unuse[0].second){
            swap(unuse[0],unuse[1]);
            break;
        }
    }
    vector<pair<int,int>> convert;
    convert.push_back({-1,-1});
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            int x=unuse[0].first+i,y=unuse[0].second+j;
            x%=3,y%=3;
            if(pos[x][y]!=0){
                convert.push_back({x,y});
            }
        }
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            int x=unuse[0].first+i,y=unuse[0].second+j;
            x%=3,y%=3;
            if(pos[x][y]==0){
                continue;
            }
            if(value[x*3+y]>=8){
                ans.push_back(value[x*3+y]-8);
                continue;
            }
            int x2=convert[value[x*3+y]].first,y2=convert[value[x*3+y]].second;
            while(x2-x>=2){
                x2-=3;
            }
            while(x-x2>=2){
                x2+=3;
            }
            while(y2-y>=2){
                y2-=3;
            }
            while(y-y2>=2){
                y2+=3;
            }
            if(y2>1){
                ans.push_back(0);
            }
            else if(y2<1){
                ans.push_back(1);
            }
            else if(x2>1){
                ans.push_back(2);
            }
            else if(x2<1){
                ans.push_back(3);
            }
            else{
                ans.push_back(4);
            }
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...