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\). 每一块区域沿着河岸都建了恰好 ...
随机推荐
- iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)
新建一个Category,命名为UIColor+Hex,表示UIColor支持十六进制Hex颜色设置. UIColor+Hex.h文件, #import <UIKit/UIKit.h> # ...
- 宽字节SQL注入
1.联想lelink站 例1, 联想lelink站user参数存在宽字节SQL注入 提交,user=wctest%df’ and 1=2%23 结果,出现了”運”字,如图:
- Android5.0之Toobar的使用
总体上来说,Toolbar的使用可以分为两个方面,一方面是将ToolBar当作ActionBar来用,另一方面就是将Toolbar当成一个单独的控件来用,不过到目前为止我见到的大部分情况都是把Tool ...
- [整理]Oracle LOCK 机制
数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.锁机制用于管理对 ...
- oracle Form Builer:ID_NULL Built-in
Description Returns a BOOLEAN va ...
- JVM笔记5:Class文件结构
Class文件是一组以8位字节为基础单位的二进制流,包含多个数据项目(数据项目的顺序,占用的字节数均由规范定义),各个数据项目严格按照顺序紧凑的排列在Class文件中,不包含任何分隔符,使得整个Cla ...
- 安卓数据存储(3):SQLite数据库存储
SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级:使用 SQLit ...
- C++学习(五)
一.拷贝构造函数和拷贝赋值运算符1.拷贝构造:用一个已有的对象,构造和它同类型的副本对象——克隆.2.形如class X { X (const X& that) { ... }};的构造函数 ...
- unity3d最新面试题与参考答案汇总
1.在类的构造函数前加上static会报什么错?为什么? 构造函数格式为 public+类名,如果加上static会报错(静态构造函数不能有访问修饰符)原因:静态构造函数不允许访问修饰符,也不接受任何 ...
- 20160322 javaweb 学习笔记--response 重定向
//一般方法 response.setStatus(302); response.setHeader("Location", "/20160314/index.jsp&q ...