2012 Multi-University Training Contest 7

A.As long as Binbin loves Sangsang

B.Dead or alive

C.Dragon Ball

题意:在连续的n秒中,每秒会出现m个龙珠。已知初始位置,每从一个位置i,移动到另一个位置j的时候,消耗的代价为abs(i-j), 知道了每次出现的龙珠的位置及取它的代价,每一秒必须取一颗龙珠。问 n 秒之后花费的最小代价是多少。

SOL:用dp[i][j]表示i秒之后,留在第j个龙珠所在位置的最小花费,这样就有了一个$O(n*m^2)$的做法,之后很容易想到用单调队列优化,复杂度$O(n*m)$。

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. const int oo = 1e9;
  8. int i, j, k, n, m, s, t, ans, x;
  9. struct node {
  10. int pos, cost;
  11. } a[][];
  12. int dp[][];
  13. bool cmp(const node &x, const node &y) {
  14. return x.pos < y.pos;
  15. }
  16. int main() {
  17. int T;
  18. scanf("%d", &T);
  19. while (T--) {
  20. scanf("%d %d %d", &n, &m, &x);
  21. for (int i = ; i <= n; i++) {
  22. for (int j = ; j <= m; j++) {
  23. scanf("%d", &a[i][j].pos);
  24. }
  25. }
  26. for (int i = ; i <= n; i++) {
  27. for (int j = ; j <= m; j++) {
  28. scanf("%d", &a[i][j].cost);
  29. }
  30. }
  31. for (int i = ; i <= n; i++) {
  32. sort(a[i] + , a[i] + + m, cmp);
  33. }
  34. for (int j = ; j <= m; j++) {
  35. dp[][j] = a[][j].cost + abs(a[][j].pos - x);
  36. }
  37. for (int i = ; i <= n; i++) {
  38. int k = , t = oo;
  39. for (int j = ; j <= m; j++) {
  40. while (k + <= m && a[i][j].pos >= a[i - ][k + ].pos) {
  41. k++;
  42. t = min(t, dp[i - ][k] - a[i - ][k].pos);
  43. }
  44. dp[i][j] = t + a[i][j].cost + a[i][j].pos;
  45. }
  46. k = m + , t = oo;
  47. for (int j = m; j >= ; j--) {
  48. while (k - >= && a[i][j].pos <= a[i - ][k - ].pos) {
  49. k--;
  50. t = min(t, dp[i - ][k] + a[i - ][k].pos);
  51. }
  52. dp[i][j] = min(dp[i][j], t + a[i][j].cost - a[i][j].pos);
  53. }
  54. }
  55. ans = oo;
  56. for (int j = ; j <= m; j++) {
  57. ans = min(ans, dp[n][j]);
  58. }
  59. printf("%d\n", ans);
  60. }
  61. return ;
  62. }

D.Draw and paint

E.Matrix operation

F.Palindrome graph

题意:给你n*n的方格纸,在格子里填颜色,要满足任意水平、垂直翻转,转任意个90度后看到的图形都一样;现在你有k种颜色,有m个格子已经图了颜色,求方案数。

SOL:直接搞出等价类再用快速幂做一做就好了。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. const int mod = ;
  8. const int LEN = 1e5 + ;
  9. int i, j, k, n, m, s, t, ans, tot;
  10. int a[LEN];
  11. int pow_mod(const int &x, int y) {
  12. if (y == ) {
  13. return ;
  14. }
  15. int ans = pow_mod(x, y >> );
  16. ans = (ll)ans * ans % mod;
  17. if (y & ) {
  18. ans = (ll)ans * x % mod;
  19. }
  20. return ans;
  21. }
  22. int trans(int x, int y) {
  23. if (x > n / ) {
  24. x = n + - x;
  25. }
  26. if (y > n / ) {
  27. y = n + - y;
  28. }
  29. if (x > y) {
  30. swap(x, y);
  31. }
  32. return x * + y;
  33. }
  34. int getnum(int n) {
  35. int L = (n + ) / ;
  36. return (L + ) * L / ;
  37. }
  38. int main() {
  39. while (scanf("%d %d %d", &n, &m, &k) != EOF) {
  40. tot = ;
  41. for (int i = ; i <= m; i++) {
  42. int x, y;
  43. scanf("%d %d", &x, &y);
  44. x++, y++;
  45. a[++tot] = trans(x, y);
  46. }
  47. if (tot > ) {
  48. sort(a + , a + + tot);
  49. tot = unique(a + , a + + tot) - a - ;
  50. }
  51. printf("%d\n", pow_mod(k, getnum(n) - tot));
  52. }
  53. return ;
  54. }

G.Successor

题意:给你一棵树,每个结点有两个属性值,1.能力值,2.忠诚度。然后m个询问,每次询问一个整数u,求u的子树中能力值大于u的且忠诚度最大的点的编号。

SOL:先按能力值排序,这样从大到小考虑就满足了条件1,然后从大到小依次在线段树里查询子树中忠诚度最大的点的编号,复杂度O(nlogn)。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #define tl (p << 1)
  6. #define tr (p << 1 | 1)
  7. using namespace std;
  8. const int LEN = 1e5 + ;
  9. int i, j, k, n, m, s, t, tot, Time;
  10. struct edge {
  11. int vet, next;
  12. } E[LEN * ];
  13. struct node {
  14. int x, y, id;
  15. } a[LEN];
  16. bool cmp(const node &x, const node &y) {
  17. return x.x > y.x;
  18. };
  19. int head[LEN], size[LEN], tid[LEN], ans[LEN], pre[LEN], b[LEN];
  20. int to[];
  21. int tmax[LEN * ];
  22. void add(int u, int v) {
  23. E[++tot] = (edge){v, head[u]};
  24. head[u] = tot;
  25. }
  26. void dfs(int u) {
  27. size[u] = ;
  28. tid[u] = ++Time;
  29. pre[Time] = u;
  30. for (int e = head[u]; e != -; e = E[e].next) {
  31. int v = E[e].vet;
  32. dfs(v);
  33. size[u] += size[v];
  34. }
  35. }
  36. int ask(int l, int r, int x, int y, int p) {
  37. if (l == x && y == r) {
  38. return tmax[p];
  39. }
  40. int mid = (l + r) >> ;
  41. if (mid >= y) {
  42. return ask(l, mid, x, y, tl);
  43. } else if (mid + <= x) {
  44. return ask(mid + , r, x, y, tr);
  45. } else {
  46. return max(ask(l, mid, x, mid, tl), ask(mid + , r, mid + , y, tr));
  47. }
  48. }
  49. void update(int p) {
  50. tmax[p] = max(tmax[tl], tmax[tr]);
  51. }
  52. void modify(int l, int r, const int &x, int p, const int &c) {
  53. if (l == r) {
  54. tmax[p] = c;
  55. return;
  56. }
  57. int mid = (l + r) >> ;
  58. if (mid >= x) {
  59. modify(l, mid, x, tl, c);
  60. } else {
  61. modify(mid + , r, x, tr, c);
  62. }
  63. update(p);
  64. }
  65. void build(int l, int r, int p) {
  66. if (l == r) {
  67. tmax[p] = -;
  68. return;
  69. }
  70. int mid = (l + r) >> ;
  71. build(l, mid, tl);
  72. build(mid + , r, tr);
  73. update(p);
  74. }
  75. int main() {
  76. int T;
  77. scanf("%d", &T);
  78. while (T--) {
  79. tot = Time = ;
  80. scanf("%d %d", &n, &m);
  81. for (int i = ; i <= n; i++) {
  82. head[i] = -;
  83. size[i] = ;
  84. tid[i] = ;
  85. }
  86. a[] = (node){1e9, , };
  87. for (int i = ; i <= n; i++) {
  88. int fa, x, y;
  89. scanf("%d %d %d", &fa, &x, &y);
  90. x++,y++,fa++;
  91. swap(x, y);
  92. add(fa, i);
  93. a[i] = (node){x, y, i};
  94. to[y] = i;
  95. }
  96. dfs();
  97. build(, n, );
  98. sort(a + , a + + n, cmp);
  99. int j = ;
  100. for (int i = ; i <= n; i++) {
  101. int x = a[i].id, t = ask(, n, tid[x], tid[x] + size[x] - , );
  102. if (t == -) {
  103. ans[x] = ;
  104. } else {
  105. ans[x] = to[t];
  106. }
  107. while (j + <= i && a[j + ].x > a[i + ].x) {
  108. modify(, n, tid[a[j + ].id], , a[j + ].y);
  109. j++;
  110. }
  111. }
  112. while (m--) {
  113. int x;
  114. scanf("%d", &x);
  115. printf("%d\n", ans[x + ] - );
  116. }
  117. }
  118. return ;
  119. }

H.The war of virtual world

I.Water World I

J.Water World II

2012 Multi-University Training Contest 7的更多相关文章

  1. 2012 Multi-University Training Contest 9 / hdu4389

    2012 Multi-University Training Contest 9 / hdu4389 打巨表,实为数位dp 还不太懂 先这样放着.. 对于打表,当然我们不能直接打,这里有技巧.我们可以 ...

  2. HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  3. HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...

  4. 2015 Multi-University Training Contest 8 hdu 5390 tree

    tree Time Limit: 8000ms Memory Limit: 262144KB This problem will be judged on HDU. Original ID: 5390 ...

  5. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. 2016 Multi-University Training Contest 2 D. Differencia

    Differencia Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  7. 2016 Multi-University Training Contest 1 G. Rigid Frameworks

    Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. 2014 Multi-University Training Contest 9#11

    2014 Multi-University Training Contest 9#11 Killing MonstersTime Limit: 2000/1000 MS (Java/Others)   ...

  9. 2014 Multi-University Training Contest 9#6

    2014 Multi-University Training Contest 9#6 Fast Matrix CalculationTime Limit: 2000/1000 MS (Java/Oth ...

随机推荐

  1. delphi ----Raize(第三方控件) TRzNumericEdit

    一.Raize Edits 1.TRzNumericEdit IntegerOnly属性设置为false,可以输入小数. DisplayFormat := ',0.00;(,0.00)';;//小数默 ...

  2. 2015-03-10——简析javascript对象

    对于构造函数,它是Function对象的一个实例,可以定义自己的静态成员先实例化出对象,后执行function中内部代码 静态成员:  var abc = function () {};  //既是一 ...

  3. python常用方法详解

    1,讲序列分解为单独的变量 p=(4,5) x,y=p print(x,y) 如果在分解中想丢弃某些特定的值,可以采用_来进行 data=['A','B','c','d'] _,name,age,_= ...

  4. Python3+Selenium3自动化测试-(三)

    selenium键盘事件 #coding=utf-8 from selenium import webdriver import time from selenium.webdriver.common ...

  5. go项目找不到包问题

    最近学习go语言,但是在主函数中引入其他包(自定义包)中方法的时候,编译代码,显示找不到包,如: $GOPATH>go build stacker.gostacker.go:18:2: cann ...

  6. blogCMS整理

    一.在urls中写路由 二.返回登录页面(login.html中写前端代码) - username(用户名) - password(密码) - validCode(验证码) -submit(提交按钮) ...

  7. shiro 拦截器

    参考

  8. Leaflet API 翻译(二)

    摘自:http://www.ithao123.cn/content-824673.html L.Point 显示以像素为单位的点的x,y坐标. 所以接受点对象的leaflet方法和选项都也接受他们简单 ...

  9. Linux命令(6/28)——declare/typeset命令

    declare 与 typeset 命令是bash的内建命令,两者是完全一样的,用来声明shell变量,设置变量的属性. declare命令(别名typeset)属shell内建命令,用于申明shel ...

  10. Linux 上下左右键变成^A,^B,^C,^D解决方法

    用gedit打开 /etc/vim/vimrc.tiny,将里面的 set compatible 改成 set nocompatible 对于退格键backspace的问题,只需在刚才那句话下面加上一 ...