제출 #104896

#제출 시각아이디문제언어결과실행 시간메모리
104896antimirageCake 3 (JOI19_cake3)C++14
100 / 100
2221 ms148440 KiB
#include <bits/stdc++.h>

#define fr first
#define sc second
#define mk make_pair
#define pb push_back
#define all(s) s.begin(), s.end()

using namespace std;

const int N = 2e5 + 5;

int n, m, sz = 1, root[N];

pair <int, int> a[N];

struct tree{
	int l, r, cnt;
	long long sum;
};

tree t[N * 32];

long long ans = -1e18;

void update (int ov, int nv, int pos, int tl = 1, int tr = 1e9){

	if (tl == tr)
		t[nv].cnt = t[ov].cnt + 1,
		t[nv].sum = t[ov].sum + tl;
		
	else{
		int tm = (tl + tr) >> 1;
		
		if (pos <= tm){
			t[nv].l = ++sz;
			t[nv].r = t[ov].r;
			update( t[ov].l, t[nv].l, pos, tl, tm );
		}
		else{
			t[nv].r = ++sz;
			t[nv].l = t[ov].l;
			update( t[ov].r, t[nv].r, pos, tm + 1, tr );
		}
		t[nv].cnt = t[ t[nv].l ].cnt + t[ t[nv].r ].cnt;
		t[nv].sum = t[ t[nv].l ].sum + t[ t[nv].r ].sum;
	}
}
long long get (int ov, int nv, int k = m, int tl = 1, int tr = 1e9)
{
	if (tl == tr)
		return k * 1ll * tl;
	
	int tm = (tl + tr) >> 1;
	
	if (k > t[ t[nv].r ].cnt - t[ t[ov].r ].cnt)
		return get(t[ov].l, t[nv].l, k - (t[ t[nv].r ].cnt - t[ t[ov].r ].cnt), tl, tm) + (t[ t[nv].r ].sum - t[ t[ov].r ].sum);

	return get(t[ov].r, t[nv].r, k, tm + 1, tr);
} 
void calc (int l, int r, int opl, int opr)
{
	if (l > r) return;
	
	int md = (l + r) >> 1;
	
	int opt = opl;
	long long res = -1e18;
	
	for (int i = opl; i <= min(opr, md - m + 1); i++){
		
		long long sup = get(root[i - 1], root[md]);
		if ( sup - (a[md].fr - a[i].fr) * 2 > res){
			res = sup - (a[md].fr - a[i].fr) * 2;
			opt = i;
		}
	}
	ans = max(ans, res);
	
	calc(l, md - 1, opl, opt);
	calc(md + 1, r, opt, opr);
}

main(){
	cin >> n >> m;
	
	for (int i = 1; i <= n; i++){
		scanf("%d%d", &a[i].sc, &a[i].fr);
	}
	sort(a + 1, a + n + 1);
	
	for (int i = 1; i <= n; i++){
		root[i] = ++sz;
		update(root[i - 1], root[i], a[i].sc);
	}	
	calc( 1, n, 1, n );
	
	cout << ans << endl;
}
/**
5 3                 
2 1
4 2
6 4
8 8
10 16
**/

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

cake3.cpp:84:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main(){
      ^
cake3.cpp: In function 'int main()':
cake3.cpp:88:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &a[i].sc, &a[i].fr);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...