제출 #221249

#제출 시각아이디문제언어결과실행 시간메모리
221249cgiosy수열 (APIO14_sequence)C++17
61 / 100
768 ms3488 KiB
#include <bits/stdc++.h>
using namespace std;
using ld=double;
using ll=long long;

int main() {
	ios::sync_with_stdio(0);cin.tie(0);
	int N, K;
	cin>>N>>K; ++K;
	vector<ll> A(N+1);
	vector<int> P(N+1);
	for(int i=1; i<=N; i++) cin>>A[i], A[i]+=A[i-1];

	auto f=[&](ll dt) {
		vector<int> C(N+1), X(1<<32-__builtin_clz(N));
		vector<ll> D(N+1);
		auto f=[&](int i, int x) {
			return (A[x]-A[i])*A[i]*2 + D[i];
		};
		auto cmp=[&](int i, int j, int x) {
			// return f(i, x)-C[i]*dt>f(j, x)-C[j]*dt;
			return f(i, x)-f(j, x)>(C[i]-C[j])*dt;
		};
		auto add=[&](int b) {
			int s=1, e=N, i=1;
			while(s<=e) {
				int&a=X[i];
				if(cmp(b, a, s)) swap(a, b);
				if(cmp(a, b, e)) break;
				int m=s+e>>1;
				if(cmp(b, a, m)) swap(a, b), e=m-1, i=i*2;
				else s=m+1, i=i*2+1;
			}
		};
		auto get=[&](int x) {
			int s=1, e=N, i=1, k=0;
			while(s<=e) {
				if(cmp(X[i], k, x)) k=X[i];
				int m=s+e>>1;
				if(x<=m) e=m-1, i=i*2;
				else s=m+1, i=i*2+1;
			}
			return k;
		};
		for(int i=1; i<=N; i++) {
			int k=get(i);
			P[i]=k;
			C[i]=C[k]+1;
			D[i]=f(k, i);
			add(i);
		}
		return make_pair(C[N], D[N]);
	};
	/*
	auto go=[&](const vector<int>& Q) {
		ll pm=0;
		for(int i=1; i<=Q[1]; i++)
			pm=max(pm, A[i]-A[i-1]);
		for(int i=2; i<Q.size(); i++) {
			ll m=0;
			for(int j=Q[i-1]+1; j<=Q[i]; j++)
				m=max(m, A[j]-A[j-1]);
			if(abs(A[Q[i]]+A[Q[i-2]]-2*A[Q[i-1]]) > max(pm, m)) {
				cout<<"No\n";
				exit(0);
			}
			pm=m;
		}
		cout<<"Yes\n";
		for(int i=1; i<K; i++) cout<<Q[i]<<' ';
		exit(0);
	};
	*/
	auto go=[&](const vector<int>& Q) {
		ll x=0;
		for(int i=1; i<K+1; i++) x+=ll(A[Q[i]]-A[Q[i-1]])*A[Q[i-1]];
		cout<<x<<'\n';
		for(int i=1; i<K; i++) cout<<Q[i]<<' ';
		exit(0);
	};
	auto ga=[&](int k) {
		vector<int> Q(k+1);
		for(int i=N, j=k; i; i=P[i]) Q[j--]=i;
		if(k==K) go(Q);
		return Q;
	};

	ll l=0, r=1e17;
	while(l<r) {
		ll m=l+(r-l>>1);
		auto[k,x]=f(m*2+1);
		if(k>K) l=m+1;
		else if(k<K) r=m-1;
		else ga(k);
	}

	r=l+r>>1;
	auto[lk,lx]=f(r*2-1);
	auto L=ga(lk);
	auto[rk,rx]=f(r*2+1);
	auto R=ga(rk);

	vector<int> M(K+1);
	for(int i=1, p=0; i<L.size(); i++) {
		M[i-1]=L[i-1];
		while(R[p]<=L[i-1]) p++;
		if(R[p]>=L[i] && i+R.size()-p==K+1) {
			while(p<R.size()) M[i++]=R[p++];
			go(M);
			break;
		}
	}

	cout<<"No\n";
}

컴파일 시 표준 에러 (stderr) 메시지

sequence.cpp: In lambda function:
sequence.cpp:15:30: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   vector<int> C(N+1), X(1<<32-__builtin_clz(N));
                            ~~^~~~~~~~~~~~~~~~~
sequence.cpp: In lambda function:
sequence.cpp:30:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int m=s+e>>1;
           ~^~
sequence.cpp: In lambda function:
sequence.cpp:39:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int m=s+e>>1;
           ~^~
sequence.cpp: In function 'int main()':
sequence.cpp:90:12: warning: suggest parentheses around '-' inside '>>' [-Wparentheses]
   ll m=l+(r-l>>1);
           ~^~
sequence.cpp:91:11: warning: unused variable 'x' [-Wunused-variable]
   auto[k,x]=f(m*2+1);
           ^
sequence.cpp:97:5: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  r=l+r>>1;
    ~^~
sequence.cpp:104:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=1, p=0; i<L.size(); i++) {
                    ~^~~~~~~~~
sequence.cpp:107:32: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(R[p]>=L[i] && i+R.size()-p==K+1) {
                    ~~~~~~~~~~~~^~~~~
sequence.cpp:108:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    while(p<R.size()) M[i++]=R[p++];
          ~^~~~~~~~~
sequence.cpp:98:12: warning: unused variable 'lx' [-Wunused-variable]
  auto[lk,lx]=f(r*2-1);
            ^
sequence.cpp:100:12: warning: unused variable 'rx' [-Wunused-variable]
  auto[rk,rx]=f(r*2+1);
            ^
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...