#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
using namespace std;
using ll = long long;
int n;
ll k;
char ca[100099];
ll dx, dy;
struct Poi{
ll x, y;
bool operator <(const Poi &a) const{
if(x == a.x) return y < a.y;
else return x < a.x;
}
} pnts[100099];
set <Poi> se;
map <Poi, vector <Poi>> mp;
struct Line{
ll x1, x2;
bool operator <(const Line &a) const{
return x1 < a.x1;
}
};
map <Poi, vector <Line>> m1, m2, m3, m4;
vector <Line> juns(vector <Line> a){
sort(a.begin(), a.end());
vector <Line> rr;
for(int i = 0; i < a.size(); i ++){
ll h = a[i].x2;
int j;
for(j = i + 1; j < a.size(); j ++){
if(a[j].x1 > h) break;
h = a[j].x2;
}
rr.push_back({a[i].x1, a[j - 1].x2});
i = j - 1;
}
return rr;
}
vector <Line> gk(vector <Line> a, vector <Line> b){
int p = 0;
vector <Line> ree;
for(auto &e : a){
while(p < b.size()){
if(b[p].x1 > e.x2) break;
ll ss = max(b[p].x1, e.x1), ee = min(b[p].x2, e.x2);
if(ss <= ee) ree.push_back({ss, ee});
if(b[p].x2 > e.x2) break;
else p ++;
}
}
sort(ree.begin(), ree.end());
return juns(ree);
}
ll gett(Poi k){
/*
printf("%lld %lld\n", k.x, k.y);
for(Line &e : m1[k]) printf("(%lld %lld)", e.x1, e.x2);
printf("\n");
for(Line &e : m2[k]) printf("(%lld %lld)", e.x1, e.x2);
printf("\n");
for(Line &e : m3[k]) printf("(%lld %lld)", e.x1, e.x2);
printf("\n");
for(Line &e : m4[k]) printf("(%lld %lld)", e.x1, e.x2);
printf("\n");
printf("\n\n\n");*/
vector <Line> kko = gk(m1[k], gk(m2[k], gk(m3[k], m4[k])));
ll ret = 0;
for(Line &pp : kko) ret += (pp.x2 - pp.x1) / abs(dx) + 1;
return ret;
}
ll jungs(ll k){
ll vv = 5e18 / abs(dx) * abs(dx);
return (k + vv) % abs(dx);
}
int main()
{
scanf("%d %lld", &n, &k);
scanf("%s", ca + 1);
pnts[0] = {0, 0};
for(int i = 1; i <= n; i ++){
if(ca[i] == 'E') dx ++;
else if(ca[i] == 'W') dx --;
else if(ca[i] == 'N') dy ++;
else dy --;
pnts[i] = {dx, dy};
//printf("%lld %lld\n", pnts[i].x, pnts[i].y);
}
//printf("%lld %lld\n", dx, dy);
if(dx == 0 && dy == 0){
for(int i = 0; i <= n; i ++) se.insert(pnts[i]);
int ret = 0;
for(auto &e : se){
if(se.find({e.x + 1, e.y}) != se.end() && se.find({e.x, e.y + 1}) != se.end() && se.find({e.x + 1, e.y + 1}) != se.end()) ret ++;
}
printf("%d", ret);
return 0;
}
if(dx == 0){
swap(dx, dy);
for(int i = 1; i <= n; i ++) swap(pnts[i].x, pnts[i].y);
}
for(int i = 0; i <= n; i ++){
ll kk = dy * pnts[i].x - dx * pnts[i].y;
mp[{kk, jungs(pnts[i].x)}].push_back(pnts[i]);
}
for(auto &e : mp){
Poi x = e.first;
vector <Poi> vv = e.second;
vector <Line> mk;
//printf("%lld %lld\n\n", x.x, x.y);
for(Poi &kk : vv){
//printf("%lld %lld\n", kk.x, kk.y);
ll ss = kk.x, ee = kk.x + dx * (k - 1);
mk.push_back({min(ss, ee), max(ss, ee)});
}
//printf("\n\n");
m1[x] = juns(mk);
}
for(auto &e : m1){
ll c2 = e.first.x - dy, c3 = e.first.x + dx,c4 = e.first.x + dx - dy;
for(auto &k : e.second){
m2[{c2, jungs(k.x1 - 1)}].push_back({k.x1 - 1, k.x2 - 1});
m3[{c3, jungs(k.x1)}].push_back({k.x1, k.x2});
m4[{c4, jungs(k.x1 - 1)}].push_back({k.x1 - 1, k.x2 - 1});
}
}
ll ret = 0;
for(auto &e : m1){
ret += gett(e.first);
}
printf("%lld", ret);
return 0;
}
Compilation message (stderr)
2016_ho_t4.cpp: In function 'int main()':
2016_ho_t4.cpp:92:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
92 | scanf("%d %lld", &n, &k);
| ~~~~~^~~~~~~~~~~~~~~~~~~
2016_ho_t4.cpp:93:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
93 | scanf("%s", ca + 1);
| ~~~~~^~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |