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)$。

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int oo = 1e9;
int i, j, k, n, m, s, t, ans, x;
struct node {
int pos, cost;
} a[][];
int dp[][];
bool cmp(const node &x, const node &y) {
return x.pos < y.pos;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d %d %d", &n, &m, &x);
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
scanf("%d", &a[i][j].pos);
}
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
scanf("%d", &a[i][j].cost);
}
}
for (int i = ; i <= n; i++) {
sort(a[i] + , a[i] + + m, cmp);
}
for (int j = ; j <= m; j++) {
dp[][j] = a[][j].cost + abs(a[][j].pos - x);
}
for (int i = ; i <= n; i++) {
int k = , t = oo;
for (int j = ; j <= m; j++) {
while (k + <= m && a[i][j].pos >= a[i - ][k + ].pos) {
k++;
t = min(t, dp[i - ][k] - a[i - ][k].pos);
}
dp[i][j] = t + a[i][j].cost + a[i][j].pos;
}
k = m + , t = oo;
for (int j = m; j >= ; j--) {
while (k - >= && a[i][j].pos <= a[i - ][k - ].pos) {
k--;
t = min(t, dp[i - ][k] + a[i - ][k].pos);
}
dp[i][j] = min(dp[i][j], t + a[i][j].cost - a[i][j].pos);
}
}
ans = oo;
for (int j = ; j <= m; j++) {
ans = min(ans, dp[n][j]);
}
printf("%d\n", ans);
}
return ;
}

D.Draw and paint

E.Matrix operation

F.Palindrome graph

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

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

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod = ;
const int LEN = 1e5 + ;
int i, j, k, n, m, s, t, ans, tot;
int a[LEN];
int pow_mod(const int &x, int y) {
if (y == ) {
return ;
}
int ans = pow_mod(x, y >> );
ans = (ll)ans * ans % mod;
if (y & ) {
ans = (ll)ans * x % mod;
}
return ans;
}
int trans(int x, int y) {
if (x > n / ) {
x = n + - x;
}
if (y > n / ) {
y = n + - y;
}
if (x > y) {
swap(x, y);
}
return x * + y;
}
int getnum(int n) {
int L = (n + ) / ;
return (L + ) * L / ;
}
int main() {
while (scanf("%d %d %d", &n, &m, &k) != EOF) {
tot = ;
for (int i = ; i <= m; i++) {
int x, y;
scanf("%d %d", &x, &y);
x++, y++;
a[++tot] = trans(x, y);
}
if (tot > ) {
sort(a + , a + + tot);
tot = unique(a + , a + + tot) - a - ;
}
printf("%d\n", pow_mod(k, getnum(n) - tot));
}
return ;
}

G.Successor

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

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

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define tl (p << 1)
#define tr (p << 1 | 1)
using namespace std;
const int LEN = 1e5 + ;
int i, j, k, n, m, s, t, tot, Time;
struct edge {
int vet, next;
} E[LEN * ];
struct node {
int x, y, id;
} a[LEN];
bool cmp(const node &x, const node &y) {
return x.x > y.x;
};
int head[LEN], size[LEN], tid[LEN], ans[LEN], pre[LEN], b[LEN];
int to[];
int tmax[LEN * ];
void add(int u, int v) {
E[++tot] = (edge){v, head[u]};
head[u] = tot;
}
void dfs(int u) {
size[u] = ;
tid[u] = ++Time;
pre[Time] = u;
for (int e = head[u]; e != -; e = E[e].next) {
int v = E[e].vet;
dfs(v);
size[u] += size[v];
}
}
int ask(int l, int r, int x, int y, int p) {
if (l == x && y == r) {
return tmax[p];
}
int mid = (l + r) >> ;
if (mid >= y) {
return ask(l, mid, x, y, tl);
} else if (mid + <= x) {
return ask(mid + , r, x, y, tr);
} else {
return max(ask(l, mid, x, mid, tl), ask(mid + , r, mid + , y, tr));
}
}
void update(int p) {
tmax[p] = max(tmax[tl], tmax[tr]);
}
void modify(int l, int r, const int &x, int p, const int &c) {
if (l == r) {
tmax[p] = c;
return;
}
int mid = (l + r) >> ;
if (mid >= x) {
modify(l, mid, x, tl, c);
} else {
modify(mid + , r, x, tr, c);
}
update(p);
}
void build(int l, int r, int p) {
if (l == r) {
tmax[p] = -;
return;
}
int mid = (l + r) >> ;
build(l, mid, tl);
build(mid + , r, tr);
update(p);
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
tot = Time = ;
scanf("%d %d", &n, &m);
for (int i = ; i <= n; i++) {
head[i] = -;
size[i] = ;
tid[i] = ;
}
a[] = (node){1e9, , };
for (int i = ; i <= n; i++) {
int fa, x, y;
scanf("%d %d %d", &fa, &x, &y);
x++,y++,fa++;
swap(x, y);
add(fa, i);
a[i] = (node){x, y, i};
to[y] = i;
}
dfs();
build(, n, );
sort(a + , a + + n, cmp);
int j = ;
for (int i = ; i <= n; i++) {
int x = a[i].id, t = ask(, n, tid[x], tid[x] + size[x] - , );
if (t == -) {
ans[x] = ;
} else {
ans[x] = to[t];
}
while (j + <= i && a[j + ].x > a[i + ].x) {
modify(, n, tid[a[j + ].id], , a[j + ].y);
j++;
}
}
while (m--) {
int x;
scanf("%d", &x);
printf("%d\n", ans[x + ] - );
}
}
return ;
}

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. maven pom.xml常用标签 Exclusions plugins是什么意思

    Exclusions maven的依赖(dependencies)有传递性,为了解决兼容性问题,就用exclusions来排除造成兼容性问题的依赖. 写法如下: 加入项目A依赖项目B,项目B依赖项目C ...

  2. 通过手机浏览器打开APP或者跳转到下载页面.md

    目录 通过手机浏览器打开APP或者跳转到下载页面 添加 schemes 网页设置 参考链接 通过手机浏览器打开APP或者跳转到下载页面 以下仅展示最简单的例子及关键代码 由于硬件条件有限,仅测试了 A ...

  3. https://blog.newrelic.com/2014/05/02/25-php-developers-follow-online/

    w https://blog.newrelic.com/2014/05/02/25-php-developers-follow-online/ 1. Rob Allen. Zend Framework ...

  4. 看用Tornado如何自定义实现表单验证

    我们知道,平时在登陆某个网站或软件时,网站对于你输入的内容是有要求的,并且会对你输入的错误内容有提示,对于Django这种大而全的web框架,是提供了form表单验证功能,但是对于Tornado而言, ...

  5. CNN结构

    神经网络 卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进.多了许多传统神经网络没有的层次. 卷积神经网络的层级结构 数据输入层/Input Layer 卷积计算 ...

  6. 维多利亚的秘密 golang入坑系列

    原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...

  7. 面向对象封装 classmethod和staticmethod方法

    接口类 接口类:是规范子类的一个模板,只要接口类中定义的,就应该在子类中实现接口类不能被实例化,它只能被继承支持多继承接口隔离原则:使用多个专门的接口,而不使用单一的总接口.即客户端不应该依赖那些不需 ...

  8. tomcat web工程 jar包冲突解决方法

    目前在部署工程时,遇到了一个问题,报错信息如下: See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet ...

  9. Leaflet API 翻译(一)

    摘自:http://jsrookie.iteye.com/blog/2318972 L.Map API各种类中的核心部分,用来在页面中创建地图并操纵地图. Constructor(构造器) 通过div ...

  10. hadoop14---centos 安装activemq

    创建activemq目录 [root@node1 ~]# mkdir -p /usr/local/activemq 狐火下载activemq,从用户/download目录把文件cp到/usr/loca ...