题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5795

背景描述:
已经记不起来上一次做题是什么时候的事了。。。大概是上辈子?
要不是某只机房的脊蛙在群里毒我说我秒A。。。我才不做这题md
差点忘记说了。。。以后我一定要给我的ACM队起名叫:小脊蛙,呱尼玛!

解题报告:
首先题目中的序列称为序列aaa和bbb,规定定义序列 c=a⋃bc = a\bigcup bc=a⋃b
性质1:将bib_ibi​升序排列,若称对应的aia_iai​和bjb_jbj​为一对匹配(bi,afi)(b_i,a_{f_i})(bi​,afi​​),则最优解一定也满足afi&lt;afi+1a_{f_i} &lt; a_{f_{i + 1}}afi​​<afi+1​​
证明:通过讨论bi,bi+1,afi,afi+1b_i,b_{i + 1},a_{f_i} ,a_{f_{i + 1}}bi​,bi+1​,afi​​,afi+1​​的6种大小相对关系可以得出

性质2:将序列ccc 升序排序,将其中的序列bbb所有元素,以及选出来的序列aaa元素全部标记,那么标记一定是一段一段的,那么对于每一段内部,含序列aaa和序列bbb元素个数相等,即各个段完全独立。
证明:这每一段的边界,要不是整个序列ccc的边界,要不边界紧邻的非标记元素必然属于序列aaa,如果一个属于序列bbb元素匹配的不在本段中,则可以通过将匹配替换为边界紧邻的元素,而减小答案,因此每一个元素的匹配必在它所属的段内,因此段内属于aaa和bbb序列元素个数相等

有了这两个性质,做起来就简单了,每个段内的aaa和bbb元素相等,定义aaa为-1,bbb为+1,求一个前缀和,那么一个段就是前缀和相同的两个位置之间的,但注意到我们只需要找到前缀和相同的离当前最近的那个位置,且这一段的答案很好算,因为这一段内必然是总满足bi&lt;afibi &lt; a_{f_i}bi<afi​​或者bi&gt;afibi &gt; a_{f_i}bi>afi​​,再做一个前缀和就好了,再根据以上dpdpdp即可。。。

代码:

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#define N 100000
#define N1 (N + 2)
#define inf 1e15
//#define ABS(x) ((x > 0) ? x : (-x))
using namespace std;
typedef long long LL;
struct node
{LL val;bool ID;
};node c[N1 << 1];
int l,n,m,last[N1 << 1],S1[N1 << 1];
LL S2[N1 << 1],f[N1 << 1],a[N1],b[N1];
inline bool cmp(node x,node y)
{return (x.val < y.val);
};inline LL ABS(LL t)
{return (t > 0) ? t : (-t);
}
void init()
{scanf("%d%d",&n,&m);l = n + m;for (int i = 1;i <= n; ++i)scanf("%lld",&a[i]);for (int i = 1;i <= m; ++i)scanf("%lld",&b[i]);for (int i = 1;i <= n; ++i)c[i].val = a[i],c[i].ID = 0;for (int i = 1;i <= m; ++i)c[i + n].val = b[i],c[i + n].ID = 1;   sort(c + 1,c + l + 1,cmp);//for (int i = 1;i <= l; ++i)//cout<<c[i].val<<"("<<c[i].ID<<") ";//puts("");}void DO_IT()
{S1[0] = m; S2[0] = 0; f[0] = 0;for (int i = 0;i <= l; ++i) last[i] = -1;last[m] = 0;for (int i = 1;i <= l; ++i){if (c[i].ID){S1[i] = S1[i - 1] - 1;S2[i] = S2[i - 1] - c[i].val;int o = last[S1[i]];if (o == -1||f[o] == inf) f[i] = inf;else  f[i] = f[o] + ABS(S2[i] - S2[o]);}else{S1[i] = S1[i - 1] + 1;S2[i] = S2[i - 1] + c[i].val;f[i] = f[i - 1];int o = last[S1[i]];if (f[o] == inf) f[i] = inf;else f[i] = min(f[i],f[o] + ABS(S2[i] - S2[o]));}last[S1[i]] = i;}}
int main()
{int T;scanf("%d",&T);while (T--){init();DO_IT();printf("%lld\n",f[l]);}
}

总结:这道题怎么做其实并不重要,我只是非常想知道,脊蛙什么时候能找到妹子啊。。。

ZOJ Problem Set - 4043 Virtual Singers(2018acm 青岛赛区热身赛)相关推荐

  1. 2018年 ACM/ICPC亚洲区域赛 青岛赛区现场赛 比赛总结

    首先祝贺自己收获了ACM生涯中的第二枚铜牌. 首先吐槽一下中石油: 周六早上来到中国石油大学,连个志愿者小姐姐都没看到.(但是看到了女装大佬).报完到之后发现教练少了一张午餐券(要不要这么粗心).为了 ...

  2. ZOJ 4062 Plants vs. Zombies 2018 ICPC 青岛站 E Plants vs. Zombies

    ZOJ 4062 二分 哎,二分,二分,二分,我咋就没想到啊,在一篇博客上看到一句话: 一般此类最小值最大问题都是二分,此题显然也是可以二分植物的高度的. 博客链接:https://www.cnblo ...

  3. ZOJ Problem 1005 jugs

    题目 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with the ...

  4. ZOJ Problem Set - 1331 Perfect Cubes

    这个题啊,一看就是暴力,暴力,暴力!!! 但是,暴力也是要做到暴力的恰到好处:看题 For hundreds of years Fermat's Last Theorem, which stated ...

  5. ZOJ Problem Set - 1048 Financial Management

    我承认这是一道水的不能再水的题,今天一下就做到了,还是无耻的帖上来吧 #include <stdio.h>int main() {double sum=0;for(int i=1;i< ...

  6. Argus(ZOJ Problem Set - 2212)(优先队列)

    Argus   时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte 总提交: 3            测试通过: 2 描述 A data stream ...

  7. ZOJ Problem Set - 3329 One Person Game

    题目大意:有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当分数大于n时结束.求游戏的期望步数.初始分数为0分析 设 E[i] ...

  8. ZOJ Problem Set - 1730 Crazy Tea Party

    #include<cstdio> int main(){int T,n;scanf("%d",&T);while(T--){scanf("%d&quo ...

  9. ZOJ Problem Set - 1067 Color Me Less

    这道题目很简单,考察的就是结构体数组的应用,直接贴代码了 #include <stdio.h> #include <math.h>typedef struct color {i ...

最新文章

  1. vba 字体颜色_多掌握一些VBA语句,让自己书写代码更加顺畅
  2. IC/FPGA笔试/面试题分析(十)CMOS门电路
  3. Code128条形码
  4. 客户端产生CLOSE WAIT状态的解决方案
  5. Python 中的pyc文件的用途
  6. 网站数据分析四:网站用户分析
  7. ar 和 nm 用法
  8. GitHub上严重匮乏!适合新手的C++项目,我在这里找到了!
  9. 关于《精通Unix下C语言编程与项目实践》的试读策划
  10. 高德坐标转百度坐标并导航
  11. 添加.MSPX文件(VISTA下)
  12. 【零基础 快速学Java】韩顺平 笔记整理(到p170 跑路了)
  13. 鸢尾花数据集分类--神经网络
  14. Print Conductor中文版
  15. clt用MeGUI处理切割音频
  16. 目前文字识别技术,主要应用在哪些场景?
  17. Redis相关面试题
  18. 离散信号分解与卷积和
  19. 解决客户 IE 浏览器“兼容性视图“设置带来的问题
  20. webrtc bbr

热门文章

  1. 【看表情包学Linux】插叙:实现简易的 Shell | 通过内建命令实现路径切换 | 再次理解环境变量
  2. 手机安装软件解析包错误解决办法
  3. python入门教程慕课网_秒懂系列 | 史上最简单的Python Django入门教程
  4. 根据State筛选数据表格
  5. 锐龙R7 PRO 6850HS怎么样相当于什么水平级别
  6. jQuery实现多选框的全选与反选
  7. 软件测试-黑盒测试,白盒测试,灰盒测试
  8. 抖音发广告需要注意什么,三个注意事项与规范要牢记
  9. 【JavaEE】TCP的五层协议栈之应用层与传输层的UDP协议
  10. 一道小学数学问题的编程解法