Submission #1347327

#TimeUsernameProblemLanguageResultExecution timeMemory
1347327LudisseyCarnival Tickets (IOI20_tickets)C++20
39 / 100
3111 ms2162688 KiB
#include "tickets.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
const int MAX=1e9;

long long find_maximum(signed __k, std::vector<std::vector<signed>> x) {
	int n=sz(x);
	int m=sz(x[0]);
	int k=__k;
	vector<int> dp(k*n*2+1,-1e15);
	vector<int> dp2(k*n*2+1,-1e15);
	vector<vector<int>> pre(n,vector<int>(k+1,0));
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < k; j++) pre[i][k]+=MAX-x[i][j];
		for (int j = k-1; j >= 0; j--) pre[i][j]=pre[i][j+1]-MAX+x[i][m-(k-j)]-MAX+x[i][j];
	}
	
	vector<vector<int>> last(n, vector<int>(k*n*2+1));
	dp[n*k]=0;
	for (int i = 0; i < n; i++)
	{
		swap(dp2,dp);
		for (int j = 0; j < sz(dp); j++) dp[j]=-1e15;
		
		for (int _k = k; _k >= 0; _k--)
		{
			for (int j = max(0LL,-(k-2*_k)); j+k-2*_k < sz(dp) && j < sz(dp2); j++)
			{
				//if(((int)abs(j-n))%2!=i%2) continue;
				if(dp[j+k-2*_k]<dp2[j]+pre[i][_k]){
					dp[j+k-2*_k]=dp2[j]+pre[i][_k];
					last[i][j+k-2*_k]=_k;
				}
			}
		}

	}
	vector<vector<signed>> ret(n,vector<signed>(m,-1));
	set<pair<int,int>> st;
	vector<int> stv(k,0);
	for (int i = 0; i < k; i++) st.insert({stv[i],i});
	
	int rm=n*k;
	for (int i = n-1; i>=0; i--)
	{
		vector<pair<int,int>> ins;
		for (int j = 0; j < last[i][rm]; j++) {
			int v=(*st.rbegin()).second;
			st.erase(*st.rbegin());
			stv[v]--;
			ins.push_back({stv[v],v});
			ret[i][j]=v;
		}
		for (int j = m-(k-last[i][rm]); j < m; j++) {
			int v=(*st.begin()).second;
			st.erase(*st.begin());
			stv[v]++;
			ins.push_back({stv[v],v});
			ret[i][j]=v;
		}
		for (int j = 0; j < k; j++) st.insert(ins[j]);
		rm-=(k-2*last[i][rm]);
	}
	allocate_tickets(ret);
	return dp[n*k];
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...