Submission #20368

#TimeUsernameProblemLanguageResultExecution timeMemory
20368adminCan polan into space? (OJUZ11_space)C++14
0 / 100
387 ms33040 KiB
#include <cstdio>
#include <cassert>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pp;
 
int N;
const int MAX_N = 200010;
 
ll a[MAX_N][3],sum[MAX_N][3];
 
vector<int> pmax_id;
 
struct mem{
	ll c,v,id;
	mem(){}
	mem(ll c_,ll v_,ll id_):c(c_),v(v_),id(id_){}
	bool operator<(const mem& r)const{
		return c<r.c;
	}
}tree[MAX_N*4],dp[MAX_N];
ll add[MAX_N*4];
 
#define LL (2*k+1)
#define RR (2*k+2)
 
void make(int s,int e,int k){
	if(s==e){
		tree[k]=mem(-1e15,s,0);
		return;
	}
	int mid=(s+e)/2;
	make(s,mid,LL);
	make(mid+1,e,RR);
}
 
void up(int k){
	tree[k]=max(tree[LL],tree[RR]);
}
 
void down(int k){
	tree[LL].c+=add[k];
	tree[RR].c+=add[k];
	add[LL]+=add[k];
	add[RR]+=add[k];
	add[k]=0;
}
 
void addRange(int s,int e,int L,int R,int c,int k){
	if(s>R||e<L)return;
	if(L<=s&&e<=R){
		add[k]+=c;
		tree[k].c+=c;
		return;
	}
	down(k);
 
	int mid=(s+e)/2;
	addRange(s,mid,L,R,c,LL);
	addRange(mid+1,e,L,R,c,RR);
	up(k);
}
 
void update(int s,int e,int x,int c,int k){
	if(s==e){
		tree[k].c=c;
		tree[k].v=s;
		return;
	}
	down(k);
 
	int mid=(s+e)/2;
	if(x<=mid)update(s,mid,x,c,LL);
	else update(mid+1,e,x,c,RR);
	up(k);
}
 
mem query(int s,int e,int L,int R,int k){
	if(s>R||e<L)return mem(-1e15,0,0);
	if(L<=s&&e<=R){
		return tree[k];
	}
	int mid=(s+e)/2;
	return max(query(s,mid,L,R,LL),query(mid+1,e,L,R,RR));
}
 
int getPos(int x){
	int lo=0,hi=pmax_id.size()-1,mid;
	while(lo+1<hi){
		mid=(lo+hi)/2;
		if(pmax_id[mid]<=x)lo=mid;
		else hi=mid;
	}
	if(pmax_id[lo]>x)return pmax_id[lo];
	return pmax_id[hi];
}
 
void f(int x,vector<int>& s){
	if(x==0)return;
	f(dp[x].v,s);
	s.push_back(x);
}
 
int main(){
	
	scanf("%d",&N);
	for(int i=1;i<=N;i++){
		for(int j=0;j<3;j++){
			scanf("%lld",&a[i][j]);
			sum[i][j]+=sum[i-1][j]+a[i][j];
		}
	}
 
	make(1,N,0);
 
	for(int i=1;i<=N;i++){
		dp[i]=mem(sum[i-1][1]+a[i][0],0,0);
		int sz=pmax_id.size();
		while(sz>1&&a[pmax_id[sz-1]][2]-a[pmax_id[sz-1]][1]<a[i-1][2]-a[i-1][1]){
			ll pre_max=a[pmax_id[sz-1]][2]-a[pmax_id[sz-1]][1];
			ll cur_max=a[i-1][2]-a[i-1][1];
			addRange(1,N,pmax_id[sz-2],pmax_id[sz-1]-1,cur_max-pre_max,0);
			pmax_id.pop_back();sz--;
		}
		pmax_id.push_back(i-1);
/*
		for(int j=1;j<=i-2;j++){
			mem t = query(1,N,j,j,0);
			printf("(%lld,%lld,%lld) ",t.c,t.v,t.id);
		}printf("   :   ");
*/
		mem dp_j = query(1,N,1,i-2,0);
//		printf("%lld  -->  ",dp_j+a[i][0]-a[i][1]+sum[i][1]);
 
		if(dp[i].c<dp_j.c+a[i][0]-a[i][1]+sum[i][1]){
			dp[i].c=dp_j.c+a[i][0]-a[i][1]+sum[i][1];
			dp[i].v=dp_j.v;
			dp[i].id=getPos(dp_j.v);
		}
 
//		printf("(%lld,%lld,%lld)\n",dp[i].c,dp[i].v,dp[i].id);
 
		update(1,N,i,dp[i].c-sum[i][1]+a[i+1][2]-a[i+1][1],0);
	}
 
 
	ll ans=0,v;
	for(int i=1;i<=N;i++){
		if(ans<dp[i].c+sum[N][1]-sum[i][1]){
			ans=dp[i].c+sum[N][1]-sum[i][1];
			v=i;
		}
	}
 
	printf("%lld\n",ans);
 
	vector<int> st;
	f(v,st);
 
	assert(!st.empty());
 
	for(int i=0;i<st.size();i++){
		printf("%d ",st[i]);
	}
 
	for(int i=st.front()-1;i>=1;i--)printf("%d ",i);
	for(int i=st.back()+1;i<=N;i++)printf("%d ",i);
	
	for(int i=1;i<st.size();i++){
		for(int j=st[i-1]+1;j<dp[st[i]].id;j++)printf("%d ",j);
		for(int j=st[i]-1;j>=dp[st[i]].id;j--)printf("%d ",j);
	}
	puts("");
 
	return 0;
}

Compilation message (stderr)

space.cpp: In function 'int main()':
space.cpp:165:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<st.size();i++){
               ^
space.cpp:172:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=1;i<st.size();i++){
               ^
space.cpp:109:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&N);
                ^
space.cpp:112:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%lld",&a[i][j]);
                          ^
space.cpp:161:3: warning: 'v' may be used uninitialized in this function [-Wmaybe-uninitialized]
  f(v,st);
   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...