제출 #128984

#제출 시각아이디문제언어결과실행 시간메모리
128984roseanne_pcyCake 3 (JOI19_cake3)C++14
24 / 100
1448 ms188132 KiB
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
using namespace std;
#define X first
#define Y second
#define pb push_back
typedef pair<int, int> ii;
typedef long long ll;

const int maxn = 2e3+5;

vector< ii > vec;

int n, k;

int v[maxn];
int w[maxn];

ll bst[maxn][maxn];

struct node
{
	int key, cnt, pr;
	ll tot;
	node *left, *right;
	node(int key) : key(key)
	{
		tot = key;
		cnt = 1;
		pr = (rand()<<16)^rand();
		left = right = NULL;
	}
	void calc()
	{
		tot = key;
		if(left) tot += left->tot;
		if(right) tot += right->tot;
		cnt = 1+(left?left->cnt:0)+(right?right->cnt:0);
	}
};

typedef node* ps;

ps merge(ps L, ps R)
{
	if(!L || !R) return L?L:R;
	if(L->pr> R->pr)
	{
		L->right = merge(L->right, R);
		L->calc();
		return L;
	}
	else
	{
		R->left = merge(L, R->left);
		R->calc();
		return R;
	}
}

pair<ps, ps> splitsz(ps big, int key)
{
	if(!big) return {big, big};
	int here = 1+(big->left?big->left->cnt:0);
	if(here<= key)
	{
		auto tmp = splitsz(big->right, key-here);
		big->right = tmp.X;
		big->calc();
		return {big, tmp.Y};
	}
	else
	{
		auto tmp = splitsz(big->left, key);
		big->left = tmp.Y;
		big->calc();
		return {tmp.X, big};
	}
}

pair<ps, ps> split(ps big, int key)
{
	if(!big) return {big, big};
	int here = big->key;
	if(here<= key)
	{
		auto tmp = split(big->right, key);
		big->right = tmp.X;
		big->calc();
		return {big, tmp.Y};
	}
	else
	{
		auto tmp = split(big->left, key);
		big->left = tmp.Y;
		big->calc();
		return {tmp.X, big};
	}
}

int main()
{
	scanf("%d %d", &n, &k);
	vec.resize(n);
	for(int i = 0; i< n; i++) scanf("%d %d", &vec[i].Y, &vec[i].X);
	sort(vec.begin(), vec.end());
	for(int i = 1; i<= n; i++)
	{
		v[i] = vec[i-1].Y;
		w[i] = vec[i-1].X;
	}
	for(int i = 1; i<= n; i++)
	{
		ps root = NULL;
		for(int j = i; j< (i+k-2)-1; j++)
		{
			auto tmp = split(root, v[j]);
			ps r1 = merge(tmp.X, new node(v[j]));
			root = merge(r1, tmp.Y);
		}
		for(int j = (i+k-2)-1; j<= n; j++)
		{
			auto tmp = split(root, v[j]);
			ps r1 = merge(tmp.X, new node(v[j]));
			root = merge(r1, tmp.Y);
			int tot = (j-i+1);
			tmp = splitsz(root, tot-(k-2));
			// printf("left %d\n", tot-(k-2));
			bst[i][j] = (tmp.Y)?(tmp.Y)->tot:0;
			// printf("bst[%d][%d] = %lld\n", i, j, bst[i][j]);
			root = merge(tmp.X, tmp.Y);
		}
	}
	ll best = -1e18;
	for(int i = 1; i<= n; i++)
	{
		for(int j = i+k-1; j<= n; j++)
		{
			best = max(best, bst[i+1][j-1]-2LL*(w[j]-w[i])+v[i]+v[j]);
		}
	}
	printf("%lld\n", best);
}

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

cake3.cpp: In function 'int main()':
cake3.cpp:104:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &k);
  ~~~~~^~~~~~~~~~~~~~~~~
cake3.cpp:106:33: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i = 0; i< n; i++) scanf("%d %d", &vec[i].Y, &vec[i].X);
                            ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...