Submission #392896

#TimeUsernameProblemLanguageResultExecution timeMemory
392896vanicUFO (IZhO14_ufo)C++14
5 / 100
2098 ms117092 KiB
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <array> using namespace std; const int maxn=1e6+5; typedef long long ll; struct tournament{ vector < int > t; int pot; tournament(int sz){ for(int i=0; i<sz; i++){ t.push_back(0); } pot=sz/2; } void update(int x, int val){ t[x]+=val; for(x/=2; x>0; x/=2){ t[x]=max(t[x*2], t[x*2+1]); } } int query(int L, int D, int x, int l, int d, int val, bool p){ if(L>=l && D<=d){ // cout << L << ' ' << D << ' ' << t[x] << endl; if(t[x]>=val){ while(x<pot){ if(p){ if(t[x*2]>=val){ x*=2; } else{ x=x*2+1; } } else{ if(t[x*2+1]>=val){ x=x*2+1; } else{ x*=2; } } } return x-pot; } return -1; } int vrij=-1; if(p){ if((L+D)/2>=l){ vrij=query(L, (L+D)/2, x*2, l, d, val, p); } if(vrij!=-1){ return vrij; } if((L+D)/2+1<=d){ vrij=query((L+D)/2+1, D, x*2+1, l, d, val, p); } } else{ if((L+D)/2+1<=d){ vrij=query((L+D)/2+1, D, x*2+1, l, d, val, p); } if(vrij!=-1){ return vrij; } if((L+D)/2>=l){ vrij=query(L, (L+D)/2, x*2, l, d, val, p); } } return vrij; } }; vector < tournament > R, S; int n, m, r, k, p; vector < vector < int > > l; vector < vector < ll > > pref; int main(){ scanf("%d%d%d%d%d", &n, &m, &r, &k, &p); vector < int > vi; vector < ll > vi1; int a; int pot1=(1<<(int)ceil(log2(n))); tournament T1(pot1*2); for(int i=0; i<m; i++){ S.push_back(T1); } int pot2=(1<<(int)ceil(log2(m))); tournament T2(pot2*2); for(int i=0; i<n; i++){ R.push_back(T2); } vi1.resize(m+1, 0); for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ cin >> a; R[i].update(j+pot2, a); S[j].update(i+pot1, a); vi.push_back(a); } pref.push_back(vi1); l.push_back(vi); vi.clear(); } pref.push_back(vi1); char c; int b; int pos; // printf("krecem\n"); for(int i=0; i<k; i++){ getchar(); scanf("%c%d%d", &c, &a, &b); // printf("%c %d %d\n", c, a, b); a--; if(c=='W'){ pos=0; for(int j=0; j<r; j++){ pos=R[a].query(0, pot2-1, 1, pos, pot2-1, b, 1); // cout << "vracam " << pos << endl; if(pos==-1){ break; } R[a].update(pos+pot2, -1); S[pos].update(a+pot1, -1); l[a][pos]--; pos++; } } else if(c=='N'){ pos=0; for(int j=0; j<r; j++){ pos=S[a].query(0, pot1-1, 1, pos, pot1-1, b, 1); if(pos==-1){ break; } R[pos].update(a+pot2, -1); S[a].update(pos+pot1, -1); l[pos][a]--; pos++; } } else if(c=='E'){ pos=pot2-1; for(int j=0; j<r; j++){ pos=R[a].query(0, pot2-1, 1, 0, pos, b, 0); if(pos==-1){ break; } R[a].update(pos+pot2, -1); S[pos].update(a+pot1, -1); l[a][pos]--; pos--; } } else{ pos=pot1-1; for(int j=0; j<r; j++){ pos=S[a].query(0, pot1-1, 1, 0, pos, b, 0); if(pos==-1){ break; } R[pos].update(a+pot2, -1); S[a].update(pos+pot1, -1); l[pos][a]--; pos--; } } // printf("dalje\n"); } // printf("kraj\n"); for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ pref[i+1][j+1]=pref[i][j+1]+pref[i+1][j]-pref[i][j]+l[i][j]; } } ll maksi=0; for(int i=p; i<=n; i++){ for(int j=p; j<=m; j++){ maksi=max(maksi, pref[i][j]-pref[i-p][j]-pref[i][j-p]+pref[i-p][j-p]); } } printf("%lld\n", maksi); return 0; }

Compilation message (stderr)

ufo.cpp: In function 'int main()':
ufo.cpp:90:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   90 |  scanf("%d%d%d%d%d", &n, &m, &r, &k, &p);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ufo.cpp:123:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  123 |   scanf("%c%d%d", &c, &a, &b);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...