BestCoder Round #74 (div.2)
组合 1001 LCP Array
第一题就小难,出题的好像是浙大的大牛?
找到一个规律:a[i] = x, s[i..i+x]都想同。a[i] = a[i+1] + 1 (a[i] > 0),否则就是与后一个颜色不同,方案*25。第一次颜色相同的26种方案。
#include <bits/stdc++.h> typedef long long ll;
const int N = 1e5 + 5;
const int MOD = 1e9 + 7;
int a[N]; int main() {
int T; scanf ("%d", &T);
while (T--) {
int n; scanf ("%d", &n);
for (int i=1; i<n; ++i) {
scanf ("%d", a+i);
}
a[n] = 0;
int ans = 26;
for (int i=n-1; i>=1; --i) {
if (a[i] == 0) {
ans = 1ll * ans * 25 % MOD;
} else if (a[i] != a[i+1] + 1) {
ans = 0;
break;
}
}
printf ("%d\n", ans);
} return 0;
}
最短路 1002 Shortest Path
多加了3条边,6个点分别看成起点跑SPFA,然后原来的距离是abs (u - v),取最小值
#include <bits/stdc++.h> const int N = 1e5 + 5;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int a[6], d[6][N], z[N];
bool vis[N];
std::vector<int> G[N];
int n, m; void add_edge(int u, int v) {
G[u].push_back (v);
G[v].push_back (u);
} void SPFA(int k, int s) {
memset (d[k], INF, sizeof (d[k]));
memset (vis, false, sizeof (vis));
d[k][s] = 0; vis[s] = true;
std::queue<int> que; que.push (s);
while (!que.empty ()) {
int u = que.front (); que.pop ();
for (auto v: G[u]) {
if (vis[v]) continue;
d[k][v] = d[k][u] + 1;
vis[v] = true;
que.push (v);
}
}
} int main() {
int T; scanf ("%d", &T);
while (T--) {
scanf ("%d%d", &n, &m);
for (int i=1; i<=n; ++i) {
G[i].clear ();
}
for (int i=1; i<n; ++i) {
add_edge (i, i+1);
}
for (int i=0; i<3; ++i) {
int u, v; scanf ("%d%d", &u, &v);
add_edge (u, v);
a[i*2] = u; a[i*2+1] = v;
}
for (int i=0; i<6; ++i) {
SPFA (i, a[i]);
}
for (int i=0; i<m; ++i) {
int u, v; scanf ("%d%d", &u, &v);
if (u > v) std::swap (u, v);
int &best = z[i];
best = v - u;
for (int i=0; i<6; ++i) {
best = std::min (best, d[i][u] + d[i][v]);
}
}
int ans = 0;
for (int i=0; i<m; ++i) {
ans = (ans + 1ll * (i + 1) * z[i]) % MOD;
}
printf ("%d\n", ans);
} return 0;
}
二进制 + BFS 1003 Transform
s -> t = s ^ t = x,所以要预处理出0到x的最小步骤,翻转某一位可以转换为^ (1<<i)
#include <bits/stdc++.h> const int N = 30;
const int MAX = (1 << 17);
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int a[N], d[MAX];
bool vis[N];
int n, m; void BFS(int s) {
std::queue<int> que; que.push (s);
memset (d, INF, sizeof (d)); d[s] = 0;
while (!que.empty ()) {
int x = que.front (); que.pop ();
for (int i=1; i<=n; ++i) {
int y = x ^ a[i];
if (y > MAX) break;
if (d[y] < INF) continue;
d[y] = d[x] + 1;
que.push (y);
}
}
} int main() {
int T; scanf ("%d", &T);
while (T--) {
scanf ("%d%d", &n, &m);
a[0] = 0;
for (int i=1; i<=n; ++i) {
scanf ("%d", a+i);
}
int k = 0;
for (int k=0; k<100; ++k) {
int x = 1 << k;
if (x > MAX) break;
a[++n] = x;
}
BFS (0);
int ans = 0;
for (int i=0; i<m; ++i) {
int s, t; scanf ("%d%d", &s, &t);
int q = s ^ t;
ans = (ans + 1ll * (i + 1) * d[q]) % MOD;
}
printf ("%d\n", ans);
} return 0;
}
1004 Toposort
待补
BestCoder Round #74 (div.2)的更多相关文章
- hdu5635 BestCoder Round #74 (div.2)
LCP Array Accepts: 131 Submissions: 1352 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 13 ...
- hdu 5636 搜索 BestCoder Round #74 (div.2)
Shortest Path Accepts: 40 Submissions: 610 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: ...
- hdu 5637 BestCoder Round #74 (div.2)
Transform Accepts: 7 Submissions: 49 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072 ...
- BestCoder Round #74 (div.1) 1002Shortest Path(hdoj5636)
哈哈哈哈,我就知道这道题目再扔给我,我还是不会,就是这么菜,哈哈哈 一开始官方题解就没搞懂-然后就看了一下别人的代码,水水过就算了.今天拿到-GG: 题意: 一开始,有一张原图,有一条长度为n的链. ...
- HDU5638 / BestCoder Round #74 (div.1) 1003 Toposort 线段树+拓扑排序
Toposort 问题描述 给出nn个点mm条边的有向无环图. 要求删掉恰好kk条边使得字典序最小的拓扑序列尽可能小. 输入描述 输入包含多组数据. 第一行有一个整数TT, 表示测试数据组数. 对 ...
- hdu5634 BestCoder Round #73 (div.1)
Rikka with Phi Accepts: 5 Submissions: 66 Time Limit: 16000/8000 MS (Java/Others) Memory Limit: ...
- BestCoder Round #69 (div.2) Baby Ming and Weight lifting(hdu 5610)
Baby Ming and Weight lifting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- BestCoder Round #68 (div.2) tree(hdu 5606)
tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- BestCoder Round #11 (Div. 2) 题解
HDOJ5054 Alice and Bob Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
随机推荐
- .net在当前日期的基础上加一天
比如今天是:2015-11-10 18:57:01,在这个基础上加一天,那么就是2015-11-11 18:57:01,代码如下: DateTime now_dt = DateTime.Now; ). ...
- Jquery表单序列化和AJAX全局事件
Jquery表单序列化 1.必须放在form标签内: 2.控件必须有name属性: 3.控件的value值会提交到服务器: 如: <form id="form1"> & ...
- Java之POJO
转: POJO 一:什么是POJOPOJO的名称有多种,pure old java object .plain ordinary java object 等.按照Martin Fowler的解释 ...
- 手机的ROM,RAM是各自存放什么?所谓“运行内存”和“机身内存”究竟有什么区别?
手机的内存分为运行内存(RAM)和非运行内存(也叫机身内存.储存空间.ROM) 1.手机的内存,分为存储内存和运行内存,相当于电脑的硬盘和内存条.2.存储内存分为机身内存和存储卡.3.rom是存储内存 ...
- Pyqt phonon的使用
本文是用Pyqt实现了下网上一个Qt版大牛关于phonon的介绍 Qt phonon地址:http://wenku.baidu.com/link?url=nH_dZ8lZbXHy8N5__8jAWLX ...
- python中的monkey-patching
这个技巧我很少用过. 但知道无防. 在运行时改变函数或类的行为, 一般用猴子补丁,原类,装饰器都可以实现. #!/usr/bin/env python # -*- coding: utf-8 -*- ...
- 用Node.js开发Windows 10物联网应用
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 未来10年内,物联网将会如移动互联网这样深入到我们生活的各方各面.所以微软现在对物联网进行了 ...
- Tips for OpenMesh
OpenMesh 求两点之间的距离 MyMesh::Point p1(1,2,3); MyMesh::Point p2(1,2,5); double d=(p1-p2).length();
- Eclipse+CDT+GDB调试android NDK程序(转)
Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for ja ...
- ontouchstart
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta cont ...