Submission #51685

#TimeUsernameProblemLanguageResultExecution timeMemory
51685gs13105영역 (JOI16_ho_t4)C++17
100 / 100
111 ms9852 KiB
#include <cstdio> #include <cstdlib> #include <cstring> #include <cassert> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <list> #include <stack> #include <queue> #include <deque> #include <set> #include <map> #include <tuple> #include <iterator> using namespace std; struct pos { int x, y; bool operator <(const pos &p) const { return x != p.x ? x < p.x : y < p.y; } bool operator ==(const pos &p) const { return x == p.x && y == p.y; } }; struct eve { int x, e; bool operator <(const eve &a) const { return x != a.x ? x < a.x : e < a.e; } }; inline int irem(int x, int y) { assert(y != 0); y = abs(y); return (x % y + y) % y; } int kx, ky; pair<pos, int> decom(pos p) { if(kx != 0) { pos q; q.x = irem(p.x, kx); int t = (q.x - p.x) / kx; q.y = p.y + t * ky; return { q, t }; } if(ky != 0) { pos q; q.y = irem(p.y, ky); int t = (q.y - p.y) / ky; q.x = p.x + t * kx; return { q, t }; } return { p, 0 }; } vector<pos> com; inline int idx(pos p) { return lower_bound(com.begin(), com.end(), p) - com.begin(); } char str[100010]; pos arr[100010]; pos base[100010]; int off[100010]; vector<int> lis[100010]; const int dx[4] = { 0, 0, 1, 1 }; const int dy[4] = { 0, 1, 0, 1 }; int main() { //freopen("in", "r", stdin); //freopen("out", "w", stdout); int n, k, i; scanf("%d%d%s", &n, &k, str); kx = ky = 0; for(i = 0; i <= n; i++) { arr[i] = { kx, ky }; if(i == n) break; if(str[i] == 'E') kx++; else if(str[i] == 'N') ky++; else if(str[i] == 'W') kx--; else ky--; } if(kx == 0 && ky == 0) k = 1; for(i = 0; i <= n; i++) { tie(base[i], off[i]) = decom(arr[i]); com.push_back(base[i]); } sort(com.begin(), com.end()); com.erase(unique(com.begin(), com.end()), com.end()); int sz = com.size(); for(i = 0; i <= n; i++) lis[idx(base[i])].push_back(off[i]); long long res = 0; for(i = 0; i < sz; i++) { int a[4]; int b[4]; bool ok = 1; for(int d = 0; d < 4; d++) { pos p; tie(p, b[d]) = decom({ com[i].x + dx[d], com[i].y + dy[d] }); a[d] = idx(p); if(!(a[d] < com.size() && com[a[d]] == p)) { ok = 0; break; } } if(!ok) continue; vector<eve> v; for(int d = 0; d < 4; d++) { for(int l : lis[a[d]]) { v.push_back({ l - b[d], d + 1 }); v.push_back({ l - b[d] + k, -(d + 1) }); } } sort(v.begin(), v.end()); int s[4]; memset(s, 0, sizeof s); int cnt = 0; bool inr = 0; int sta; for(int j = 0; j < v.size(); j++) { eve t = v[j]; if(t.e > 0) { t.e--; s[t.e]++; if(s[t.e] == 1) cnt++; } else { t.e = -t.e - 1; s[t.e]--; if(s[t.e] == 0) cnt--; } if(j == (int)v.size() - 1 || t.x != v[j + 1].x) { if(!inr && cnt == 4) { inr = 1; sta = t.x; } else if(inr && cnt != 4) { inr = 0; res += t.x - sta; } } } } printf("%lld\n", res); return 0; }

Compilation message (stderr)

2016_ho_t4.cpp: In function 'int main()':
2016_ho_t4.cpp:143:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             if(!(a[d] < com.size() && com[a[d]] == p))
                  ~~~~~^~~~~~~~~~~~
2016_ho_t4.cpp:169:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < v.size(); j++)
                        ~~^~~~~~~~~~
2016_ho_t4.cpp:97:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%s", &n, &k, str);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
2016_ho_t4.cpp:197:32: warning: 'sta' may be used uninitialized in this function [-Wmaybe-uninitialized]
                     res += t.x - sta;
                            ~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...