제출 #1339242

#제출 시각아이디문제언어결과실행 시간메모리
1339242Nipphitch영역 (JOI16_ho_t4)C++20
15 / 100
221 ms41340 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define pii pair <int,int> 

set <pii> points,squares;

void addpoints(int x,int y){
    points.insert({x,y});
    for(int i=-1;i<1;i++) for(int j=-1;j<1;j++) squares.insert({x+i,y+j});
}

int countsquare(int n,int k,string route){
    int x=0,y=0;
    addpoints(x,y);
    for(char c:route){
        if(c=='N') x--;
        else if(c=='S') x++;
        else if(c=='E') y++;
        else y--;
        addpoints(x,y);
    }
    if(x==0 && y==0){
        int ans=0;
        for(pii p:squares){
            int c=0;
            for(int i=0;i<2;i++) for(int j=0;j<2;j++) c+=points.count({p.first+i,p.second+j});
            ans+=(c==4);
        }
        return ans;
    }
    map <pii,vector <pii>> mp;
    for(pii p:squares){
        int stx=x?(p.first%x)+x:p.first;
        int sty=y?(p.second%y)+y:p.second;
        int mov=!x?(p.second-sty)/y:(p.first-stx)/x;
        stx=p.first-mov*x,sty=p.second-mov*y;
        mp[{stx,sty}].push_back(p);
    }
    int ans=0;
    for(auto &[p,v]:mp){
        vector <vector <int>> last(2,vector <int>(2,-1));
        if(x<0 || !x&&y<0) reverse(v.begin(),v.end());
        auto [bx,by]=v[0];
        vector <pii> ranges;
        for(int i=0;i<v.size();i++){
            for(int j=0;j<2;j++) for(int l=0;l<2;l++) if(points.count({v[i].first+j,v[i].second+l})) last[j][l]=i;
            int min_i=min({last[0][0],last[1][0],last[0][1],last[1][1]});
            if(min_i==-1) continue;
            int tim=x?(v[i].first-v[min_i].first)/x:(v[i].second-v[min_i].second)/y;
            int l=x?(v[i].first-bx)/x:(v[i].second-by)/y;
            if(tim<=k) ranges.push_back({l,l+k-tim});
        }
        int last_r=-1;
        for(auto [l,r]:ranges){
            if(l<=last_r && r>last_r) ans+=r-last_r;
            else if(l>last_r) ans+=r-l;
            last_r=max(last_r,r);
        }
    }
    return ans;
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,k;
    string route;
    cin >> n >> k >> route;
    cout << countsquare(n,k,route);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...