F. Mice and Holes
time limit per test            

1.5 seconds

memory limit per test      

256 megabytes

input

standard input

output

standard output

One day Masha came home and noticed n mice in the corridor of her flat. Of course, she shouted loudly, so scared mice started to run to the holes in the corridor.

The corridor can be represeted as a numeric axis with n mice and m holes on it. ith mouse is at the coordinate xi, and jth hole — at coordinate pjjth hole has enough room for cj mice, so not more than cj mice can enter this hole.

What is the minimum sum of distances that mice have to go through so that they all can hide in the holes? If ith mouse goes to the hole j, then its distance is |xi - pj|.

Print the minimum sum of distances.

Input

The first line contains two integer numbers nm (1 ≤ n, m ≤ 5000) — the number of mice and the number of holes, respectively.

The second line contains n integers x1, x2, ..., xn ( - 109 ≤ xi ≤ 109), where xi is the coordinate of ith mouse.

Next m lines contain pairs of integer numbers pj, cj ( - 109 ≤ pj ≤ 109, 1 ≤ cj ≤ 5000), where pj is the coordinate of jth hole, and cj is the maximum number of mice that can hide in the hole j.

Output

Print one integer number — the minimum sum of distances. If there is no solution, print -1 instead.

Examples
input
4 5
6 2 8 9
3 6
2 1
3 6
4 7
4 7
output
11
input
7 2
10 20 30 40 50 45 35
-1000000000 10
1000000000 1
output
7000000130

题意:n个老鼠m个洞在数轴上,给出老鼠坐标,再给出每个洞的坐标和最多容纳的老鼠数量,问所有的老鼠到洞里所需要的最短距离,不能则输出-1

分析题目可得,最优方案一定是 某一个洞里容纳了坐标临近的老鼠

即将洞按坐标排序,老鼠按坐标排序,第i个洞容纳的是第k——s只老鼠,第i+1个洞容纳的是第s+1——t只老鼠

令f[j][i]表示前j个洞,容纳了前i只老鼠的最短距离

s[j][i]表示第1——i只老鼠全到第j个洞的距离和,即前缀和

那么f[j][i]可以由f[j-1][i-1],f[j-1][i-2]……f[j-1][i-容量]转移过来

动态转移方程:f[j][i]=min(f[j-1][k]+s[j][i]-s[j][k])

事件复杂度:n²

可以用单调队列优化

对于每一个j和i,s[j][i]是定值,f[j][i]=min(f[j-1][k]-s[j][k])+s[j][i]

对于每一个j,维护一个f[j-1][k]-s[j][k]的单调递增队列

f[j][i]就等于  队首+s[j][i]

然后滚动数组滚起来~~

(虽然不用滚动数组也能A)

不用滚动数组版:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
int mouse[],que[];
ll sum,f[][],s[];
struct HOLE
{
int pos,capa;
}hole[];
bool cmp(HOLE p,HOLE k) { return p.pos<k.pos; }
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&mouse[i]);
for(int i=;i<=m;i++) scanf("%d%d",&hole[i].pos,&hole[i].capa),sum+=hole[i].capa;
if(n>sum) { printf("-1"); return ; }
sort(mouse+,mouse+n+);
sort(hole+,hole+m+,cmp);
memset(f,,sizeof(f));
f[][]=;
for(int j=;j<=m;j++)
{
int head=,tail=;
que[]=;
for(int i=;i<=n;i++) s[i]=s[i-]+abs(mouse[i]-hole[j].pos);
for(int i=;i<=n;i++)
{
while(head<tail&&que[head]<i-hole[j].capa) head++;
while(head<tail&&f[j-][i]-s[i]<=f[j-][que[tail-]]-s[que[tail-]]) tail--;
que[tail++]=i;
f[j][i]=f[j-][que[head]]+s[i]-s[que[head]];
}
}
printf("%lld",f[m][n]);
}
滚动数组:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
int mouse[],que[];
ll sum,f[][],s[];
struct HOLE
{
int pos,capa;
}hole[];
bool cmp(HOLE p,HOLE k) { return p.pos<k.pos; }
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&mouse[i]);
for(int i=;i<=m;i++) scanf("%d%d",&hole[i].pos,&hole[i].capa),sum+=hole[i].capa;
if(n>sum) { printf("-1"); return ; }
sort(mouse+,mouse+n+);
sort(hole+,hole+m+,cmp);
memset(f,,sizeof(f));
f[][]=;
int j,now=,pre=;
for(j=;j<=m;j++,swap(now,pre))
{
int head=,tail=;
que[]=;
for(int i=;i<=n;i++) s[i]=s[i-]+abs(mouse[i]-hole[j].pos);
for(int i=;i<=n;i++)
{
while(head<tail&&que[head]<i-hole[j].capa) head++;
while(head<tail&&f[pre][i]-s[i]<=f[pre][que[tail-]]-s[que[tail-]]) tail--;
que[tail++]=i;
f[now][i]=f[pre][que[head]]+s[i]-s[que[head]];
}
}
printf("%lld",f[pre][n]);
}

while(head<tail&&que[head]<i-hole[j].capa) 不能加等号,因为这一次的范围是以i-hole[j].capa开始
while(head<tail&&f[pre][i]-s[i]<=f[pre][que[tail-1]]-s[que[tail-1]])  要加等号,可以更新队列中的老鼠的标号,使其更大,更有利于后面的转移
 
刚开始想的是三维dp,f[j][i][k] 其中k表示最后一个洞容纳了几只老鼠,这一维是冗余的,且难以设计方程
这一维起的作用是转移状态的上界,完全可以在枚举i时只枚举合法的

Codeforces 797 F Mice and Holes的更多相关文章

  1. Mice and Holes CodeForces - 797F

    Mice and Holes CodeForces - 797F 题意:有n只老鼠和m个洞,都在一个数轴上,老鼠坐标为x[1],...,x[n],洞的坐标为p[1],...,p[m],每个洞能容纳的老 ...

  2. AC日记——Mice and Holes codeforces 797f

    797F - Mice and Holes 思路: XXYXX: 代码: #include <cmath> #include <cstdio> #include <cst ...

  3. Mice and Holes 单调队列优化dp

    Mice and Holes 单调队列优化dp n个老鼠,m个洞,告诉你他们的一维坐标和m个洞的容量限制,问最小总距离.1 ≤ n, m ≤ 5000. ​ 首先列出朴素的dp方程:\(f[i][j] ...

  4. Codeforces 959 F. Mahmoud and Ehab and yet another xor task

    \(>Codeforces\space959 F. Mahmoud\ and\ Ehab\ and\ yet\ another\ xor\ task<\) 题目大意 : 给出一个长度为 \ ...

  5. Codeforces 835 F. Roads in the Kingdom

    \(>Codeforces\space835 F. Roads in the Kingdom<\) 题目大意 : 给你一棵 \(n\) 个点构成的树基环树,你需要删掉一条环边,使其变成一颗 ...

  6. codeforces 797 E. Array Queries【dp,暴力】

    题目链接:codeforces 797 E. Array Queries   题意:给你一个长度为n的数组a,和q个询问,每次询问为(p,k),相应的把p转换为p+a[p]+k,直到p > n为 ...

  7. Codeforces 731 F. Video Cards(前缀和)

    Codeforces 731 F. Video Cards 题目大意:给一组数,从中选一个数作lead,要求其他所有数减少为其倍数,再求和.问所求和的最大值. 思路:统计每个数字出现的个数,再做前缀和 ...

  8. Codeforces Beta Round #13 E. Holes 分块暴力

    E. Holes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/13/problem/E Des ...

  9. Codeforces 797 D. Broken BST

    D. Broken BST http://codeforces.com/problemset/problem/797/D time limit per test 1 second memory lim ...

随机推荐

  1. struts传值方式ModelDriven的使用

    struts传值不需要用到request,struts会处理好. 1.不是面向对象直接在jsp页面和Java代码都写:name,password... 以下为面向对象 2.action类实现Model ...

  2. WCF RestFull提交数据超出限额解决方法

    最近在使用wcf restfull时出现了超大数据提交出错的问题. 服务端会返回错误:服务器处理请求时遇到错误.有关构造有效服务请求的内容,请参阅服务帮助页.异常消息为“反序列化对象 属于类型 Yes ...

  3. 【Leetcode】50. Pow(x, n)

    Implement pow(x, n). Example 1: Input: 2.00000, 10 Output: 1024.00000 Example 2: Input: 2.10000, 3 O ...

  4. C++11 锁 lock

    转自:https://www.cnblogs.com/diegodu/p/7099300.html 互斥(Mutex: Mutual Exclusion) 下面的代码中两个线程连续的往int_set中 ...

  5. TClientDataSet[5]: 读取数据

    本例用到: TClientDataSet.Fields[];          { 字段集合; 它比 FieldList 有更多功能, 如可获取嵌套字段 } TClientDataSet.FieldL ...

  6. inline函数的总结

    在函数返回类型前加上关键字inline就可以将函数指定为内联函数: inline const string& shortString(const string &s1, const s ...

  7. 第111天:Ajax之jQuery实现方法

    由于jQuery中的Ajax方法是用了内置的deferred模块,是Promise模式的一种实现,而我们这里没有讲过,所以我们就不使用这一模式啦. 我们只定义一个Ajax方法,他可以简单的get,po ...

  8. BZOJ 1266 上学路线(最短路+最小割)

    给出n个点的无向图,每条边有两个属性,边权和代价. 第一问求1-n的最短路.第二问求用最小的代价删边使得最短路的距离变大. 对于第二问.显然该删除的是出现在最短路径上的边.如果我们将图用最短路跑一遍预 ...

  9. 【开发工具IDE】解决IntelliJ IDEA 创建Maven项目速度慢的问题

    方法一(推荐) 在创建Maven项目时加上 archetypeCatalog=internal 参数,如下: 方法二 在maven的VM Options加上-DarchetypeCatalog=int ...

  10. Day22-1-知识回顾

    1. 知识点概要 --Session --CSRF --Model操作 --Form验证(ModelForm) --中间件 --缓存 2.知识回顾 2.1客户端请求及服务器端返回,都包含请求头和bod ...