답안 #539336

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
539336 2022-03-18T18:04:40 Z mars4 Nafta (COI15_nafta) C++17
100 / 100
353 ms 130680 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp> 

using namespace std;
using namespace __gnu_pbds; 

#define ff              first
#define ss              second
#define ll              int64_t
#define ld              long double
#define nl              cout<<"\n"
#define i128            __int128_t
#define all(v)          v.begin(),v.end()
#define mset(a,v)       memset((a),(v),sizeof(a))
#define forn(i,a,b)     for(int64_t i=int64_t(a);i<int64_t(b);++i)
#define forb(i,a,b)     for(int64_t i=int64_t(a);i>=int64_t(b);--i)
#define fastio()        ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define mod         1'000'000'007
#define mod2        998'244'353 
#define inf         1'000'000'000'000'007
#define pi          3.14159265358979323846

template<class key,class cmp=std::less<key>>
using ordered_set=tree<key,null_type,cmp,rb_tree_tag,tree_order_statistics_node_update>;

template<class L,class R> ostream& operator<<(ostream& out,pair<L,R> &p)        {return out<<"("<<p.ff<<", "<<p.ss<<")";}
template<class T> ostream& operator<<(ostream& out,vector<T> &v)                {out<<"[";for(auto it=v.begin();it!=v.end();++it){if(it!=v.begin())out<<", ";out<<*it;}return out<<"]";}
template<class T> ostream& operator<<(ostream& out,deque<T> &v)                 {out<<"[";for(auto it=v.begin();it!=v.end();++it){if(it!=v.begin())out<<", ";out<<*it;}return out<<"]";}
template<class T> ostream& operator<<(ostream& out,set<T> &s)                   {out<<"{";for(auto it=s.begin();it!=s.end();++it){if(it!=s.begin())out<<", ";out<<*it;}return out<<"}";}
template<class T> ostream& operator<<(ostream& out,ordered_set<T> &s)           {out<<"{";for(auto it=s.begin();it!=s.end();++it){if(it!=s.begin())out<<", ";out<<*it;}return out<<"}";}
template<class L,class R> ostream& operator<<(ostream& out,map<L,R> &m)         {out<<"{";for(auto it=m.begin();it!=m.end();++it){if(it!=m.begin())out<<", ";out<<*it;}return out<<"}";}

void dbg_out() {cerr<<"]\n";}
template<typename Head,typename... Tail> 
void dbg_out(Head H,Tail... T) {cerr<<H;if(sizeof...(Tail))cerr<<", ";dbg_out(T...);}
#ifdef LOCAL
#define dbg(...) cerr<<"["<<#__VA_ARGS__<<"] = [",dbg_out(__VA_ARGS__)
#else
#define dbg(...)
#endif

//---------------------------------mars4---------------------------------

ll cnt[2000][2001];
ll pre[2000][2000];
ll dp[2000][2000];

void calc(ll l,ll r,ll optL,ll optR,ll level)
{
	if(l>r)
	{
		return;
	}
	ll mid=(l+r)>>1;
	pair<ll,ll> best={-1,-1};
	forn(i,optL,min(mid,optR)+1)
	{
		ll val=(i?dp[level-1][i-1]+cnt[i-1][mid]:0);
		if(val>best.ff)
		{
			best={val,i};
		}
	}
	dp[level][mid]=best.ff;
	ll opt=best.ss;
	calc(l,mid-1,optL,opt,level);
	calc(mid+1,r,opt,optR,level);
}

int main()
{
	fastio();
	ll z,n,m,t,k,i,j,l,d,h,r;
	cin>>n>>m;
	vector<string> a(n);
	for(auto &i:a)
	{
		cin>>i;
	}
	vector<ll> dx={1,0,0,-1};
	vector<ll> dy={0,1,-1,0};
	vector<ll> val(n*m);
	vector<vector<ll>> mark(n,vector<ll>(m,-1));
	ll id=0;
	forn(j,0,m)
	{
		forn(i,0,n)
		{
			if(a[i][j]!='.' and mark[i][j]==-1)
			{
				ll maxc=j;
				queue<pair<ll,ll>> q;
				q.push({i,j});
				mark[i][j]=id;
				while(!q.empty())
				{
					auto [r,c]=q.front();
					q.pop();
					maxc=max(maxc,c);
					val[id]+=(a[r][c]-'0');
					forn(k,0,4)
					{
						ll nr=r+dx[k];
						ll nc=c+dy[k];
						if(nr>=0 and nr<n and nc>=0 and nc<m and a[nr][nc]!='.' and mark[nr][nc]==-1)
						{
							q.push({nr,nc});
							mark[nr][nc]=id;
						}
					}
				}
				forn(k,j,maxc+1)
				{
					cnt[k][k]+=val[id];
					pre[k][k+1]-=val[id];
					pre[k][maxc+1]+=val[id];
				}
				id++;
			}
		}
	}
	forn(i,0,m)
	{
		ll ex=0;
		forn(j,i+1,m)
		{
			ex+=pre[i][j];
			cnt[i][j]=cnt[j][j]+ex;
		}
	}
	forn(i,0,m)
	{
		dp[0][i]=cnt[i][i];
	}
	vector<ll> ans;
	ans.push_back(*max_element(dp[0],dp[0]+m));
	forn(i,1,m)
	{
		calc(i,m-1,i,m-1,i);
		ans.push_back(*max_element(dp[i],dp[i]+m));
	}
	for(ll i:ans)
	{
		cout<<i<<"\n";
	}
	cerr<<"\nTime elapsed: "<<1000*clock()/CLOCKS_PER_SEC<<"ms\n";
	return 0;
}

Compilation message

nafta.cpp: In function 'int main()':
nafta.cpp:75:5: warning: unused variable 'z' [-Wunused-variable]
   75 |  ll z,n,m,t,k,i,j,l,d,h,r;
      |     ^
nafta.cpp:75:11: warning: unused variable 't' [-Wunused-variable]
   75 |  ll z,n,m,t,k,i,j,l,d,h,r;
      |           ^
nafta.cpp:75:13: warning: unused variable 'k' [-Wunused-variable]
   75 |  ll z,n,m,t,k,i,j,l,d,h,r;
      |             ^
nafta.cpp:75:15: warning: unused variable 'i' [-Wunused-variable]
   75 |  ll z,n,m,t,k,i,j,l,d,h,r;
      |               ^
nafta.cpp:75:17: warning: unused variable 'j' [-Wunused-variable]
   75 |  ll z,n,m,t,k,i,j,l,d,h,r;
      |                 ^
nafta.cpp:75:19: warning: unused variable 'l' [-Wunused-variable]
   75 |  ll z,n,m,t,k,i,j,l,d,h,r;
      |                   ^
nafta.cpp:75:21: warning: unused variable 'd' [-Wunused-variable]
   75 |  ll z,n,m,t,k,i,j,l,d,h,r;
      |                     ^
nafta.cpp:75:23: warning: unused variable 'h' [-Wunused-variable]
   75 |  ll z,n,m,t,k,i,j,l,d,h,r;
      |                       ^
nafta.cpp:75:25: warning: unused variable 'r' [-Wunused-variable]
   75 |  ll z,n,m,t,k,i,j,l,d,h,r;
      |                         ^
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 980 KB Output is correct
2 Correct 1 ms 980 KB Output is correct
3 Correct 1 ms 980 KB Output is correct
4 Correct 1 ms 968 KB Output is correct
5 Correct 1 ms 972 KB Output is correct
6 Correct 1 ms 980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 980 KB Output is correct
2 Correct 1 ms 980 KB Output is correct
3 Correct 1 ms 980 KB Output is correct
4 Correct 1 ms 968 KB Output is correct
5 Correct 1 ms 972 KB Output is correct
6 Correct 1 ms 980 KB Output is correct
7 Correct 7 ms 6236 KB Output is correct
8 Correct 7 ms 6228 KB Output is correct
9 Correct 8 ms 6580 KB Output is correct
10 Correct 5 ms 6228 KB Output is correct
11 Correct 6 ms 6236 KB Output is correct
12 Correct 5 ms 6356 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 980 KB Output is correct
2 Correct 1 ms 980 KB Output is correct
3 Correct 1 ms 980 KB Output is correct
4 Correct 1 ms 968 KB Output is correct
5 Correct 1 ms 972 KB Output is correct
6 Correct 1 ms 980 KB Output is correct
7 Correct 7 ms 6236 KB Output is correct
8 Correct 7 ms 6228 KB Output is correct
9 Correct 8 ms 6580 KB Output is correct
10 Correct 5 ms 6228 KB Output is correct
11 Correct 6 ms 6236 KB Output is correct
12 Correct 5 ms 6356 KB Output is correct
13 Correct 259 ms 124468 KB Output is correct
14 Correct 294 ms 125136 KB Output is correct
15 Correct 353 ms 130680 KB Output is correct
16 Correct 209 ms 124744 KB Output is correct
17 Correct 199 ms 125792 KB Output is correct
18 Correct 193 ms 125788 KB Output is correct