Description
一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B。
Input
输入的第一行包含两个正整数 K 和 N,分别表示桥的上限数量和居民的数量。
Output
输出仅为一行,包含一个整数,表示 D1+D2+⋯+DN 的最小值。
Sample Input
B 0 A 4
B 1 B 3
A 5 B 7
B 2 A 6
B 1 A 7
Sample Output
HINT
K=1或K=2
题解
/*自己搞出来的一道题,真是好感动*/
为了方便,在同一侧的直接处理掉。
K=1时,显然就是取中位数。
K=2时,考虑每一对(S,T),(绿蓝代表两座桥),那么肯定是要选两条红线短的那一边。不过这样还不够好考虑,我们不如让着两条直线伸长相等的距离,延伸到中点。
于是对于每一对(S,T),直接看Mid到两墙的距离就可以选择了。
进一步得出,如果我们把它们按中点排序,那么最后的局面肯定是,左部分都去桥1,右部分都去桥2,有一个分割点。
那么我们可以枚举分割点,分别计算两部分的最优桥,很神奇的把K=2分成了两个K=1,得到n^2的算法。
显然最优桥我们是可以动态维护的。
考虑点i(一对ST),把它从右部分加入左部分。
那么它对于最优桥的影响是可以讨论的,过程很傻逼可以自己试一试。
我得到的结果是,考虑左右部分肯定都是偶数,那么另左部分中位数取(len/2),右部分中位数取(len/2+1),这么做比较方便。
然后加点到左部分的时候,因为我们已经按中点排序,所以只可能是一左一右或者两右(左右是相对当前最优桥而言的)。
那么如果是一左一右,最优桥不发生变化,对ans新的贡献也就是这个点的贡献。
如果是两右,会使最优桥右移一位,但对于之前已加入的点是没有影响的,ans的改变还是只有这个点。
于是用两个树状数组模拟两边,每次求最优桥(这个也用树状数组求第k小数),然后维护ans也就是计算当前点的影响就行了。
复杂度O(nlogn)。说不清还是看代码吧。
主要考察数学建模、对数据结构的应用,感觉这题还是蛮好的。
代码
代码能力各种逗啊QwQ 调了好久 但调出来后真是好久没觉得这么爽了
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=1e5+; int abs(int x){return x>?x:-x;} struct point{
int x,y,idx,idy,mid;
bool operator <(const point&aa)
const {return mid<aa.mid;}
}a[maxn]; int b[maxn*],l,len,k,n;
ll ans; void prepare(){
for(int i=;i<=l;i++)
b[++len]=a[i].x,b[++len]=a[i].y;
sort(b+,b+len+);
for(int i=;i<=l;i++){
if(a[i].x>a[i].y) swap(a[i].x,a[i].y);
a[i].idx=lower_bound(b+,b+len+,a[i].x)-b;
a[i].idy=lower_bound(b+,b+len+,a[i].y)-b;
}
} int S1[maxn*],S2[maxn*]; int lowbit(int o){return o&-o;}
int add(int o,int k,int* C){
while(o<=len){
C[o]+=k;
o+=lowbit(o);
}
} int find(int k,int *C){
int ret=,cnt=;
for(int i=;i>=;i--){
ret+=(<<i);
if(ret>len||cnt+C[ret]>=k) ret-=(<<i);
else{
cnt+=C[ret];
}
}
return ret+;
} ll solve(){
ll ans1=,ans2=,ansx=;
prepare();
int A=,B=b[len/+];
for(int i=;i<=len;i++)
ans2+=abs(B-b[i]);
for(int i=;i<=l;i++)
add(a[i].idx,,S2),add(a[i].idy,,S2);
ansx=ans2; for(int i=;i<=l;i++){
int l1=i*,l2=len-i*;
add(a[i].idx,,S1);add(a[i].idy,,S1);
add(a[i].idx,-,S2);add(a[i].idy,-,S2); ans2-=abs(a[i].x-B)+abs(a[i].y-B);
A=b[find(l1/,S1)],B=b[find(l2/+,S2)];
ans1+=abs(a[i].x-A)+abs(a[i].y-A);
if(ans1+ans2<ansx) ansx=ans1+ans2;
}
return ansx;
} int main(){
char p,q;
int u,v;
scanf("%d%d",&k,&n);
if(k==){
ans=n;
for(int i=;i<=n;i++){
scanf("\n%c %d %c %d",&p,&u,&q,&v);
if(p==q) ans+=abs(u-v),ans--;
else b[++l]=u,b[++l]=v;
}
sort(b+,b+l+);
int A=b[l/];
for(int i=;i<=l;i++)
ans+=abs(A-b[i]);
printf("%lld\n",ans);
}
else{
ans=n;
for(int i=;i<=n;i++){
l++;
scanf("\n%c %d %c %d",&p,&a[l].x,&q,&a[l].y);
if(p==q) ans+=abs(a[l].x-a[l].y)-,l--;
else a[l].mid=a[l].x+a[l].y;
}
sort(a+,a+l+);
printf("%lld",ans+solve());
}
return ;
}
【数学建模】【APIO2015】Palembang Bridges的更多相关文章
-
python 版 mldivide matlab 反除(左除)《数学建模算法与程序》Python笔记
今天在阅读数学建模的时候看到了差分那章 其中有一个用matlab求线性的代码,这里我贴出来 这里我送上 Python代码 In [39]: import numpy as np ...: from s ...
-
在数学建模中学MATLAB
为期三周的数学建模国赛培训昨天正式结束了,还是有一定的收获的,尤其是在MATLAB的使用上. 1. 一些MATLAB的基础性东西: 元胞数组的使用:http://blog.csdn.net/z1137 ...
-
BITED数学建模七日谈之七:临近比赛时的准备工作
经过前面六天的文章分享,相信大家对数学模型的相关准备.学习都有了更新的认识,希望大家能从中有所收获,以便更高效地准备比赛和学习数学模型,本文是数学建模经验谈的最后一天:临近比赛的准备工作,希望在临近比 ...
-
BITED数学建模七日谈之六:组队建议和比赛流程建议
今天进入数学建模经验谈第六天:组队建议和比赛流程建议 数学模型的组队非常重要,三个人的团队一定要有分工明确而且互有合作,三个人都有其各自的特长,这样在某方面的问题的处理上才会保持高效率. 三个人的分工 ...
-
BITED数学建模七日谈之五:怎样问数学模型问题
下面进入数学建模经验谈第五天:怎样问数学模型问题 写这一篇的目的主要在于帮助大家能更快地发现问题和解决问题,让自己的模型思路有一个比较好的形成过程. 在我们学习数学模型.准备比赛的时候,经常会遇到各种 ...
-
BITED数学建模七日谈之四:数学模型分类浅谈
本文进入到数学建模七日谈第四天:数学模型分类浅谈 大家常常问道,数学模型到底有哪些,分别该怎么学习,这样能让我们的学习有的放矢,而不至于没了方向.我想告诉大家,现实生活中的问题有哪些类,数学模型就有哪 ...
-
BITED数学建模七日谈之三:怎样进行论文阅读
前两天,我和大家谈了如何阅读教材和备战数模比赛应该积累的内容,本文进入到数学建模七日谈第三天:怎样进行论文阅读. 大家也许看过大量的数学模型的书籍,学过很多相关的课程,但是若没有真刀真枪地看过论文,进 ...
-
BITED数学建模七日谈之二:怎样阅读数学模型教材
今天进入我们数学建模七日谈的第二天:怎样阅读数学建模教材? 大家再学习数学建模这门课程或准备比赛的时候,往往都是从教材开始的,教材的系统性让我们能够很快,很深入地了解前人在数学模型方面已有的研究成果, ...
-
MCM试题原文及翻译 AB题 2014美国数学建模竞赛
MCM试题原文及翻译 AB题 2014美国数学建模竞赛 原创翻译,如有瑕疵,敬请谅解. 转载请注明:过客小站 » MCM试题原文及翻译 AB题 2014美国数学建模竞赛 PROBLEM A: The ...
随机推荐
-
从一个NOI题目再学习二分查找。
二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...
-
Mysql 服务在本机,需要单机调试Mysql数据库 发生 不认识hostname‘localhost’
今天在本机安装Mysql Server然后用Workbench打开,连接本机数据库 hostname:localhost port:3306 弹出:localhost 不能连接 错误-1042 尝试了 ...
-
关于springMVC3.0基于注解方式的项目搭建
前言:开发了几个月的AS3项目,感觉JAVA都用不太熟练了.刚好这几个抽的空,就把自己以前用过的Spring框架再搭一边, 并完整的记录下来 开发环境:tomcat + mysql+ java 1.所 ...
-
Web缓存的作用与类型
前言 Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本.缓存会根据进来的请求保存输出内容的副本:当下一个请求来到的时候,如果是相同的UR ...
-
linux下的符号链接和硬链接
一 Linux下链接文件的作用 Linux特别注重用户的权限,而链接文件的作用也正体现了这个方面.对源文件的位置进行了隐藏,用户只对链接文件操作. 二 链接文件的区别 链接文件分为硬链接文件和软 ...
-
SPOJ375.QTREE树链剖分
题意:一个树,a b c 代表a--b边的权值为c.CHANGE x y 把输入的第x条边的权值改为y,QUERY x y 查询x--y路径上边的权值的最大值. 第一次写树链剖分,其实树链剖分只能说 ...
-
eclipse汉化教程,新手神器
网盘下载地址:http://pan.baidu.com/s/1i5ed6ZF 下载汉化包 将汉化包里的两个文件存放到eclipse安装目录中的dropins文件夹中 重启eclipse 汉化成功
-
MySQL数据库事务详解
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
-
Tomcat日志设定
1 Tomcat 日志概述 Tomcat 日志信息分 为 两 类 : 一.是运行中的日志,它主要 记录 运行的一些信息,尤其是一些异常 错误 日志信息 .二.是 访问 日志信息,它 记录 的 访 ...
-
leetcode 90. subsets
解题思路: 要生成子集,对于vector 中的每个数,对于每个子集有两种情况,加入或不加入. 因此代码: class Solution { public: void subsetG(vector< ...