4071: [Apio2015]巴邻旁之桥
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
子任务
题解:
http://www.cnblogs.com/xkui/p/4536421.html
code:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long int64;
const int maxn=;
char c1[],c2[];
int k,n,l,r,cnt,tot,a[maxn],b[maxn];
int64 ans;
struct Data{
int l,r,idl,idr,v;
}list[maxn];
bool cmp(const Data &x,const Data &y){return x.v<y.v;}
struct seg{
#define ls k<<1
#define rs (k<<1)+1
int cnt[maxn<<];
void modify(int k,int l,int r,int x,int v){
cnt[k]+=v;
if (l==r) return;
int m=(l+r)>>;
if (x<=m) modify(ls,l,m,x,v); else modify(rs,m+,r,x,v);
}
void modify(int x,int v){modify(,,tot,x,v);}
int query(int rank){
int k=,l=,r=tot,m;
while (l<r){
m=(l+r)>>;
if (rank<=cnt[ls]) r=m,k=ls;
else rank-=cnt[ls],l=m+,k=rs;
}
return l;
}
}T[];
void prepare(){
for (int i=;i<=cnt;i++) b[++tot]=list[i].l,b[++tot]=list[i].r;
sort(b+,b+tot+);
for (int i=;i<=cnt;i++){
list[i].idl=lower_bound(b+,b+tot+,list[i].l)-b;
list[i].idr=lower_bound(b+,b+tot+,list[i].r)-b;
}
}
int64 solve(){
int64 res=,ans1=,ans2=,m1=,m2=;
prepare();
for (int i=;i<=cnt;i++) T[].modify(list[i].idl,+),T[].modify(list[i].idr,+);
for (int i=;i<=cnt;i++) list[i].v=list[i].l+list[i].r;
sort(list+,list+cnt+,cmp),m2=b[cnt+];
for (int i=;i<=cnt;i++) ans2+=abs(list[i].l-m2),ans2+=abs(list[i].r-m2);
res=ans2;
for (int i=;i<=cnt;i++){
ans2-=abs(list[i].l-m2)+abs(list[i].r-m2);
T[].modify(list[i].idl,+),T[].modify(list[i].idr,+),m1=b[T[].query(i)];
T[].modify(list[i].idl,-),T[].modify(list[i].idr,-),m2=b[T[].query(cnt-i+)];
ans1+=abs(list[i].l-m1)+abs(list[i].r-m1);
res=min(res,ans1+ans2);
}
return res;
}
int main(){
scanf("%d%d",&k,&n);
if (k==){
for (int i=;i<=n;i++){
scanf("%s%d%s%d",c1,&l,c2,&r);
if (l>r) swap(l,r);
if (c1[]==c2[]) ans+=r-l;
else a[++tot]=l,a[++tot]=r,ans++;
}
sort(a+,a+tot+);
int res=a[tot/];
for (int i=;i<=tot;i++) ans+=abs(a[i]-res);
printf("%lld\n",ans);
}
else{
for (int i=;i<=n;i++){
scanf("%s%d%s%d",c1,&l,c2,&r);
if (l>r) swap(l,r);
if (c1[]==c2[]) ans+=r-l;
else ans++,list[++cnt]=(Data){l,r};
}
printf("%lld\n",ans+solve());
}
return ;
}
4071: [Apio2015]巴邻旁之桥的更多相关文章
- bzoj 4071: [Apio2015]巴邻旁之桥【splay】
用权值线段树会容易一些并快一些,但是想复健一下splay所以打了splay 然后果然不会打了. 解题思路: 首先把家和办公室在同一侧的提出来直接加进答案里: 对于k=1,直接选所有办公室和家的中位数即 ...
- 【BZOJ4071】[Apio2015]巴邻旁之桥 Treap
[BZOJ4071][Apio2015]巴邻旁之桥 Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 ...
- BZOJ4071 & 洛谷3644 & UOJ112:[APIO2015]巴邻旁之桥——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4071 https://www.luogu.org/problemnew/show/P3644 ht ...
- [bzoj4071] [Apio2015]巴邻旁之桥
Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 10000 ...
- [APIO2015]巴邻旁之桥
Bzoj权限题 luogu题面 先去掉同边的 首先k==1,即求一个点j 使\(\sum_{i\in A} |D_i - D_j| + \sum_{i\in B} |D_i - D_j|\)最小 因为 ...
- 洛谷 P3644 [APIO2015]八邻旁之桥 解题报告
P3644 [APIO2015]八邻旁之桥 题目描述 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域\(A\)和区域\(B\). 每一块区域沿着河岸都建了恰好\(1000000001\)栋的建筑 ...
- [APIO2015]八邻旁之桥——非旋转treap
题目链接: [APIO2015]八邻旁之桥 对于$k=1$的情况: 对于起点和终点在同侧的直接计入答案:对于不在同侧的,可以发现答案就是所有点坐标与桥坐标的差之和+起点与终点不在同一侧的人数. 将所有 ...
- 【BZOJ4071】【APIO2015】巴邻旁之桥
题意: Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 1 ...
- [BZOJ4071][APIO2015]八邻旁之桥
BZOJ(这题是BZOJ权限题,有权限号的就去看看吧) Luogu(良心洛谷) 题目描述 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域\(A\)和区域\(B\). 每一块区域沿着河岸都建了恰好 ...
随机推荐
- windows 7 64位 安装oracle 11g R2
1.下载Oracle 11g R2 for Windows的版本 下载地址: http://www.oracle.com/technetwork/database/enterprise-edition ...
- mysql_config_editor
加入账号: [root@server-mysql bin]# ./mysql_config_editor set --login-path=client --user=root --password ...
- linux gnome 安装
首先先下载x-window的内核:apt-get -u install x-window-system-core:下载登录管理界面gdm或kdm:apt-get -u install gdm gdm- ...
- 鼠标单击事件--JavaScript
<html> <head> <title></title> </head> <script type="text/javas ...
- UPDATE sql 优化
一个网友说他的存储过程中有一段update sql,运行了15分钟还没出结果,需要优化一下 他把sql发给我 UPDATE TB_RESULT R SET R.VOTE_COUNT=NVL(( SEL ...
- Clean Code 笔记 (一):命名
一.命名规范1.名副其实,通过名称我们知道它为什么存在,它做什么事,该怎么用2.避免误导,避免使用与本意相悖的词,提防使用不同之处较小的名称3.有意义的区分,去掉多余的废话比如:a,the.缺少明确约 ...
- c#简体繁体转换
方法一已经亲测,使用正常,方法二貌似不能用. 方法一 /// <summary> /// 中文字符工具类 /// </summary> public static class ...
- 经历:easyui的datagrid没有数据滚动条的显示
今天,一个用户提出一个这样的问题,"查询不到结果时,为什么我看不到后面的标题呢?" 最初,我听到这个问题时,第一反应是:查出来数据不就有滚动条了吗,干嘛非要较真呢? 不过,后来想想 ...
- Objective-c单例模式详解
转载自:http://www.jianshu.com/p/85618bcd4fee 单例模式出现以后,关于它的争执就一直存在.在开发项目中,有很多时候我们需要一个全局的对象,而且要保证全局有且仅有一份 ...
- LA 3902 Network(树上最优化 贪心)
Network Consider a tree network with n <tex2html_verbatim_mark>nodes where the internal nodes ...