Submission #885740

#TimeUsernameProblemLanguageResultExecution timeMemory
885740vjudge1Cake 3 (JOI19_cake3)C++17
0 / 100
2 ms2648 KiB
#include<bits/stdc++.h>

using namespace std;

#define read() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define day() time_t now = time(0);char* x = ctime(&now);cerr<<"Right Now Is : "<<x<<"\n"

#define int long long
#define ii pair<int,int>
#define X first
#define Y second 

const long long MAX = (int)2e5 + 5;
const long long INF = (int)1e18;
const long long MOD = (int)1e9 + 7;

int n,m;
struct node{
	int v,c;
};
node a[MAX];
int s = 0;
ii st[MAX << 2];
vector<int> rt;
int siz = 0;
int res = 0;
int L = 1,R = 1;

ii operator + (const ii &a,const ii &b){
	return {a.X + b.X,a.Y + b.Y};
}
void update(int u,int val,int id = 1,int l = 1,int r = siz){
	if(l == r){
		
		//cout << u << " " << val << " : ";
		//cout << st[id].X << "," << st[id].Y << " ";
	
		st[id].X += val;
		st[id].Y += val * rt[l - 1];
		
		//cout << st[id].X << "," << st[id].Y << "\n";
		
		return;
	}
	int m = l + r >> 1;
	if(u <= m)update(u,val,id << 1,l,m);
	else update(u,val,id << 1 | 1,m + 1,r);
	st[id] = st[id << 1] + st[id << 1 | 1];
}
bool ok = 0;
int get(int val,int id = 1,int l = 1,int r = siz){
	//if(ok)cout << val << " " << id << " " << l << " " << r << " " << st[id].X << " " << st[id].Y << '\n';
 	if(val == 0)return 0;
	if(st[id].X <= val)return st[id].Y;
	if(l == r){
		int sum = st[id].Y;
		if(st[id].X > val)sum -= (st[id].X - val) * rt[l - 1];
		return sum;
	}
	int m = l + r >> 1;
	if(st[id << 1 | 1].X > val)return get(val,id << 1 | 1,m + 1,r);
	return st[id << 1 | 1].Y + get(val - st[id << 1 | 1].X,id << 1,l,m);
}
void add(int id){
	update(a[id].v,1);
}
void del(int id){
	update(a[id].v,-1);
}
int cost(int l,int r){
	while(L > l)add(--L);
	while(R < r)add(++R);
	while(L < l)del(L++);
	while(R > r)del(R--);
	//if(ok)cout << l << " " << r << " : \n";
	return get(m);
}
void solve(int l,int r,int u,int v){
	
	
	//cout << l << " " << r << " " << u << " " << v << '\n';
	if(l > r)return;
	int mid = l + r >> 1;
	
	ii best = {-INF,-1};
	for(int i = max(u,mid);i <= v;i++){
		int cnt = (a[i].c - a[mid].c) * 2;
		if(i - mid + 1 < m)continue;
		if(mid == 2 && i == 4)ok = 1;
		best = max(best,{cost(mid,i) - cnt,i});
		ok = 0;
	}
	

	//cout << "---- " << mid << " " << best.X << " " << best.Y << " " << v << "\n";
	if(best.Y == -1){
		solve(l,mid - 1,u,v);
		return;
	}
	res = max(res,best.X);
	solve(l,mid - 1,u,best.Y);
	solve(mid + 1,r,best.Y,v);
}
signed main(){
	
	read();
	
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		cin >> a[i].v >> a[i].c;
		rt.push_back(a[i].v);
	}
	
	sort(rt.begin(),rt.end());
	rt.erase(unique(rt.begin(),rt.end()),rt.end());
	siz = rt.size();
	
	
	sort(a + 1,a + 1 + n,[&](const node &a,const node &b){
		return a.c < b.c;
	});
	
	
	for(int i = 1;i <= n;i++){
		a[i].v = lower_bound(rt.begin(),rt.end(),a[i].v) - rt.begin() + 1;
	}
	//cout << "\n";

	add(1);
	solve(1,n,1,n);
	
	cout << res;
	
}










Compilation message (stderr)

cake3.cpp: In function 'void update(long long int, long long int, long long int, long long int, long long int)':
cake3.cpp:45:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   45 |  int m = l + r >> 1;
      |          ~~^~~
cake3.cpp: In function 'long long int get(long long int, long long int, long long int, long long int)':
cake3.cpp:60:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   60 |  int m = l + r >> 1;
      |          ~~^~~
cake3.cpp: In function 'void solve(long long int, long long int, long long int, long long int)':
cake3.cpp:83:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   83 |  int mid = l + r >> 1;
      |            ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...