题解

发现我们选择一座桥会选择力\(\frac{s + t}{2}\)较近的一座桥

然后我们只需要按照\(s + t\)排序,然后枚举断点,左边取所有s和t的中位数,右边同理

动态求中位数用平衡树维护

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define space putchar(' ')
#define enter putchar('\n')
#define MAXN 100005
#define mp make_pair
#define pb push_back
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
struct Seg {
int64 s,t,d;
friend bool operator < (const Seg &a,const Seg &b) {
return a.d < b.d;
}
}seg[MAXN];
u32 Rand() {
static u32 x = 1736382156;
return x += x << 2 | 1;
}
struct Treap_node {
Treap_node *lc,*rc;
int64 sum,val;int siz;
u32 pri;
void update() {
sum = val;siz = 1;
if(lc) {sum += lc->sum;siz += lc->siz;}
if(rc) {sum += rc->sum;siz += rc->siz;}
}
}pool[MAXN * 4],*tail = pool,*rt;
Treap_node* Newnode(int64 v) {
Treap_node *res = tail++;
res->lc = res->rc = NULL;res->sum = res->val = v;
res->siz = 1;res->pri = Rand();
return res;
}
Treap_node* Merge(Treap_node *A,Treap_node *B) {
if(!A) return B;
if(!B) return A;
if(A->pri < B->pri) {
A->rc = Merge(A->rc,B);
A->update();
return A;
}
else {
B->lc = Merge(A,B->lc);
B->update();
return B;
}
}
void Split(Treap_node *u,Treap_node *&L,Treap_node *&R,int64 v,bool on) {
if(!u) {L = R = NULL;return;}
int t;
if(!on) t = u->lc ? u->lc->siz + 1 : 1;
else t = u->val;
if(v >= t) {
L = u;
if(!on) v -= t;
Split(u->rc,L->rc,R,v,on);
L->update();
}
else {
R = u;
Split(u->lc,L,R->lc,v,on);
R->update();
}
}
void Insert(Treap_node *&rt,int64 v) {
Treap_node *L,*R;
Split(rt,L,R,v,1);
rt = Merge(Merge(L,Newnode(v)),R);
}
int64 Calc(Treap_node *&rt) {
int s = rt->siz / 2;
Treap_node *L,*R,*p;
Split(rt,L,R,s,0);
int64 res = R->sum - L->sum;
rt = Merge(L,R);
return res;
}
int64 ans,f[MAXN],b[MAXN];
int K,N,tot;
void Solve() {
read(K);read(N);
char p[4],q[4];int64 s,t;
for(int i = 1 ; i <= N ; ++i) {
scanf("%s",p + 1);read(s);scanf("%s",q + 1);read(t);
if(s > t) swap(s,t);
if(p[1] == q[1]) ans += t - s;
else {
++ans;
seg[++tot] = (Seg){s,t,s + t};
}
}
sort(seg + 1,seg + tot + 1);
f[0] = 0;rt = NULL;
for(int i = 1 ; i <= tot ; ++i) {
Insert(rt,seg[i].s);Insert(rt,seg[i].t);
f[i] = Calc(rt);
}
b[tot + 1] = 0;
tail = pool;rt = NULL;
for(int i = tot ; i >= 1 ; --i) {
Insert(rt,seg[i].s);Insert(rt,seg[i].t);
b[i] = Calc(rt);
}
if(K == 1) {out(f[tot] + ans);enter;}
else {
int64 tmp = f[tot];
for(int i = 0 ; i <= tot ; ++i) tmp = min(tmp,f[i] + b[i + 1]);
out(tmp + ans);enter;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【LOJ】#2888. 「APIO2015」巴邻旁之桥 Palembang Bridges的更多相关文章

  1. 「APIO2015」巴邻旁之桥 Palembang Bridges

    贪心 先转化一下题意 首先如果一个人的家和办公室在河同一侧那么建桥的时候不用去考虑它,最终把答案加上即可 在河两侧的家和办公室互换不影响答案,那么可以把这个抽象到一个区间$[l,r]$,距离就是$|l ...

  2. 【BZOJ4071】【APIO2015】巴邻旁之桥

    题意: Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 1 ...

  3. 【BZOJ4071】[Apio2015]巴邻旁之桥 Treap

    [BZOJ4071][Apio2015]巴邻旁之桥 Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 ...

  4. 4071: [Apio2015]巴邻旁之桥

    Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 10000 ...

  5. BZOJ4071 & 洛谷3644 & UOJ112:[APIO2015]巴邻旁之桥——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4071 https://www.luogu.org/problemnew/show/P3644 ht ...

  6. [bzoj4071] [Apio2015]巴邻旁之桥

    Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 10000 ...

  7. [APIO2015]巴邻旁之桥

    Bzoj权限题 luogu题面 先去掉同边的 首先k==1,即求一个点j 使\(\sum_{i\in A} |D_i - D_j| + \sum_{i\in B} |D_i - D_j|\)最小 因为 ...

  8. bzoj 4071: [Apio2015]巴邻旁之桥【splay】

    用权值线段树会容易一些并快一些,但是想复健一下splay所以打了splay 然后果然不会打了. 解题思路: 首先把家和办公室在同一侧的提出来直接加进答案里: 对于k=1,直接选所有办公室和家的中位数即 ...

  9. APIO2015 八邻旁之桥/巴邻旁之桥

    题目描述: bz luogu 题解: 贪心+权值线段树. $K=1$的时候,答案为$\sum |x-l| + |x-r|$,所以所有端点排序后取中位数即可. $K=2$的时候,一定是左边的一些走左边的 ...

随机推荐

  1. ARG102E:Stop. Otherwise...

    传送门 Sol 对于每个 \(i\) ,可以把 \(k\) 个数字分成 \((x,i-x)\) 的若干组. 那么就是求每组只能其中选择一个且可以重复的方案数. 预处理 \(f[i][j]\) 表示从 ...

  2. 洛谷 P2051 [AHOI2009]中国象棋 解题报告

    P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...

  3. 【LOJ#10064】黑暗城堡

    题目大意:定义一个无向图的最短路径生成树如下:在该无向图的生成树中,任意一个节点到根节点的距离均等于根节点到该节点的最短路.求有多少种最短路径生成树. 题解:首先跑一遍 dij 求出从根节点到每个节点 ...

  4. Linux让git记住账号密码

    Linux让git记住账号密码 ——IT唐伯虎 摘要: Linux让git记住账号密码. 1.进入根目录,指令:cd / 2.创建记录账号密码的文件,指令:touch .git-credentials ...

  5. python---django请求-响应的生命周期(FBV和CBV含义)

    Django请求的生命周期是指:当用户在访问该url路径是,在服务器Django后台都发生了什么. 客户端发送Http请求给服务端,Http请求是一堆字符串,其内容是: 访问:http://crm.o ...

  6. git 学习小记

    话说 git 出了已经很久了,可是我一直没用过.其实也不是没用过,只不过在 github 上下载东西那根本就不是在用 git,只是单纯的HTTP下载而已.我们公司用的是 svn,所以我只会一点点svn ...

  7. 配置SpringMvc + maven 数据源!(四)

    添加依赖项 1. 添加 mybatis 库,打开 pom.xml 添加 mybatis dependency 依赖; <dependency> <groupId>org.myb ...

  8. shell 检测安装包

    检测 wget 是否存在 rpm -q wget >/dev/null ];then echo "install wget,Please wait..." yum -y in ...

  9. 常用的C#编译命令

    使用 csc.exe 实现命令行生成 作为一个半路出家的非计算机专业出身的前端码农,最近对C#很感兴趣,原因如下: 1.希望通过学习C#能熟悉一下windows系统和一些概念,例如:windows服务 ...

  10. CSS absolute与relative不得不说的故事

    写在开篇: absolute说:“relative,我这辈子都不想看见你!” 为什么呢?它们明明那么相亲相爱,形影不离,这之中到底发生了什么不为人知的故事,竟然让absolute如此讨厌relativ ...