汕头市队赛 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,一经查实,立即删除!

相关文章

基于django和vue的xdh官网设计

前言 本项目是使用三段分离的设计 前台 使用materialize框架搭建的前台页面,后端使用的django写的接口 后台 使用Amazon UI 模板搭建的界面,管理各个部分的内容 项目环境 python3.7.2 django2.2.9 vue axios jQuery materialize mysql摘 要 本设计采用前后端分离的设计…

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; 实现了双赢发展。从人工智能技术…

随笔:关于关于

突然感觉挺累的。 我爱你。 北京&#xff0c;加油。转载于:https://www.cnblogs.com/zhengzeze/p/7448878.html

MV预测过程详解

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

Django models中关于blank与null的补充说明

建立一个简易Model class Person(models.Model):GENDER_CHOICES((1,Male),(2,Female),)namemodels.CharField(max_length30,uniqueTrue,verbose_name姓 名) birthdaymodels.DateField(blankTrue,nullTrue)gendermodels.IntegerField(choicesGENDER_CHOICES)accountmodels.In…

python 人脸关键点检测_opencv+python+dlib人脸关键点检测、实时检测

安装的是anaconde3、python3.7.3&#xff0c;3.7环境安装dlib太麻烦&#xff0c;在anaconde3中新建环境python3.6.8&#xff0c;在3.6环境下安装dlib-19.6.1-cp36-cp36m-win_amd64.whl&#xff0c;下载地址&#xff1a;https://pypi.org/project/dlib/19.6.1/#filesvscode更改配…

Zabbix2.2.6邮件报警设置方法

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

Skip宏块与Direct预测模式浅析

对于我来说&#xff0c;这个是一个老问题了。以前蓝风车专门给我讲解&#xff0c;我都没搞懂&#xff08;真有点对不起蓝风车的细心教诲哈。呵呵~~~&#xff09;。今天终于弄清楚了&#xff0c;特此总结出来&#xff0c;请大家指正。 B_Skip类型宏…

自律

生活上的自律 写出自律的代码 身体上的自律 日常生活中&#xff0c;存在这么两条路。一条路诱惑我们只根据自己的冲动和直觉来生活。这条路可以称为「宠物之路」&#xff0c;因为所有的动物&#xff0c;包括家里养的宠物狗走的都是这条路。饿了就吃&#xff0c;吃完就算。…

解决兼容性的库

HTML5标签兼容方案&#xff1a;html5shiv.js [GitHub地址&#xff1a;https://github.com/aFarkas/html5shiv/] IE8不支持HTML5的新标签&#xff0c;如<header>、<nav>等标签在IE8无法渲染。html5shiv.js可帮助IE6-8浏览器兼容HTML5语义化标签。 使用方法&#xff…

H.264 中的相关问题

帧内解码时&#xff0c;在解码端&#xff0c;首先通过当前宏块左边、上边已经解码完成的宏块使用当前宏块的预测模式&#xff08;预测模式计算过程请参见我的论文《H.264数字视频差错控制技术的研究》&#xff0c;在群FTP“本群原创资料”目录中&#xff09;得到当前宏块的像素…

wenzhixin bootstrap-table 点击table单元格改变颜色

bootstrap-table用于展示数据非常方便&#xff0c;也需要满足一些个性化需求。比如点击窗格&#xff08;td&#xff09;标记下颜色&#xff0c;用于目测 代码如下&#xff0c;转载请注明 $("table").on(click-row.bs.table, function (e, row, $el) {//el[0] is tr …

tornado学习笔记day01-高并发性能web框架

tornado的安装 这里我使用的是虚拟环境中的pip安装,配合清华大学镜像源安装的 pip install tornado -i https://pypi.tuna.tsinghua.edu.cn/simple我的第一个tornado程序 import tornado.web import tornado.ioloopclass IndexHandler(tornado.web.RequestHandler):主页处理…

python99乘法表while翻译_Python学习之while练习--九九乘法表

效果如下&#xff1a;实现代码;m 1n 1while(m<10):while(n<m):print(n,"*",m,"",m*n,end \t)n 1print(\n)n 1m 1解析&#xff1a;这是一个很简单的while嵌套程序&#xff0c;首先分析九九乘法表是从上往下逐行增加&#xff0c;且第一列乘积为1…

ASP.NET Core 2加入了Razor页面特性

最近发布的ASP.NET Core 2.0&#xff0c;连同新发布的.NET Core 2和Entity Framework Core 2.0y&#xff0c;一并构成了.NET Core 2.0生态中的三元组。此发布给出了多个新特性和改进&#xff0c;其中包括通用性能的改进、Razor页面、新的开发模板以及更好的Azure Diagnostics支…

matlab 矩阵拼接

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

JM8.5中的7种宏块模式问题 - zhoujunming的专栏 - CSDN博客

JM8.5中的7种宏块模式问题 收藏 Outline: 1、 CFG文件中有关可变尺寸宏块模式的相关选项2、 7种宏块模式对应的数值常量3、 7种宏块模式被分成宏块和亚宏块4、 如何对宏块和亚宏块的运动估计&#xff0c;采用一个共同的函数来处理5、 遗留问题1、CFG文件中有关可变尺寸宏块…

tornado学习笔记day02-进阶与提升

整理基础工程 请看第一天的配置文件目录,搭建了一个框架的基础目录 Application settings debug 作用 可以设置tornado是否工作在调试模式下面,默认为false,即工作在生产模式下 true的特性: 自动重启: tornado程序会监控源代码文件,会自动重启服务器,减少我们手动重启…

python123测验2答案八边形_Python试卷

3、写一个函数&#xff0c;计算一个给定的日期是该年的第几天。def getday(self,yNone,mNone,dNone):date datetime(y,m,d)days date.strftime(%j)return days4、写一个函数&#xff0c;给定N&#xff0c;返回斐波那契数列第N项。def getn_vlaue(self,n):if n<2:return 1e…