汕头市队赛 SRM16 T2

描述

      猫和老鼠,看过吧?猫来了,老鼠要躲进洞里。在一条数轴上,一共有n个洞,位置分别在xi,能容纳vi只老鼠。一共有m只老鼠位置分别在Xi,要躲进洞里,问所有老鼠跑进洞里的距离总和最小是多少。

输入格式

      两个用空格隔开的整数m和n。

      这一行m个数字分别表示老鼠的位置

      接下来n行每行两个数字分别表示洞的位置和容纳量

输出格式

      一个整数,表示最小的距离总和。(如果无解,输出-1)

样例输入

4 5
6 2 8 9
3 6
2 1
3 6
4 7
4 7

样例输出

11
——————————————————————————
 n <= 500, m <= 500 的时候可以写费用流 但是要比较好的建图方式
nm的建图肯定要挂
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=2e3+7,inf=0x3f3f3f3f;
const LL mx=1e15;
int read(){int ans=0,f=1,c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9') {ans=ans*10+(c-'0'); c=getchar();}return ans*f;
}
int n,m,q[M],vis[M];
int N,S,T;
LL ans,d[M];
struct node{int to,next,flow;LL cost;}e[M*M];
int first[M],cnt=1,cur[M];
void ins(int a,int b,int flow,LL cost){e[++cnt]=(node){b,first[a],flow,cost}; first[a]=cnt;}
void insert(int a,int b,int flow,LL cost){ins(a,b,flow,cost); ins(b,a,0,-cost);}
bool spfa(){for(int i=S;i<=T;i++) d[i]=mx;int head=0,tail=1;q[0]=T; vis[T]=1; d[T]=0;while(head!=tail){int x=q[head++]; if(head>M) head=0;for(int i=first[x];i;i=e[i].next){int now=e[i].to;if(e[i^1].flow&&d[x]+e[i^1].cost<d[now]){d[now]=d[x]+e[i^1].cost;if(!vis[now]){if(d[now]<d[q[head]]){head--; if(head<0) head=M; q[head]=now;}else{q[tail++]=now; if(tail>M) tail=0;}vis[now]=1;}}            }vis[x]=0;}return d[S]<mx;
}
int dfs(int x,int a){if(x==T||a==0)return a;vis[x]=1;int flow=0,f;for(int& i=cur[x];i;i=e[i].next){int now=e[i].to;if(!vis[now]&&d[x]==e[i].cost+d[now]&&(f=dfs(now,min(a,e[i].flow)))>0){e[i].flow-=f; e[i^1].flow+=f;ans+=e[i].cost*f; flow+=f;a-=f;if(a==0)break;}}vis[x]=0;return flow;
}
int x[M];
LL sum;
struct pos{int y,k;}qq[M];
bool cmp(pos a,pos b){return a.y<b.y;}
int main()
{n=read(); m=read();S=0; T=n+m+1;for(int i=1;i<=n;i++) x[i]=read(),insert(S,i,1,0);for(int i=1;i<=m;i++) qq[i].y=read(),qq[i].k=read(),sum+=qq[i].k;if(sum<n){printf("-1\n"); return 0;}sort(qq+1,qq+1+m,cmp);for(int i=1;i<=m;i++) insert(i+n,T,qq[i].k,0);for(int i=1;i<=m;i++){if(i>1) insert(i+n,i+n-1,inf,qq[i].y-qq[i-1].y);if(i<m) insert(i+n,i+n+1,inf,qq[i+1].y-qq[i].y);}for(int i=1;i<=n;i++){int k1=1; while(qq[k1+1].y<=x[i]&&k1<m) k1++;int k2=m; while(qq[k2-1].y>=x[i]&&k2>1) k2--;if(qq[k1].y<=x[i]) insert(i,k1+n,1,x[i]-qq[k1].y);if(qq[k2].y>=x[i]) insert(i,k2+n,1,qq[k2].y-x[i]);}while(spfa()){for(int i=0;i<=T;i++) cur[i]=first[i]; dfs(S,inf);}printf("%lld\n",ans);return 0;
}
View Code

n <= 5000, m <= 5000 的时候就需要dp了

先将洞和老鼠按位置从小到大排一波序

因为老鼠选的洞必然是单调递增的 我们可以考虑dp

f【i】【j】表示前i个洞选j只老鼠

转移方程 f【i】【j】=f【i-1】【k】+(k+1到j 的距离

然后发现是三方的写法 然后就后面可以用单调队列优化dp降一波复杂度

然后就是n方写法了

这里我们每次可以算一下每只老鼠到 第i个洞的 前缀

队列里扔的就是f【j】+(前缀数组)s【j】就好啦

f【i】=q【l】+s【i】就好辣

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=5e3+7;
const LL inf=1e15;
int read(){int ans=0,f=1,c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9') {ans=ans*10+(c-'0'); c=getchar();}return ans*f;
}
int l,r,n,m,x[M];
struct pos{int y,k;}e[M];
bool cmp(pos a,pos b){return a.y<b.y;}
LL sum,f[M],s[M];
LL pabs(LL x){return x>=0?x:-x;}
struct node{LL v; int pos;}q[M];
int main()
{n=read(); m=read();for(int i=1;i<=n;i++) x[i]=read();for(int i=1;i<=m;i++) e[i].y=read(),e[i].k=read(),sum+=e[i].k;if(sum<n){printf("-1\n"); return 0;}sort(x+1,x+1+n);sort(e+1,e+1+m,cmp);for(int i=1;i<=n;i++) f[i]=inf;for(int i=1;i<=m;i++){l=1; r=0;for(int j=1;j<=n;j++) s[j]=s[j-1]+pabs(x[j]-e[i].y);for(int j=0;j<=n;j++){while(l<=r&&q[r].v>=f[j]-s[j]) r--;while(l<=r&&(j-q[l].pos)>e[i].k) l++;q[++r].v=f[j]-s[j]; q[r].pos=j;f[j]=q[l].v+s[j];}}printf("%lld\n",f[n]);return 0;
}
View Code

 

转载于:https://www.cnblogs.com/lyzuikeai/p/7440311.html

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

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

相关文章

C#调用WebService实例和开发(转)

http://www.cnblogs.com/peterpc/p/4628441.html 一、基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求&#xff0c;轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务&#xff0c;使用WSDL文件…

智能情绪分析技术_简单分析人工智能的表现在计算机网络应用技术中的优势

简单分析人工智能的表现在计算机网络应用技术中的优势大数据时代背景下&#xff0c; 计算机网络技术迅猛发展&#xff0c; 而人工智能技术的发展也进一步推动了计算机网络技术的发展&#xff0c; 两者相互融合&#xff0c; 相互促进&#xff0c; 实现了双赢发展。从人工智能技术…

MV预测过程详解

第一步&#xff1a;确定相邻块 MV 预测以宏块分割&#xff08;或亚宏块分割&#xff0c;如果宏块存在亚分割&#xff09;为单位&#xff0c;同一个宏块分割&#xff08;或亚宏块分割&#xff09;内所有 4*4 块 MV 预测值相同。以每个宏块分割&#xff08;或亚宏块分割&…

Zabbix2.2.6邮件报警设置方法

http://www.jb51.net/article/56973.htm 这篇文章主要介绍了Zabbix邮件报警设置方法,在Zabbix服务端设置邮件报警&#xff0c;当被监控主机宕机或者达到触发器预设值时&#xff0c;会自动发送报警邮件到指定邮箱说明&#xff1a;Zabbix监控服务端、客户端都已经部署完…

matlab 矩阵拼接

E[a&#xff0c;b]%水平方向上的拼接 E[a &#xff1b;b] %垂直方向上的拼接 转载于:https://www.cnblogs.com/hsy1941/p/7124083.html

Machine Learning——octave矩阵操作(2)——DAY3

矩阵的数学操作&#xff1a; Assumed: a为一个矩阵&#xff0c;m是一个向量 Log(a)——求每一个元素的对数 Exp(a)——以e为底的指数 1./a——求每个元素的导师 [a,b]max(m)——m是一个向量&#xff0c;a为m当中最大的元素&#xff0c;b为a在m中的排列序号&#xff08;已按从小…

字符串中文判断

2019独角兽企业重金招聘Python工程师标准>>> 1、判断字符串是否全是中文或含有中文 <?php header(Content-type:text/html; charsetutf-8); $str 你好; if(preg_match(/^[\x{4e00}-\x{9fa5}]$/u, $str)>0){ echo 全是中文; …

分治2--取余运算

分治2--取余运算 一、心得 二、题目和分析 题目描述 输入b&#xff0c;p&#xff0c;k的值&#xff0c;求bp mod k的值。其中b&#xff0c;p&#xff0c;k*k为长整型数。输入 三个整数&#xff0c;分别为b&#xff0c;p&#xff0c;k的值输出 bp mod k样例输入 2 10 9样例输出 …

-mysql-锁机制分为表级锁和行级锁

2019独角兽企业重金招聘Python工程师标准>>> 声明&#xff1a;本栏目所使用的素材都是凯哥学堂VIP学员所写&#xff0c;学员有权匿名&#xff0c;对文章有最终解释权&#xff1b;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 mysql锁机制分为表级锁和行级锁 …

托福试卷真题_干货解答考生疑惑,自考真题考过了还会在出吗?

重视真题&#xff01;重视真题&#xff01;重视真题&#xff01;重要的话要说三遍。想自考的你们一定要注意&#xff0c;对于历年真题&#xff0c;从来都是“备考必做”的态度。做自考真题&#xff0c;除了可以让自己尽快熟悉考试题型和考点外&#xff0c;还有什么好处呢&#…

2016 ACM/ICPC Asia Regional Dalian Online

自己还是太菜&#xff0c;补题离不开题解。。。 但还是留个博客&#xff0c;万一以后忘了。。。 1001 Different Circle Permutation Polya定理&#xff0c;第一次遇见&#xff0c;学习了一下。不旋转的时候可以得到 f[i]f[i-1]f[i-2] 斐波那契数列&#xff0c;旋转后就可以通过…

天融信安全接入客户端_天融信提示您警惕物联网设备Ripple20漏洞风险

近日&#xff0c;天融信阿尔法实验室在JSOF实验室发布的由Treck公司开发的TCP/IP软件库中获取到一系列0day漏洞。JSOF实验室发布的这批漏洞共计19个&#xff0c;被JSOF研究人员称为"Ripple20"。受此软件库影响的产品数量估计超过数亿&#xff0c;其中包括智能家居设备…

GreenSock (TweenMax) 动画案例(二)

实现效果 动画分解 1.灯光闪烁2.文字出现3.水流4.心电图 知识点 1.AI(可尽情骚扰UI欧巴)2.SVG(了解基本的知识点)3.TweenMax(GreenSock)4.CSS animation 写在前面 写过第一篇文章后GreenSock (TweenMax) 动画案例(一)再回头看发现代码太多&#xff0c;根本没耐心去看完。所以每…

无限轮播图片的实现原理

无限轮播图相信是很多开发人员常用的一个功能&#xff0c;这里总结一下常用的两种方式的实现原理 一、使用UIScrollview实现无限轮播用UIScrollView实现&#xff0c;在scrollView上添加3个UIImageView&#xff0c;分别用来显示上一张图片&#xff0c;当前显示的图片&#xff0c…

开启 JM 的 trace 功能

[JM代码] 开启 JM 的 trace 功能本帖最后由 firstime 于 2009-6-15 11:16 AM 编辑 城里汉子说过&#xff1a; trace文件对分析码流结构很有效。我说的是trace文件&#xff0c;不是一步一步跟踪&#xff0c;就是编解码同时生成的 trace_enc.txt 这个文件&#xff0c;里面对每个比…

kafka入门介绍(转载)

Kafka作为一个分布式的流平台&#xff0c;这到底意味着什么&#xff1f; 我们认为&#xff0c;一个流处理平台具有三个关键能力&#xff1a; 发布和订阅消息&#xff08;流&#xff09;&#xff0c;在这方面&#xff0c;它类似于一个消息队列或企业消息系统。 以容错的方式存储…

Cmd Markdown 编辑阅读器

欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想&#xff0c;整理笔记、知识&#xff0c;并将其中承载的价值传播给他人&#xff0c;Cmd Markdown 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown&…

Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)

相关博文&#xff1a; Ubuntu 简单安装和配置 GitLabUbuntu 简单安装 DockerUbuntu Docker 简单安装 GitLabUbuntu Docker 安装和配置 GitLab CI 持续集成服务器版本 Ubuntu 16.04 LTS。 经过上面四篇博文中的相关安装和配置&#xff0c;我们主要完成了两个容器的创建和运行&am…

django-ckeditor表情包修改

一、版本 Django1.11django-ckeditor5.2.2 二、关键步骤 1.删除旧的ckeditor静态文件 所在目录&#xff1a;项目目录下的static文件夹下的ckditor文件夹 rm ckeditor -rf 原因&#xff1a;在安装ckeditor后需要执行collectstatic命令&#xff0c;这个过程中的查找静态文件会去…

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.2.2 如何读入文本输入

2.2.2 如何读入文本输入 最简单的处理任意文本的方式就是使用在卷Ⅰ中我们广泛使用的Scanner类。我们可以从任何输入流中构建Scanner对象。或者&#xff0c;我们也可以将短小的文本文件像下面这样读入到一个字符串中&#xff1a; 在早期的Java版本中&#xff0c;处理文本输入的…