题解 | #小辰的智慧树#
小辰的智慧树
https://ac.nowcoder.com/acm/contest/69791/E
重点就是发现x*(hi*2-x)的最优解相当于每次取最大的hi砍x=1长度,易转化为区间加法问题
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N = 2e6+50;
int n,m,num[N];
struct node{
int h,c;
}stu[N];
bool cmp(node a,node b){
if(a.h!=b.h)return a.h>b.h;
else return a.c>b.c;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>stu[i].h>>stu[i].c;
}
//sort(stu+1,stu+n+1,cmp);
int ans = 0;
for(int i=1;i<=n;i++){
//int l = stu[i].c*2+1;
//int r = stu[i].h*2-1;
int l = stu[i].c+1;
int r = stu[i].h;
if(stu[i].c==stu[i].h)continue;
num[r+1]--;
num[l]++;
}
for(int i=1;i<=1e6;i++){
num[i]=num[i-1]+num[i];
}
for(int i=1e6;i>=1;i--){
if(num[i]>0){
int x = 2*i-1;
if(num[i]>=m){
ans+=m*x;
break;
}
else{
ans+=num[i]*x;
m-=num[i];
}
}
}
cout<<ans<<'\n';
return 0;
}