题目大意:
  在一条直线上,有n个老鼠,m个洞。
  每个老鼠i都有一个初始位置x[i]。
  每个洞i都有一个固定位置p[i]和容量限制c[i]。
  求所有老鼠都进洞的最小距离总和。

思路:
  动态规划。
  用f[i][j]表示前i个洞、前j只老鼠的最小距离总和。
  用sum[i][j]表示前j个老鼠都进入第i个洞的距离总和。
  可以得到以下DP方程:
  f[i][j]=min{f[i-1][k]-sum[i][k]|k<=j}+sum[i][j]。
  然后就MLE,发现sum可以每次求出来,f如果倒着推,也可以省掉一维。
  这样空间复杂度就是O(n)的,时间复杂度是O(n^2m)的,在第42个点TLE了。
  考虑使用单调队列维护f[i-1][k]-sum[i][k]的min,做到O(nm)。

  1. #include<deque>
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<algorithm>
  5. inline int getint() {
  6. register char ch;
  7. register bool neg=false;
  8. while(!isdigit(ch=getchar())) if(ch=='-') neg=true;
  9. register int x=ch^'';
  10. while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
  11. return neg?-x:x;
  12. }
  13. const long long inf=0x7fffffffffffffffll;
  14. const int N=;
  15. int x[N];
  16. struct Hole {
  17. int p,c;
  18. bool operator < (const Hole &another) const {
  19. return p<another.p;
  20. }
  21. };
  22. Hole h[N];
  23. long long f[][N],sum[N];
  24. std::deque<int> q;
  25. int main() {
  26. int n=getint(),m=getint();
  27. for(register int i=;i<=n;i++) {
  28. x[i]=getint();
  29. }
  30. for(register int i=;i<=m;i++) {
  31. h[i]=(Hole){getint(),getint()};
  32. }
  33. std::sort(&x[],&x[n+]);
  34. std::sort(&h[],&h[m+]);
  35. std::fill(&f[][],&f[][n+],inf);
  36. for(register int i=;i<=m;i++) {
  37. for(register int j=;j<=n;j++) {
  38. sum[j]=sum[j-]+std::abs(h[i].p-x[j]);
  39. }
  40. q.clear();
  41. q.push_back();
  42. for(register int j=;j<=n;j++) {
  43. while(!q.empty()&&j-q.front()>h[i].c) {
  44. q.pop_front();
  45. }
  46. while(!q.empty()&&f[!(i&)][j]-sum[j]<=f[!(i&)][q.back()]-sum[q.back()]) {
  47. q.pop_back();
  48. }
  49. q.push_back(j);
  50. f[i&][j]=f[!(i&)][q.front()]+sum[j]-sum[q.front()];
  51. }
  52. }
  53. printf("%I64d\n",f[m&][n]!=inf?f[m&][n]:-);
  54. return ;
  55. }

[CodeForces-797F]Mice and Holes的更多相关文章

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

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

  2. Mice and Holes CodeForces - 797F

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

  3. Codeforces 797 F Mice and Holes

    http://codeforces.com/problemset/problem/797/F F. Mice and Holes time limit per test             1.5 ...

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

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

  5. CF797F Mice and Holes 贪心、栈维护DP

    传送门 首先\(\sum c\)有些大,考虑将其缩小降低难度 考虑一个贪心:第一次所有老鼠都进入其左边第一个容量未满的洞(如果左边没有就进入右边第一个未满的洞),第二次所有老鼠都进入其右边第一个容量未 ...

  6. Codeforces 793C - Mice problem(几何)

    题目链接:http://codeforces.com/problemset/problem/793/C 题目大意:给你一个捕鼠器坐标,和各个老鼠的的坐标以及相应坐标的移动速度,问你是否存在一个时间点可 ...

  7. [Codeforces797F]Mice and Holes

    Problem n个老鼠,m个洞,告诉你他们的一维坐标和m个洞的容量限制,问最小总距离. Solution 用dp[i][j]表示前i个洞,进了前j个老鼠的最小代价 dp[i][j]=min(dp[i ...

  8. Mice and Holes

    题意: 有 $n$ 只老鼠和 $m$ 个鼠洞,第 $i$ 只老鼠的坐标为 $x_i$,第 $j$ 个鼠洞的坐标为 $p_j$ ,容量为 $c_j$. 第 $i$ 只老鼠钻进第 $j$ 个鼠洞的距离为 ...

  9. Educational Codeforces Round 19

    A. k-Factorization 题目大意:给一个数n,求k个大于1的数,乘积为n.(n<=100,000,k<=20) 思路:分解质因数呗 #include<cstdio> ...

随机推荐

  1. c语言学习笔记.数组.

    数组: 可以存储一个固定大小的相同类型元素的顺序集合,比如int类型的数组.float类型的数组,里面存放的数据称为“元素”. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址 ...

  2. struts集合类型封装

    1.list类型封装

  3. http 之cookie和session

     cookie和session 关于http: 1.http是:无状态.短连接 2.http的请求生命周期:给服务端发送一个请起头,通过域名提取url,通过路由关系匹配,再通过函数+html进行模板加 ...

  4. offset宏的讲解【转】

    转自:http://blog.csdn.net/tigerjibo/article/details/8299584 1.offset宏讲解 #define offsetof(TYPE, MEMBER) ...

  5. MySQL Warning: Using a password on the command line interface can be insecure.解决办法

    转自 http://www.cnblogs.com/sunss/p/6256706.html  被一个小朋友问到,直接公布答案: If your MySQL client/server version ...

  6. IO的学习与使用

    一.IO的学习方法:IO中包含了很多的类,推荐的学习方式是:“举一反三,掌握一种,以此类推”. 二.I/O操作的目标: 输入:从数据源(在数据源和程序之间建立的一个数据流淌的“管道”)中读取数据(文件 ...

  7. java在图片上写字

  8. 使用Opencv时编译错误

    1)无法打开包括文件: “cv.h”: No such file or directory 我的配置文件没有问题,但是一直报错,我是在HEVC测试软件HM中调用了opencv. HM有很多个工程,我只 ...

  9. 强大的PHP一句话后门

    强悍的PHP一句话后门  这类后门让网站.服务器管理员很是头疼,经常要换着方法进行各种检测,而很多新出现的编写技术,用普通的检测方法是没法发现并处理的. 今天我们细数一些有意思的PHP一句话木马. 1 ...

  10. jquery重置

    在使用jquery时要先引用 <script type="text/javascript" src="/Themes/Default/Js/jquery-1.11. ...