Submission #163714

#TimeUsernameProblemLanguageResultExecution timeMemory
163714TadijaSebez영역 (JOI16_ho_t4)C++11
100 / 100
885 ms97772 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back const int N=100050; const int inf=1e9+7; int n,k; char s[N]; int dx,dy; map<pair<ll,int>,set<int>> ps,qs; map<pair<ll,int>,set<pair<ll,ll>>> intervals; map<pair<ll,int>,int> Y; vector<pair<int,int>> sq; map<pair<ll,int>,int> dp; int md(int x, int dx){ return (x%dx+dx)%dx;} void SQ(int x, int y) { ll z=(ll)y*dx-(ll)x*dy; Y[{z,x}]=y; qs[{z,md(x,dx)}].insert(x); sq.pb({x,y}); } void Add(int x, int y) { ll z=(ll)y*dx-(ll)x*dy; ps[{z,md(x,dx)}].insert(x); SQ(x,y); SQ(x-1,y); SQ(x,y-1); SQ(x-1,y-1); } int Get(int x, int y) { ll z=(ll)y*dx-(ll)x*dy; auto it=ps[{z,md(x,dx)}].lower_bound(x); if(it==ps[{z,md(x,dx)}].end()) return inf; assert((*it-x)%dx==0); return (*it-x)/dx; } void Solve() { int x=0,y=0; Add(x,y); for(int i=1;i<=n;i++) { if(s[i]=='E') y++; if(s[i]=='W') y--; if(s[i]=='N') x++; if(s[i]=='S') x--; Add(x,y); } ll ans=0; sort(sq.begin(),sq.end()); sq.erase(unique(sq.begin(),sq.end()),sq.end()); for(auto q:sq) { tie(x,y)=q; ll z=(ll)y*dx-(ll)x*dy; dp[q]=max({Get(x,y),Get(x+1,y),Get(x,y+1),Get(x+1,y+1)}); if(dp[q]<k) intervals[{z,md(x,dx)}].insert({x+(ll)dp[q]*dx,x+(ll)k*dx}); } for(auto st:intervals) { ll r=-9e18; for(auto i:st.second) { ll a,b;tie(a,b)=i; if(r<a) ans+=(b-a)/dx,r=b; else if(r<b) ans+=(b-r)/dx,r=b; } } printf("%lld\n",ans); } void Brute() { set<pair<int,int>> pp; int x=0,y=0; pp.insert({x,y}); for(int i=1;i<=n;i++) { if(s[i]=='E') y++; if(s[i]=='W') y--; if(s[i]=='N') x++; if(s[i]=='S') x--; pp.insert({x,y}); } int ans=0; for(auto p:pp) { tie(x,y)=p; if(pp.count({x,y}) && pp.count({x+1,y}) && pp.count({x,y+1}) && pp.count({x+1,y+1})) ans++; } printf("%i\n",ans); } int main() { int x=0,y=0; scanf("%i %i",&n,&k); scanf("%s",s+1); for(int i=1;i<=n;i++) { if(s[i]=='E') y++; if(s[i]=='W') y--; if(s[i]=='N') x++; if(s[i]=='S') x--; } if(y<0) for(int i=1;i<=n;i++){ if(s[i]=='E') s[i]='W';else if(s[i]=='W') s[i]='E';} if(x<0) for(int i=1;i<=n;i++){ if(s[i]=='N') s[i]='S';else if(s[i]=='S') s[i]='N';} y=abs(y);x=abs(x); if(x==0) { for(int i=1;i<=n;i++) { if(s[i]=='E') s[i]='N'; else if(s[i]=='W') s[i]='S'; else if(s[i]=='N') s[i]='E'; else if(s[i]=='S') s[i]='W'; } swap(x,y); } dx=x;dy=y; if(dx==0) Brute(); else Solve(); return 0; }

Compilation message (stderr)

2016_ho_t4.cpp: In function 'int main()':
2016_ho_t4.cpp:98:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i",&n,&k);
  ~~~~~^~~~~~~~~~~~~~~
2016_ho_t4.cpp:99:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%s",s+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...