답안 #40631

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
40631 2018-02-06T01:27:54 Z faustaadp UFO (IZhO14_ufo) C++14
95 / 100
2000 ms 174632 KB
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
int n,m,r,k,p,i,j,ta,tb,hv,L,R,C,hs;
char ct;
vector<vector<int> > a,str,stc,pr; 
pair<int,int> hz;
void ini()
{
	for(i=0;i<=n;i++)
	{
		vector<int> vt;
		for(j=0;j<=m;j++)
			vt.pb(0);
		a.pb(vt);
	}
	for(i=0;i<=n;i++)
	{
		vector<int> vt;
		for(j=0;j<=m;j++)
			vt.pb(0);
		pr.pb(vt);
	}
	for(i=0;i<=n;i++)
	{
		vector<int> vt;
		for(j=0;j<=4*m;j++)
			vt.pb(0);
		stc.pb(vt);
	}
	for(i=0;i<=m;i++)
	{
		vector<int> vt;
		for(j=0;j<=4*n;j++)
			vt.pb(0);
		str.pb(vt);
	}
}
void upr(int aa,int bb,int cc,int dd,int ee,int ff)
{
	if(aa==bb)
		str[ff][ee]=dd;
	else
	{
		int ce=(aa+bb)/2;
		if(cc<=ce)
			upr(aa,ce,cc,dd,ee*2,ff);
		else
			upr(ce+1,bb,cc,dd,ee*2+1,ff);
		str[ff][ee]=max(str[ff][ee*2],str[ff][ee*2+1]);
	}		
}
void upc(int aa,int bb,int cc,int dd,int ee,int ff)
{
	if(aa==bb)
		stc[ff][ee]=dd;
	else
	{
		int ce=(aa+bb)/2;
		if(cc<=ce)
			upc(aa,ce,cc,dd,ee*2,ff);
		else
			upc(ce+1,bb,cc,dd,ee*2+1,ff);
		stc[ff][ee]=max(stc[ff][ee*2],stc[ff][ee*2+1]);
	}		
}
pair<int,int> nilN(int aa,int bb,int ee,int ff)
{
	if(aa==bb)
		return mp(aa,str[ff][ee]-1);
	int ce=(aa+bb)/2;
	if(str[ff][ee*2]>=tb)
		return nilN(aa,ce,ee*2,ff);
	else
		return nilN(ce+1,bb,ee*2+1,ff);
}
pair<int,int> nilS(int aa,int bb,int ee,int ff)
{
	if(aa==bb)
		return mp(aa,str[ff][ee]-1);
	int ce=(aa+bb)/2;
	if(str[ff][ee*2+1]>=tb)
		return nilS(ce+1,bb,ee*2+1,ff);
	else
		return nilS(aa,ce,ee*2,ff);
}
pair<int,int> nilW(int aa,int bb,int ee,int ff)
{
	if(aa==bb)
		return mp(aa,stc[ff][ee]-1);
	int ce=(aa+bb)/2;
	if(stc[ff][ee*2]>=tb)
		return nilW(aa,ce,ee*2,ff);
	else
		return nilW(ce+1,bb,ee*2+1,ff);
}
pair<int,int> nilE(int aa,int bb,int ee,int ff)
{
	if(aa==bb)
		return mp(aa,stc[ff][ee]-1);
	int ce=(aa+bb)/2;
	if(stc[ff][ee*2+1]>=tb)
		return nilE(ce+1,bb,ee*2+1,ff);
	else
		return nilE(aa,ce,ee*2,ff);
}
int nil(int aa,int bb,int cc,int ee,int ff)
{
	if(aa==bb)
		return stc[ff][ee];
	else
	{
		int ce=(aa+bb)/2;
		if(cc<=ce)
			return nil(aa,ce,cc,ee*2,ff);
		else
			return nil(ce+1,bb,cc,ee*2+1,ff);
	}
}
int main()
{
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>r>>k>>p;
	ini();
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		{
			cin>>ta;
			upr(1,n,i,ta,1,j);
			upc(1,m,j,ta,1,i);
		}
	while(k--)
	{
		cin>>ct>>ta>>tb;
		vector<pair<int,int> > v;
		if(ct=='N')
		{
			for(i=1;i<=r;i++)
			{
				if(str[ta][1]<tb)
					break;
				hz=nilN(1,n,1,ta);
				upr(1,n,hz.fi,-10e8,1,ta);
				v.pb(hz);
			}
			for(i=0;i<v.size();i++)
			{
				upr(1,n,v[i].fi,v[i].se,1,ta);
				upc(1,m,ta,v[i].se,1,v[i].fi);
			}
		}
		else
		if(ct=='S')
		{
			for(i=1;i<=r;i++)
			{
				if(str[ta][1]<tb)
					break;
				hz=nilS(1,n,1,ta);
				upr(1,n,hz.fi,-10e8,1,ta);
				v.pb(hz);
			}
			for(i=0;i<v.size();i++)
			{
				upr(1,n,v[i].fi,v[i].se,1,ta);
				upc(1,m,ta,v[i].se,1,v[i].fi);
			}
		}
		else
		if(ct=='W')
		{
			for(i=1;i<=r;i++)
			{
				if(stc[ta][1]<tb)
					break;
				hz=nilW(1,m,1,ta);
				upc(1,m,hz.fi,-10e8,1,ta);
				v.pb(hz);
			}
			for(i=0;i<v.size();i++)
			{
				upr(1,n,ta,v[i].se,1,v[i].fi);
				upc(1,m,v[i].fi,v[i].se,1,ta);
			}
		}
		else
		{
			for(i=1;i<=r;i++)
			{
				if(stc[ta][1]<tb)
					break;
				hz=nilE(1,m,1,ta);
				upc(1,m,hz.fi,-10e8,1,ta);
				v.pb(hz);
			}
			for(i=0;i<v.size();i++)
			{
				upr(1,n,ta,v[i].se,1,v[i].fi);
				upc(1,m,v[i].fi,v[i].se,1,ta);
			}
		}
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			a[i][j]=nil(1,m,j,1,i);
			pr[i][j]=pr[i][j-1]+pr[i-1][j]-pr[i-1][j-1]+a[i][j];
	//		cout<<a[i][j]<<" ";
		}
	//	cout<<"\n";
	}
	for(i=1;i+p-1<=n;i++)
		for(j=1;j+p-1<=m;j++)
			hs=max(hs,pr[i+p-1][j+p-1]-pr[i-1][j+p-1]-pr[i+p-1][j-1]+pr[i-1][j-1]);
	cout<<hs<<"\n";
}

Compilation message

ufo.cpp: In function 'int main()':
ufo.cpp:150:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(i=0;i<v.size();i++)
             ^
ufo.cpp:167:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(i=0;i<v.size();i++)
             ^
ufo.cpp:184:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(i=0;i<v.size();i++)
             ^
ufo.cpp:200:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(i=0;i<v.size();i++)
             ^
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 248 KB Output is correct
2 Correct 2 ms 356 KB Output is correct
3 Correct 3 ms 560 KB Output is correct
4 Correct 26 ms 1032 KB Output is correct
5 Correct 164 ms 3684 KB Output is correct
6 Correct 370 ms 24088 KB Output is correct
7 Correct 583 ms 58104 KB Output is correct
8 Correct 504 ms 62564 KB Output is correct
9 Correct 978 ms 62776 KB Output is correct
10 Correct 1277 ms 69564 KB Output is correct
11 Correct 1031 ms 72408 KB Output is correct
12 Correct 1343 ms 76144 KB Output is correct
13 Correct 1533 ms 91280 KB Output is correct
14 Correct 1131 ms 91280 KB Output is correct
15 Correct 1294 ms 91280 KB Output is correct
16 Correct 567 ms 93988 KB Output is correct
17 Correct 1797 ms 113744 KB Output is correct
18 Correct 481 ms 115020 KB Output is correct
19 Correct 832 ms 119888 KB Output is correct
20 Execution timed out 2037 ms 174632 KB Time limit exceeded