This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using pli = pair<long long, int>;
using tiii = tuple<int, int, int>;
#define X first
#define Y second
const int le9 = 1e9;
const pii INF = {-1e9, -1e9};
pii df; int dx, dy;
int N, K, P[1000009];
int x1[4][1000009], x2[4][1000009], y[1000009];
char S[1000009];
set<pii> st;
void mv(pii &CR, char c) {
if(c == 'S') --CR.Y;
if(c == 'N') ++CR.Y;
if(c == 'W') --CR.X;
if(c == 'E') ++CR.X;
}
void input() {
scanf("%d%d",&N,&K);
for(int i=1; i<=N; i++) {
scanf(" %c", &S[i]);
mv(df, S[i]);
}
if(df.X < 0) {
df.X = -df.X;
for(int i=1; i<=N; i++) {
if(S[i] == 'W') S[i] = 'E';
else if(S[i] == 'E') S[i] = 'W';
}
}
if(df.Y < 0) {
df.Y = -df.Y;
for(int i=1; i<=N; i++) {
if(S[i] == 'N') S[i] = 'S';
else if(S[i] == 'S') S[i] = 'N';
}
}
}
void go(pii &now) {
st.insert(now);
for(int i=1; i<=N; i++) {
mv(now, S[i]);
st.insert(now);
}
}
int cnt() {
int ret = 0;
for(auto& it: st) {
int c = 0;
if(st.find({it.X+1, it.Y}) != st.end()) ++c;
if(st.find({it.X, it.Y+1}) != st.end()) ++c;
if(st.find({it.X+1, it.Y+1}) != st.end()) ++c;
if(c == 3) ++ret;
}
return ret;
}
pli geti(pii A) {
if(dx == 0) return {A.X, A.Y % dy};
if(dy == 0) return {A.Y, A.X % dx};
return {1LL * A.X * dy - 1LL * A.Y * dx, A.Y % dy};
}
int day(pii A, pii B) {
return (dx ? (A.X - B.X) / dx : (A.Y - B.Y) / dy) + 1;
}
vector<pii> A;
pii RC(pii U) {
if(U.Y == 0) return A[U.X];
if(U.Y == 1) return {A[U.X].X+1, A[U.X].Y};
if(U.Y == 2) return {A[U.X].X, A[U.X].Y+1};
if(U.Y == 3) return {A[U.X].X+1, A[U.X].Y+1};
}
vector<pii> T[1000009];
int main() {
input(); tie(dx, dy) = df;
pii now = {100000, 100000}; go(now);
// printf("dx: %d, dy: %d\n", dx, dy);
if(dx == 0 && dy == 0) return !printf("%d", cnt());
map<pli, int> id; int M = 0;
for(auto& it: st) {
if(id[geti(it)] == 0) id[geti(it)] = ++M;
if(id[geti({it.X+1, it.Y})] == 0) id[geti({it.X+1, it.Y})] = ++M;
if(id[geti({it.X, it.Y+1})] == 0) id[geti({it.X, it.Y+1})] = ++M;
if(id[geti({it.X+1, it.Y+1})] == 0) id[geti({it.X+1, it.Y+1})] = ++M;
}
for(auto& it: st) {
T[id[geti(it)]].push_back({A.size(), 0});
T[id[geti({it.X+1, it.Y})]].push_back({A.size(), 1});
T[id[geti({it.X, it.Y+1})]].push_back({A.size(), 2});
T[id[geti({it.X+1, it.Y+1})]].push_back({A.size(), 3});
A.push_back(it);
}
int E = A.size();
for(int i=1; i<=M; i++) {
sort(T[i].begin(), T[i].end(), [&](pii PP, pii QQ) {
if(RC(PP) == RC(QQ)) return PP.Y < QQ.Y;
return RC(PP) < RC(QQ);
});
// for(auto& it: T[i]) printf("Ai: %d, (%d, %d), type: %d\n", it.X, RC(it).X - le9, RC(it).Y - le9, it.Y);
// puts("------------------");
// calculate x1
pii prv = INF;
for(auto& it: T[i]) {
if(it.Y == 0) prv = RC(it);
else {
if(prv == INF) continue;
x1[it.Y][it.X] = day(RC(it), prv);
assert(x1[it.Y][it.X] >= 0);
}
}
reverse(T[i].begin(), T[i].end());
// calculate x2 and y
prv = INF;
for(auto& it: T[i]) {
if(it.Y == 0) {
if(prv != INF) {
y[it.X] = day(prv, RC(it));
assert(y[it.X] >= 0);
}
prv = RC(it);
}
else {
if(prv == INF) continue;
x2[it.Y][it.X] = day(prv, RC(it));
assert(x2[it.Y][it.X] >= 0);
}
}
}
int inf = 1000000;
for(int i=0; i<E; i++) {
int X1 = 2*inf, X2 = 2*inf, Y = 2*inf;
if(x1[1][i] && x1[2][i] && x1[3][i]) X1 = max({x1[1][i], x1[2][i], x1[3][i]});
if(x2[1][i] && x2[2][i] && x2[3][i]) X2 = max({x2[1][i], x2[2][i], x2[3][i]});
if(y[i]) Y = y[i];
int s1 = X1, e1 = X1 + Y - 2;
int s2 = X2, e2 = Y - 1;
e1 = min(e1, X1 + X2 - 2);
s1 = min(s1, inf);
e1 = min(e1, inf);
s2 = min(s2, inf);
e2 = min(e2, inf);
if(s1 <= e1) ++P[s1], --P[e1+1];
if(s2 <= e2) ++P[s2], --P[e2+1];
// printf("i: %d, (%d, %d), x1: %d, x2: %d, y: %d, [%d, %d], [%d, %d]\n", i, A[i].X-le9, A[i].Y-le9, X1, X2, Y, s1, e1, s2, e2);
}
long long ds = 0, sum = 0;
for(int i=1; i<inf; i++) {
ds += P[i];
sum += ds;
if(i == K) {
return !printf("%lld", sum);
}
}
printf("%lld", sum + ds*(K-inf+1));
return 0;
}
Compilation message (stderr)
2016_ho_t4.cpp: In function 'void input()':
2016_ho_t4.cpp:26:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d",&N,&K);
~~~~~^~~~~~~~~~~~~~
2016_ho_t4.cpp:28:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf(" %c", &S[i]);
~~~~~^~~~~~~~~~~~~~
2016_ho_t4.cpp: In function 'pii RC(pii)':
2016_ho_t4.cpp:84:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
# | 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... |