Submission #1151404

#TimeUsernameProblemLanguageResultExecution timeMemory
1151404DeadlyCriticUFO (IZhO14_ufo)C++20
100 / 100
520 ms82652 KiB
// template.cpp // use inp.txt/out.txt for file IO /* Pragma: If ever in doubt about whether your pragmas are correct, turn on most compiler warnings with the command-line option -Wall(or the more specific -Wunknown-pragmas). use assert(__builtin_cpu_supports("avx2")) to check if intruction set is available */ // #pragma GCC optimize ("O2,unroll-loops") // #pragma GCC optimize("no-stack-protector,fast-math") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") // #pragma GCC optimize("O3","unroll-loops") // #pragma GCC optimize ("Ofast") // #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt") // #pragma GCC target("sse4") // instead of avx2 // __attribute__((target("avx2"), optimize("O3", "unroll-loops"))) #include <bits/stdc++.h> #define oo (1000'000'000'000'000'000LL) #define cif(i, n) for(int i = 0; i < n; i++) #define ccif(i, l, r) for(int i = l; i < r; i++) #define rif(i, n) for(int i = n-1; i >= 0; i--) #define rrif(i, l, r) for(int i = r-1; i >= l; i--) #define scan(a, __n) {for(int __ = 0; __ < __n; __++)cin >> a[__];} #define print(a, __n) {for(int __ = 0; __ < __n; __++)cout << a[__] << ' '; cout << '\n';} #define sz(s) ((int)s.size()) #define dbg(x) cerr << #x << " : " << x << endl; #define rep(i, l, r) for(int i = l; i < r; i++) // #define mset(a, chr) memset(a, chr, sizeof a) #define mset(a) memset(a, 0, sizeof a) // #define int ll #define fastIO ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL); #define ff first #define ss second #define all(v) v.begin(), v.end() #define uni(v) sort(all(v)), v.resize(unique(all(v))-v.begin()); #define c0 (v<<1) #define c1 (c0|1) #define md ((l+r)/2) using namespace std; typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<ll> vl; typedef vector<pii> vii; typedef vector<pll> vll; typedef vector<ld> vd; typedef pair<ld, ld> pt; typedef vector<pt> vpt; ostream& operator<<(ostream& os, pt p) { return os << "(" << p.ff << "," << p.ss << ")"; } const ld PI = 3.14159265359; const int mod = 1e9+7; // const int maxFac = 1e6+7; // ll fac[maxFac], _fac[maxFac]; // ll po(ll b, ll p){ // b %= mod; // p %= mod-1; // ll r = 1; // while(p){ // if(p&1)r = r*b%mod; // p >>= 1; // b = b*b%mod; // } // return r; // } // ll choose(ll k, ll n){ // return fac[n]*_fac[k]%mod*_fac[n-k]%mod; // } // ll factorial(ll n, ll k){ // ll ret = 1; // for(ll i = n; i >= n-k+1; i--){ // ret = ret*i%mod; // } // return ret; // } // vii adj = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; const int maxN = 1e6+7; struct segment{ vi seg; int n; void build(const vi& a) { n = sz(a); seg.resize(n<<2); build(1, 0, n, a); } void build(int v, int l, int r, const vi& a){ if(r-l == 1){ seg[v] = a[l]; } else{ build(c0, l, md, a); build(c1, md, r, a); seg[v] = max(seg[c0], seg[c1]); } } int askfirst(int ql, int qr, int x){ return askfirst(1, 0, n, ql, qr, x); } int askfirst(int v, int l, int r, int ql, int qr, int x){ if(seg[v] < x || qr <= l || r <= ql)return -1; if(r-l == 1)return l; int rt = askfirst(c0, l, md, ql, qr, x); if(rt == -1){ return askfirst(c1, md, r, ql, qr, x); } return rt; } int asklast(int ql, int qr, int x){ return asklast(1, 0, n, ql, qr, x); } int asklast(int v, int l, int r, int ql, int qr, int x){ if(seg[v] < x || qr <= l || r <= ql)return -1; if(r-l == 1)return l; int rt = asklast(c1, md, r, ql, qr, x); if(rt == -1){ return asklast(c0, l, md, ql, qr, x); } return rt; } void dec(int po){ dec(1, 0, n, po); } void dec(int v, int l, int r, int po){ if(r-l == 1)seg[v]--; else{ if(po < md)dec(c0, l, md, po); else dec(c1, md, r, po); seg[v] = max(seg[c0], seg[c1]); } } }; inline void slv(){ int n, m, r, q, p; cin >> n >> m >> r >> q >> p; int a[n][m]; segment row[n], cul[m]; cif(i, n)scan(a[i], m); cif(i, n){ vi v; cif(j, m)v.push_back(a[i][j]); row[i].build(v); } cif(j, m){ vi v; cif(i, n)v.push_back(a[i][j]); cul[j].build(v); } auto dec = [&](int i, int j) -> void { row[i].dec(j); cul[j].dec(i); // cout << make_pair(i, j) << ' '; }; while(q--){ char c; int idx, hi; cin >> c >> idx >> hi; idx--; if(c == 'N'){ int rr = r; int ls = 0; while(rr > 0 && ls != -1){ rr--; ls = cul[idx].askfirst(ls, cul[idx].n, hi); if(ls != -1){ dec(ls, idx); a[ls][idx]--; ls++; } } } else if(c == 'S'){ int rr = r; int ls = cul[idx].n; while(rr > 0 && ls != -1){ rr--; ls = cul[idx].asklast(0, ls, hi); if(ls != -1){ dec(ls, idx); a[ls][idx]--; } } } else if(c == 'E'){ int rr = r; int ls = row[idx].n; while(rr > 0 && ls != -1){ rr--; ls = row[idx].asklast(0, ls, hi); if(ls != -1){ dec(idx, ls); a[idx][ls]--; } } } else if(c == 'W'){ int rr = r; int ls = 0; while(rr > 0 && ls != -1){ rr--; ls = row[idx].askfirst(ls, row[idx].n, hi); if(ls != -1){ dec(idx, ls); a[idx][ls]--; ls++; } } } // cout << endl; } int ans = 0; cif(li, n){ cif(lj, m){ int ri = li+p; int rj = lj+p; if(ri <= n && rj <= m){ int sm = 0; for(int i = li; i < ri; i++){ for(int j = lj; j < rj; j++){ sm += a[i][j]; } } ans = max(ans, sm); } } } cout << ans << '\n'; // cif(i, n)print(a[i], m); } /* */ inline void prep(){ // fac[0] = 1; // for(int i = 1; i < maxFac; i++)fac[i] = fac[i-1]*i%mod; // _fac[maxFac-1] = po(fac[maxFac-1], mod-2); // for(int i = maxFac-2; i >= 0; i--)_fac[i] = _fac[i+1]*(i+1)%mod; // w[0] = 1; // for(int i = 1; i < maxN; i++)w[i] = w[i-1]*p%mod; // _w[maxN-1] = po(w[maxN-1], mod-2); // for(int i = maxN-2; i >= 0; i--)_w[i] = _w[i+1]*p%mod; // for(int i = 2; i < maxN; i++){ // if(lp[i] == 0){ // lp[i] = i; // pr.push_back(i); // } // for (int j = 0; i * pr[j] < maxN; ++j) { // lp[i * pr[j]] = pr[j]; // if (pr[j] == lp[i]) { // break; // } // } // } } signed main(){ // freopen("inp.txt", "r", stdin); // freopen("out.txt", "w", stdout); fastIO; // cout << fixed << setprecision (15); prep(); int t = 1; // cin >> t; while(t--){ // cout << slv() << '\n'; slv(); // string s; // cin >> s; // bool x = slv(); // cout << (x?"YES":"NO") << '\n'; } cout.flush(); } /* */
#Verdict Execution timeMemoryGrader output
Fetching results...