题目链接:https://www.luogu.org/problemnew/show/P2123

题目大意:

给定a数组和b数组,要求最小化c数组中的最大值

题解:

考虑微扰法,推一波式子先

设$x=\sum_{q=1}^{i-1}a[q]$,$y=c[i-1]$,与i相邻在i之后的大臣的编号为j

发现c数组是递增的,于是$max(c_i,c_j)=c_j$

$c_j=max(max(y,x+a_i)+b_i,x+a_i+a_j)+b_j$

$max(y+b_i+b_j,x+a_i+b_i+b_j,x+a_i+a_j+b_j)$

那么考虑交换i,j,同理交换后的较大值为

$max(y+b_i+b_j,x+a_j+b_i+b_j,x+a_j+a_i+b_i)$

我们假设交换之前是更优的,那么$max(y+b_i+b_j,x+a_i+b_i+b_j,x+a_i+a_j+b_j)<=max(y+b_i+b_j,x+a_j+b_i+b_j,x+a_j+a_i+b_i)$

发现有一部分是一样的那么上述结论成立的充分条件是

$max(x+a_i+b_i+b_j,x+a_i+a_j+b_j)<=max(x+a_j+b_i+b_j,x+a_j+a_i+b_i)$

化简一下得到

$max(b_i,a_j)-a_j-b_i<=max(b_j,a_i)-a_i-b_j$

$-min(b_i,a_j)<=-min(b_j,a_i)$

$min(b_i,a_j)>=min(b_j,a_i)$

于是乎,我们考虑如何满足这个式子:

$a_i b_i$

$a_j b_j$

$a_k b_k$

相当于每个2*2正方形左对角最小值小于右对角的最小值

情况1:$b_j$最小

于是有$b_j<=a_j,b_j<=a_i$

又$b_j>=min(a_j,a_k)$

所以$b_k<=b_j<=a_j$

即b单调递减

情况2:$a_j$最小

于是有$a_j<=b_j,a_j<=b_k$

即a单调递增

又$a_j>=min(a_i,b_j)$

所以$b_j>=a_j>=a_i$

于是我们把情况2放在前面,情况1放在后面

情况2的前提是$b_j>=a_j$,情况1的前提是$b_j<=a_j$,正是因为包含等于号中间还有$b_j=a_j$的情况二者可以连接

设$d=\frac{a_i-b_i}{abs(a_i-b_i)}$

先按d值排序;然后若d值小于等于0,按a升序排序;若d值大于0,则按b降序排序

#include<algorithm>
#include<cstring>
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll; const int N=2e4+;
int n;
ll c[N];
struct node
{
ll a,b;
int d;
}p[N];
inline ll read()
{
char ch=getchar();
ll s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
bool cmp(node a,node b)
{
if (a.d==b.d)
{
if(a.d==) return a.b>b.b;
else return a.a<b.a;
}
else return a.d<b.d;
}
int main()
{
int T;
T=read();
while (T--)
{
n=read();
for (int i=;i<=n;i++)
{
p[i].a=read();p[i].b=read();
if (p[i].a>=p[i].b) p[i].d=;
else p[i].d=-;
}
sort(p+,p++n,cmp);
ll s=;
for (int i=;i<=n;i++)
{
s+=p[i].a;
c[i]=max(c[i-],s)+p[i].b;
}
printf("%lld\n",c[n]);
}
return ;
}

最新文章

  1. windows系统下fis3安装教程
  2. hdu 3908 Triple(组合计数、容斥原理)
  3. Code Hard or Go Home
  4. 微信开发之Ngrok环境准备(一)
  5. HTML全局属性
  6. How to Build CyanogenMod for One X (codename: endeavoru)
  7. SSH Secure Shell Client连接Linux 命令行显示中文乱码问题 和oracle 查询数据中文乱码问题
  8. php非递归无限级分类.
  9. [转载] 树莓派读取温湿度传感器DHT11
  10. 通过C++修改系统时间代码
  11. Azure IoT Hub和Event Hub相关的技术系列-索引篇
  12. bzoj 5016: [Snoi2017]一个简单的询问
  13. ARP攻击之Kali Linux局域网断网攻击
  14. 2018-2019-2 20165206 网络攻防技术 Exp5 MSF基础应用
  15. C# - 什么是事件绑定?
  16. 【读书笔记】iOS-viewWillAppear:和viewDidLoad:
  17. HTML中head与body标签
  18. vue vue-route 传参 $route.params
  19. Splash jsfunc() 方法
  20. hdu4800 Josephina and RPG 解题报告

热门文章

  1. python中struct模块
  2. POJ 2665 模拟,,
  3. Memcache 一些经验和技巧
  4. Eclipse插件Lambok,实现自动生成Java代码
  5. JAVA实现两种方法反转单列表
  6. EXCEL 表格保护破解
  7. Visual Studio icon 含义
  8. ZBrush中Magnify膨胀笔刷介绍
  9. js浏览器问题
  10. hibernate---crateria