제출 #1278081

#제출 시각아이디문제언어결과실행 시간메모리
1278081PetrixUFO (IZhO14_ufo)C++20
100 / 100
505 ms149184 KiB
#include<iostream> #include<vector> using namespace std; #define int long long //ifstream cin("ufo.in"); //ofstream cout("ufo.out"); int ram; vector<int>v; vector<vector<int>> a; struct arbint{ vector<int> aint; void curata(int n){ aint.resize(4*n); } void update(int nod,int st,int dr,int poz,int val){ if(st==dr){ aint[nod]=val; return; } int mij=(st+dr)/2; if(poz<=mij)update(2*nod,st,mij,poz,val); else update(2*nod+1,mij+1,dr,poz,val); aint[nod]=max(aint[2*nod],aint[2*nod+1]); } void gas_prim(int nod,int st,int dr,int a){ if(!ram || aint[nod]<a)return; if(st==dr){ ram--; v.push_back(st); return; } int mij=(st+dr)/2; gas_prim(2*nod,st,mij,a); gas_prim(2*nod+1,mij+1,dr,a); } void gas_ult(int nod,int st,int dr,int a){ if(!ram || aint[nod]<a)return; if(st==dr){ ram--; v.push_back(st); return; } int mij=(st+dr)/2; gas_ult(2*nod+1,mij+1,dr,a); gas_ult(2*nod,st,mij,a); } }lin[1000005],col[1000005]; signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int i,j,n,m,r,k,p,ina,poz,rasp=0;char ch; cin>>n>>m>>r>>k>>p; a.resize(n+1);a[0].resize(m+1); for(i=1;i<=m;i++){ col[i].curata(n+1);a[0][i]=0; } for(i=1;i<=n;i++){ lin[i].curata(m+1);a[i].resize(m+1); a[i][0]=0; for(j=1;j<=m;j++){ cin>>a[i][j]; lin[i].update(1,1,m,j,a[i][j]); col[j].update(1,1,n,i,a[i][j]); } } while(k){k--; v.clear(); ram=r;///printf("a"); cin>>ch>>poz>>ina; if(ch=='W'){ lin[poz].gas_prim(1,1,m,ina); for(auto it:v){ a[poz][it]--; lin[poz].update(1,1,m,it,a[poz][it]); col[it].update(1,1,n,poz,a[poz][it]); } }else if(ch=='N'){ col[poz].gas_prim(1,1,n,ina); for(auto it:v){ a[it][poz]--; lin[it].update(1,1,m,poz,a[it][poz]); col[poz].update(1,1,n,it,a[it][poz]); } }else if(ch=='E'){ lin[poz].gas_ult(1,1,m,ina); for(auto it:v){ a[poz][it]--; lin[poz].update(1,1,m,it,a[poz][it]); col[it].update(1,1,n,poz,a[poz][it]); } }else{ col[poz].gas_ult(1,1,n,ina); for(auto it:v){ a[it][poz]--; lin[it].update(1,1,m,poz,a[it][poz]); col[poz].update(1,1,n,it,a[it][poz]); } } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1]; } } for(i=p;i<=n;i++){ for(j=p;j<=m;j++){ rasp=max(rasp,a[i][j]-a[i][j-p]-a[i-p][j]+a[i-p][j-p]); } } cout<<rasp; }
#Verdict Execution timeMemoryGrader output
Fetching results...