Submission #1162511

#TimeUsernameProblemLanguageResultExecution timeMemory
1162511eggx50000영역 (JOI16_ho_t4)C++20
100 / 100
217 ms72536 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...