[BZOJ]4071: [Apio2015]巴邻旁之桥

题解:     首先 明确 如果处于同一区域时  直接统计贡献即可 不用过桥

    对k分情况讨论:

      当k=1时  假设桥的位置是 p 那么

        $$ \sum_{i=1}^n |x_i-p|+|y_i-p| $$

          很显然当对于 所有x,y排序后的中位数是最优的选择位置 具体证明可以模拟一下

      当k=2时 假设桥的位置是$p_1$和$p_2$

        $$ \sum_{i=1}^n min\left ( |x_i-p_1|+|y_i-p_1|,|x_i-p_2|+|y_i-p_2| \right ) $$

      然后对于一个区间[x,y]我们考虑用其中位数表示  为什么能用中位数表示呢  我们考虑  当桥在区间外面是  $$ 2|p-\frac{x+y}{2}| $$ 然后我们就成功得把一个区间用一个点来代替 这样的好处就是 对于这n个区间 用n个点来描述 然后对于两座桥的选择  我们很直观的可以看出  对于中位数排序后的前面部分和后面部分各用一座桥是最优的  对于每部分用一座桥的考虑办法就回到了 $ k=1 $的情况 问题模型转化成加入2个点动态维护中位数  然后倒过来 删除2个点维护中位数的模型   我们考虑用主席树去做这个题 也可以用splay做

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define link(x) for(edge *j=h[x];j;j=j->next)
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=4e5+10;
const double eps=1e-8;
#define ll long long
const int inf=1e9+10;
using namespace std;
struct edge{int t,v;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
void add(int x,int y,int vul){o->t=y;o->v=vul;o->next=h[x];h[x]=o++;}
ll read(){ll x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f;
}int pre[MAXN],ch[MAXN][2],key[MAXN],rt,cnt,sz[MAXN];
ll sum[MAXN];
void Treavel(int x)
{if(x){Treavel(ch[x][0]);printf("结点%2d:左儿子 %2d 右儿子 %2d 父结点 %2d size=%2d key=%2d sum=%2lld\n",x,ch[x][0],ch[x][1],pre[x],sz[x],key[x],sum[x]);Treavel(ch[x][1]);}
}
void debug(int rp)
{printf("root:%d\n",rp);Treavel(rp);
}
void newnode(int &x,int t,int fa){x=++cnt;ch[x][0]=ch[x][1]=0;pre[x]=fa;key[x]=sum[x]=t;sz[x]=1;
}void up(int x){sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+key[x];
}void rotate(int x,int kind){int y=pre[x];ch[y][!kind]=ch[x][kind];pre[ch[x][kind]]=y;if(pre[y])ch[pre[y]][ch[pre[y]][1]==y]=x;pre[x]=pre[y];ch[x][kind]=y;pre[y]=x;up(y);
}void splay(int x,int goal){while(pre[x]!=goal){if(pre[pre[x]]==goal)rotate(x,ch[pre[x]][0]==x);else{int y=pre[x];int kind=ch[pre[y]][0]==y;if(ch[y][kind]==x)rotate(x,!kind),rotate(x,kind);else rotate(y,kind),rotate(x,kind);}}if(goal==0)rt=x;up(x);
}void insert(int &x,int t,int fa){if(!x){newnode(x,t,fa);return ;}if(t<=key[x])insert(ch[x][0],t,x);else insert(ch[x][1],t,x);up(x);
}int find1(int x,int k){if(sz[ch[x][0]]+1==k)return x;else if(k<=sz[ch[x][0]])return find1(ch[x][0],k);else return find1(ch[x][1],k-sz[ch[x][0]]-1);
}int find2(int x,int k){if(key[x]==k)return x;else if(k<key[x])return find2(ch[x][0],k);else return find2(ch[x][1],k);
}void erase(int k){splay(find2(rt,k),0);int t=sz[ch[rt][0]];splay(find1(rt,t),0);splay(find1(rt,t+2),rt);ch[ch[rt][1]][0]=0;up(ch[rt][1]);up(rt);
}void inte(){newnode(rt,-inf,0);newnode(ch[rt][1],inf,rt);up(rt);
}typedef struct node{int x,y;
}node;
bool cmp(node aa,node bb){return aa.x+aa.y<bb.x+bb.y;}
vector<int>vec;
node d[MAXN];
ll num[MAXN];int main(){int op=read();int n=read();ll ans=0;int cnt1=0;char str1[11],str2[11];int x,y;inc(i,1,n){scanf("%s %d %s %d",str1,&x,str2,&y);if(str1[0]==str2[0])ans+=abs(y-x);else d[++cnt1]=(node){x,y};}ans+=cnt1;if(!cnt1){printf("%lld\n",ans);return 0;}if(op==1){inc(i,1,cnt1)vec.pb(d[i].x),vec.pb(d[i].y);sort(vec.begin(),vec.end());int t=vec[cnt1-1];for(int i=0;i<vec.size();i++)ans+=abs(t-vec[i]);printf("%lld\n",ans);}else{inte();sort(d+1,d+cnt1+1,cmp);inc(i,1,cnt1){insert(rt,d[i].x,0);splay(cnt,0);insert(rt,d[i].y,0);splay(cnt,0);splay(find1(rt,1),0);splay(find1(rt,i+2),rt);int t=ch[ch[rt][1]][0];ll t1=sum[t];int t2=sz[rt]-2;num[i]=1ll*key[t]*sz[t]-sum[t]+sum[rt]-sum[t]-1ll*(t2-sz[t])*key[t];}inc(i,1,cnt1-1){erase(d[i].x);erase(d[i].y);splay(find1(rt,1),0);splay(find1(rt,cnt1-i+2),rt);int t=ch[ch[rt][1]][0];ll t1=sum[t];int t2=sz[rt]-2;num[i]+=(1ll*key[t]*sz[t]-sum[t]+sum[rt]-sum[t]-1ll*(t2-sz[t])*key[t]);}ll minn=1e18;inc(i,1,cnt1)minn=min(minn,num[i]);printf("%lld\n",minn+ans);}return 0;
}

  

  

4071: [Apio2015]巴邻旁之桥

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 416  Solved: 191
[Submit][Status][Discuss]

Description

 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B。

每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 1000000000。相邻的每对建筑相隔 1 个单位距离,河的宽度也是 1 个单位长度。区域 A 中的 i 号建筑物恰好与区域 B 中的 i 号建筑物隔河相对。
城市中有 N 个居民。第 i 个居民的房子在区域 Pi 的 Si 号建筑上,同时他的办公室坐落在 Qi 区域的 Ti 号建筑上。一个居民的房子和办公室可能分布在河的两岸,这样他就必须要搭乘船只才能从家中去往办公室,这种情况让很多人都觉得不方便。为了使居民们可以开车去工作,政府决定建造不超过 K 座横跨河流的大桥。
由于技术上的原因,每一座桥必须刚好连接河的两岸,桥梁必须严格垂直于河流,并且桥与桥之间不能相交。当政府建造最多 K 座桥之后,设 Di 表示第 i 个居民此时开车从家里到办公室的最短距离。请帮助政府建造桥梁,使得 D1+D2+⋯+DN 最小。

Input

输入的第一行包含两个正整数 K 和 N,分别表示桥的上限数量和居民的数量。

接下来 N 行,每一行包含四个参数:Pi,Si,Qi 和 Ti,表示第 i 个居民的房子在区域 Pi 的 Si 号建筑上,且他的办公室位于 Qi 区域的 Ti 号建筑上。

Output

输出仅为一行,包含一个整数,表示 D1+D2+⋯+DN 的最小值。

Sample Input

1 5
B 0 A 4
B 1 B 3
A 5 B 7
B 2 A 6
B 1 A 7

Sample Output

24

转载于:https://www.cnblogs.com/wang9897/p/10339850.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 学习之路 —— 图片的引入

问题记录&#xff1a;在img中动态设置了src后&#xff0c;图片路径找不到 原因&#xff1a;vue中动态生成的路径无法被url-loader解析到 解决方法&#xff1a; 1、将图片放在static文件夹&#xff0c;然后正常解析 2、将图片使用import方法引入 3、 采用背景图做法&#xff0c;…

跟踪异常–第5部分–使用Spring进行计划

看来我终于快要结束本系列有关使用Spring进行错误跟踪的博客了&#xff0c;对于那些还没有阅读该系列博客的人&#xff0c;我正在编写一个简单但几乎具有工业实力的Spring应用程序&#xff0c;扫描日志文件中的异常&#xff0c;然后生成报告。 在本系列的第一个博客中&#xff…

java.util.hashmap_java.util.HashMap中的无限循环

我在这里经常有一些Vaadin代码阻塞,我不知道问题是什么&#xff1a;Thread 7892: (state IN_JAVA)- java.util.HashMap.getEntry(java.lang.Object) bci61, line349 (Compiled frame; information may be imprecise)- java.util.HashMap.containsKey(java.lang.Object) bci2, …

APP测试理论知识点

什么是APP测试&#xff1f; App测试就是软件工程师对这类应用软件进行功能测试&#xff0c;性能测试&#xff0c;安全性测试以及兼容性测试等。 对于app测试我们一般采用的是黑盒测试方法&#xff0c;也会在必要的时候进行自动化测试以及性能测试&#xff0c;丙炔对于app还会有…

超大超长图片居中显示且放大缩小无影响

1. 超大图片居中显示 1.1 放大缩小都居中显示 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>body {overflow-x: hidden;}.top-banner .banner-list a {display: b…

蘋果的秘密武器

蘋果公司(Apple)在電腦操作平台之戰中負於微軟公司 (Microsoft)已經過去很多年了。如今﹐90%以上的筆記本電腦和台式電腦在使用微軟的Windows操作系統。然而近幾年來﹐蘋果公司對Windows主宰的世界發起突然襲擊﹐它的武器就是Windows版的iTunes﹐一個免費的媒體管理、儲存和播放…

如何使用NodeManager来控制WebLogic Server

在上一篇文章中 &#xff0c;您已经了解了如何启动WebLogic管理员和多个托管服务器。 该指令的一个缺点是这些进程将从前台开始&#xff0c;而STDOUT则打印在终端上。 如果打算将这些服务器作为后台服务运行&#xff0c;则可能需要尝试使用WebLogic节点管理器wlscontrol.sh工具…

php接口开发 安全_PHP开发api接口安全验证的实例讲解

php的api接口在实际工作中&#xff0c;使用PHP写api接口是经常做的&#xff0c;PHP写好接口后&#xff0c;前台就可以通过链接获取接口提供的数据&#xff0c;而返回的数据一般分为两种情况&#xff0c;xml和json,在这个过程中&#xff0c;服务器并不知道&#xff0c;请求的来源…

树:重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建二叉树并返回。 /// 1/// …

css随堂笔记(一)

Css初体验第一天 1 css初识&#xff1a;css主要用于设置HTML页面中文本内容&#xff0c;图片的外形&#xff0c;以及版面的布局等外观显示样式 Css样式规范&#xff1a;h1{属性&#xff1a;值} 2 css的三总书写方式&#xff1a;1 行内样式 将样式写在标签里面,只能作用于当前标…

关于全排列

嗯... 关于全排列&#xff0c;有很多种种做法... 嗯.... 那什么叫全排列呢&#xff1f;&#xff1f;&#xff01;&#xff01; 从n个不同元素中任取m&#xff08;m≤n&#xff09;个元素&#xff0c;按照一定的顺序排列起来&#xff0c;叫做从n个不同元素中取出m个元素的一个排…

[Java]如何安排任务间隔运行

应用程序中经常需要在后台运行某些特定任务以在一定间隔内完成某些工作。 该示例可以是&#xff0c;服务在后台运行以清理应用程序&#xff0c;就像我们有Java Garbage集合一样。 在本文中&#xff0c;我将向您展示3种不同的方法来实现这一目标 他们如下 使用简单的线程 使…

Sky Line 与 ArcEngine的粘合剂 Composite UI AB?

如今的goverment领导们觉得地图都太抽象&#xff0c;只有google Earth式的应用能引起他们的兴趣&#xff0c;作为为公仆服务的我们自然要学习掌握3D GIS技术来提高zf的执政能力了&#xff0c;于是Sky Line来了&#xff0c;拿到开发手册的时候觉得接口不多应该很容易开发&#x…

php if终止,php判断用户是否掉线及关闭网页的方法分享

要实现判断用户已掉线并关闭网页&#xff0c;主要用到方法connection_status 和 connection_aborted。通过一个例子&#xff0c;来了解下它们的用法:echo str_repeat(" ",300);//以下不可省略&#xff0c;否则用户断线&#xff0c;php(线程)立即终止&#xff0c;不会…

默认方法一种扩展旧代码的方法

如您所知&#xff0c;Java的新版本于2014年3月18日发布&#xff0c;我将介绍一系列文章来演示其新功能&#xff0c;也许在某些方面&#xff0c;我将谈论我的想法和批评。 我认为重要的第一个功能是“默认方法”&#xff0c;在所有Java语言的先前版本中&#xff0c;接口只能包含…

vue 如何点击按钮返回上一页

1&#xff0c;vue 如何点击按钮返回上一页呢&#xff1f; 这是vue挂载的范围html代码 <div click"goOff()">返回</div> 下面是点击返回的方法 第一种只返回上一页 goOff(){ this.$router.go(-1); }, 第二种 返回上一页&#x…

2007白领职场成功需要哪“十商”

1.德商(MQ)&#xff1a;指一个人的道德人格品质。德商的内容包括体贴、尊重、容忍、宽容、诚实、负责、平和、忠心、礼貌、幽默等各种美德。 2.智商(IQ)&#xff1a;是一种表示人智力高低的数量指标。也可以表现为一个人对知识的掌握程度&#xff0c;反映人的观察力、记忆力、思…

Remove Element - LeetCode

目录 题目链接注意点解法小结题目链接 Remove Element - LeetCode 注意点 输入的数组是无序的解法 解法一&#xff1a;使用了erase函数&#xff0c;将等于val的值移除。时间复杂度为O(n) class Solution { public:int removeElement(vector<int>& nums, int val) {fo…

DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...

url控制第二种写法&#xff08;只要继承了ViewSetMixin&#xff09; url(r^pub/$,views.Pub.as_view({get:list,post:create})), #获取所有记得路由后面加$结束符 #pub/?formatjsonurl(r^pub\.(?P<format>\w)$,views.Pub.as_view({get:list,post:create})), #pu…

要配置php环境_只需修改,要配置Apache的PHP环境,只需修改()。

案例分析一&#xff1a;假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送&#xff0c;其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期&#xff0c;并且在DMA传送完成后的中断…