Submission #128994

#TimeUsernameProblemLanguageResultExecution timeMemory
128994wilwxkCake 3 (JOI19_cake3)C++14
0 / 100
231 ms262148 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct node {
	ll v, s;
	int l, r;
};

const int MAXN=2e5+5;
const int MAIOR=1e9+3;
const ll INF=1e18+9;
pair<ll, ll> v[MAXN]; //c, v
vector<node> seg;
ll dp[MAXN];
int opt[MAXN], raiz[MAXN];
int n, m;

int novo() {
	node cur;
	cur.l=cur.r=cur.v=cur.s=0;
	seg.push_back(cur);
	return seg.size()-1;
}

int update(int sind, int ini, int fim, int qind) {
	int nsind=novo(); seg[nsind]=seg[sind];
	if(ini==fim) {
		seg[nsind].v++;
		seg[nsind].s+=ini;
		return nsind;
	}
	int m=(ini+fim)/2;
	if(qind<=m) {
		int e= seg[sind].l ? seg[sind].l : novo(); seg[sind].l=e; 
		int ne=update(e, ini, m, qind);
		seg[nsind].l=ne;
	}
	else {
		int d= seg[sind].r ? seg[sind].r : novo(); seg[sind].r=d; 
		int nd=update(d, m+1, fim, qind);
		seg[nsind].r=nd;
	}
	seg[nsind].s=seg[seg[nsind].l].s+seg[seg[nsind].r].s;
	seg[nsind].v=seg[seg[nsind].l].v+seg[seg[nsind].r].v;
	return nsind;
}
ll query(int sind, int sind2, int ini, int fim, int val) {
	if(val<=0) return 0;
	if(seg[sind].v-seg[sind2].v==val) return seg[sind].s-seg[sind2].s;
	if(ini==fim&&seg[sind].v-seg[sind2].v>=val) return (ll)ini*val;
	int m=(ini+fim)/2;
	int direita=seg[seg[sind].r].v-seg[seg[sind2].r].v;
	return query(seg[sind].l, seg[sind2].l, ini, m, val-direita)
			+ query(seg[sind].r, seg[sind2].r, m+1, fim, val);
}

void solve(int ini, int fim, int rini, int rfim) {
	if(fim<ini) return;
	int mid=(ini+fim)/2;
	dp[mid]=-INF; opt[mid]=rini;
	for(int i=rini; i<=min(rfim, mid-m+1); i++) {
		ll val=query(raiz[mid-1], raiz[i], 1, MAIOR, m-2);
		val+=v[mid].second+v[i].second;
		val-=(v[mid].first-v[i].first)*2LL;
		if(val>dp[mid]) dp[mid]=val, opt[mid]=i;
	}
	solve(ini, mid-1, rini, opt[mid]);
	solve(mid+1, fim, opt[mid], rfim);
}

int main() {
	scanf("%d %d", &n, &m);
	for(int i=1; i<=n; i++) scanf("%lld %lld", &v[i].second, &v[i].first);
	sort(v+1, v+1+n);
	novo(); raiz[0]=novo();
	for(int i=1; i<=n; i++) raiz[i]=update(raiz[i-1], 1, MAIOR, v[i].second);
	while(1) scanf("%d %d", &n, &m), printf(">> %lld\n", query(raiz[m], raiz[n-1], 1, MAIOR, 3));

	solve(m, n, 1, n); ll respf=-INF;
	for(int i=m; i<=n; i++) respf=max(respf, dp[i]);
	printf("%lld\n", respf);
}

Compilation message (stderr)

cake3.cpp: In function 'int main()':
cake3.cpp:73:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~~
cake3.cpp:74:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1; i<=n; i++) scanf("%lld %lld", &v[i].second, &v[i].first);
                          ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cake3.cpp:78:33: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  while(1) scanf("%d %d", &n, &m), printf(">> %lld\n", query(raiz[m], raiz[n-1], 1, MAIOR, 3));
           ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...