【 2013 Multi-University Training Contest 8 】
HDU 4678 Mine
对于每个空白区域,求SG值。
最后异或起来等于0,先手必败。
#pragma comment(linker,"/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#define MAXN 1010
#define oo 1234567890
int arr[MAXN][MAXN];
bool vis[MAXN][MAXN];
int n, m;
int dg, bk;
int sg[MAXN * MAXN][];
int go[][] = { { , }, { -, }, { , }, { , - }, { -, - },
{ -, }, { , - }, { , } };
bool isIn(int x, int y) {
return x >= && x < n && y >= && y < m;
}
int SG(int digit, int blank) {
if (sg[digit][blank] == -) {
int x, y;
x = y = -;
if (blank) {
x = SG(, );
}
if (digit) {
y = SG(digit - , blank);
}
for (int i = ;; i++) {
if (i != x && i != y) {
sg[digit][blank] = i;
break;
}
}
}
return sg[digit][blank];
}
void dfs(int x, int y) {
vis[x][y] = true;
if (arr[x][y] > ) {
dg++;
} else if (arr[x][y] == ) {
bk = ;
int nx, ny;
for (int i = ; i < ; i++) {
nx = x + go[i][];
ny = y + go[i][];
if (isIn(nx, ny) && !vis[nx][ny]) {
dfs(nx, ny);
}
}
}
}
int main() {
int T;
int ca = ;
int x, y;
int i, j, k;
int res;
memset(sg, -, sizeof(sg));
sg[][] = ;
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &n, &m, &k);
memset(arr, , sizeof(arr));
while (k--) {
scanf("%d%d", &x, &y);
arr[x][y] = -oo;
}
for (i = ; i < n; i++) {
for (j = ; j < m; j++) {
if (arr[i][j] < ) {
for (k = ; k < ; k++) {
x = i + go[k][];
y = j + go[k][];
if (isIn(x, y)) {
arr[x][y]++;
}
}
}
}
}
res = ;
memset(vis, false, sizeof(vis));
for (i = ; i < n; i++) {
for (j = ; j < m; j++) {
if (!vis[i][j] && arr[i][j] == ) {
dg = bk = ;
dfs(i, j);
res ^= SG(dg, bk);
}
}
}
for (i = ; i < n; i++) {
for (j = ; j < m; j++) {
if (!vis[i][j]) {
dg = bk = ;
dfs(i, j);
res ^= SG(dg, bk);
}
}
}
if (res) {
printf("Case #%d: Xiemao\n", ca++);
} else {
printf("Case #%d: Fanglaoshi\n", ca++);
}
}
return ;
}
HDU 4679 Terrorist’s destroy
dp[i][0]表示i为根的最长链。
dp[i][1]表示i为根的次长链。
dp[i][2]表示i为根的第三长链。
#pragma comment(linker,"/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 200010
#define oo 0x7FFFFFFF
using namespace std;
int first[MAXN], next[MAXN], v[MAXN], cost[MAXN], id[MAXN], e;
int dp[MAXN][];
bool vis[MAXN];
int res, idx;
void addEdge(int x, int y, int val, int idx) {
cost[e] = val;
id[e] = idx;
v[e] = y;
next[e] = first[x];
first[x] = e++;
}
void dfs(int x) {
vis[x] = true;
dp[x][] = dp[x][] = dp[x][] = ;
for (int i = first[x]; i != -; i = next[i]) {
int y = v[i];
if (!vis[y]) {
dfs(y);
if (dp[y][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[x][];
dp[x][] = dp[y][] + ;
} else if (dp[y][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[y][] + ;
} else if (dp[y][] + > dp[x][]) {
dp[x][] = dp[y][] + ;
}
}
}
}
void search(int x, int pre) {
int tmp;
vis[x] = true;
if (pre != -) {
if (dp[x][] + == dp[pre][]) {
if (dp[pre][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[x][];
dp[x][] = dp[pre][] + ;
} else if (dp[pre][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[pre][] + ;
} else if (dp[pre][] + > dp[x][]) {
dp[x][] = dp[pre][] + ;
}
} else {
if (dp[pre][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[x][];
dp[x][] = dp[pre][] + ;
} else if (dp[pre][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[pre][] + ;
} else if (dp[pre][] + > dp[x][]) {
dp[x][] = dp[pre][] + ;
}
}
}
for (int i = first[x]; i != -; i = next[i]) {
int y = v[i];
if (!vis[y]) {
if (dp[y][] + == dp[x][]) {
tmp = dp[x][] + dp[x][];
} else {
tmp = dp[x][];
if (dp[y][] + == dp[x][]) {
tmp += dp[x][];
} else {
tmp += dp[x][];
}
}
tmp = cost[i] * max(dp[y][] + dp[y][], tmp);
if (tmp < res) {
res = tmp;
idx = id[i];
} else if (tmp == res && idx > id[i]) {
idx = id[i];
}
search(y, x);
}
}
}
int main() {
int T;
int ca = ;
int n;
int i;
int x, y, val;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
e = ;
memset(first, -, sizeof(first));
for (i = ; i < n; i++) {
scanf("%d%d%d", &x, &y, &val);
addEdge(x, y, val, i);
addEdge(y, x, val, i);
}
res = oo;
memset(vis, false, sizeof(vis));
dfs();
memset(vis, false, sizeof(vis));
search(, -);
printf("Case #%d: %d\n", ca++, idx);
}
return ;
}
HDU 4681 String
分别枚举D在A和B中的起点,可以暴力得到最短终点。
枚举任意两个起点与终点,通过dp可以求得两端的LCS。
#include<cstdio>
#include<cstring>
#include<vector>
#define MAXN 1010
using namespace std;
char a[MAXN], b[MAXN], c[MAXN];
vector<pair<int, int> > p1, p2;
int f[MAXN][MAXN], g[MAXN][MAXN];
void cal(char a[], char c[], vector<pair<int, int> >&p) {
int i, j, k;
int la = strlen(a + );
int lc = strlen(c + );
p.clear();
for (i = ; i <= la; i++) {
k = ;
if (a[i] != c[k]) {
continue;
}
for (j = i; j <= la; j++) {
if (a[j] == c[k]) {
k++;
}
if (k > lc) {
break;
}
}
if (k > lc) {
p.push_back(make_pair(i, j));
}
}
}
int main() {
int T;
int ca = ;
int ans;
int i, j;
int la, lb, lc;
scanf("%d", &T);
while (T--) {
scanf(" %s %s %s", a + , b + , c + );
la = strlen(a + );
lb = strlen(b + );
lc = strlen(c + );
cal(a, c, p1);
cal(b, c, p2);
ans = ;
if (!(p1.empty() || p2.empty())) {
memset(f, , sizeof(f));
memset(g, , sizeof(g));
for (i = ; i <= la; i++) {
for (j = ; j <= lb; j++) {
if (a[i] == b[j]) {
f[i][j] = f[i - ][j - ] + ;
} else {
f[i][j] = max(f[i - ][j], f[i][j - ]);
}
}
}
for (i = la; i > ; i--) {
for (j = lb; j > ; j--) {
if (a[i] == b[j]) {
g[i][j] = g[i + ][j + ] + ;
} else {
g[i][j] = max(g[i + ][j], g[i][j + ]);
}
}
}
for (i = ; i < (int) p1.size(); i++) {
for (j = ; j < (int) p2.size(); j++) {
ans = max(ans,
lc + f[p1[i].first - ][p2[j].first - ]
+ g[p1[i].second + ][p2[j].second + ]);
}
}
}
printf("Case #%d: %d\n", ca++, ans);
}
return ;
}
【 2013 Multi-University Training Contest 8 】的更多相关文章
- 【 2013 Multi-University Training Contest 7 】
HDU 4666 Hyperspace 曼哈顿距离:|x1-x2|+|y1-y2|. 最远曼哈顿距离,枚举x1与x2的关系以及y1与y2的关系,取最大值就是答案. #include<cstdio ...
- 【 2013 Multi-University Training Contest 6 】
HDU 4655 Cut Pieces 假设n个数构成的总数都分成了n段,总数是n*a1*a2*...*an.但是答案显然不会那么多. 对于相邻的两个ai,ai+1,如果选择相同的颜色,那么就减少了a ...
- 【 2013 Multi-University Training Contest 5 】
HDU 4647 Another Graph Game 如果没有边的作用,显然轮流拿当前的最大值即可. 加上边的作用,将边权平均分给两个点,如果一个人选走一条边的两个点,就获得了边的权值:如果分别被两 ...
- 【 2013 Multi-University Training Contest 4 】
HDU 4632 Palindrome subsequence dp[x][y]表示区间[x,y]构成回文串的方案数. 若str[x]==str[y],dp[x][y]=dp[x+1][y]+dp[x ...
- 【 2013 Multi-University Training Contest 3 】
HDU 4622 Reincarnation 枚举字符串的起点,构造后缀自动机,每次插入一个字符,就能统计得到当前不同字串的个数,预处理出所有的询问. #include<cstdio> # ...
- 【 2013 Multi-University Training Contest 2 】
HDU 4611 Balls Rearrangement 令lcm=LCM(a,b),gcd=GCD(a,b).cal(n,a,b)表示sum(abs(i%a-i%b)),0<=i<n. ...
- 【 2013 Multi-University Training Contest 1 】
HDU 4602 Partition f[i]表示和为i的方案数.已知f[i]=2i-1. dp[i]表示和为i,k有多少个.那么dp[i]=dp[1]+dp[2]+...+dp[i-1]+f[i-k ...
- 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump
多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...
- 【2018 Multi-University Training Contest 5】
01: 02:https://www.cnblogs.com/myx12345/p/9436953.html 03: 04: 05:https://www.cnblogs.com/myx12345/p ...
随机推荐
- 设计一个泛型类Collection
要求:设计一个泛型类Collection,它存储object对象的集合(在数组中),以及该集合当前的大小.提供public方法isEmtpy,makeEmpty,insert,remove,isPre ...
- 图解说明——究竟什么是Windows句柄
图解说明——究竟什么是Windows句柄 参考资料:http://blog.csdn.net/newjerryj/article/details/4383701 http://www.cnblogs. ...
- Oracle建表
1.oracle数据库中的多种数据结构: 1.表结构 存储数据 2.视图 一张表或多张表中数据的字节 3.sequence 主要用来生成主键值 4.index 提高检索性能 我们 ...
- boldSystemFontOfSize 和 systemFontOfSize 的区别
使用 UIFont 的下列方法: + systemFontOfSize + boldSystemFontOfSize + italicSystemFontOfSize p.p1 { margin: 0 ...
- Mifare系列7-安全性(转)
文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38087245 飞利浦的MIFARE卡 由于它的高安全性在市场上得到广泛应用,比如 ...
- 【C语言训练】尼科彻斯定理
题目描述验证尼科彻斯定理,即:任何一个正整数的立方都可以写成一串连续奇数的和. 输入任一正整数 输出该数的立方分解为一串连续奇数的和 样例输入13样例输出13*13*13=2197=157+159+1 ...
- React之JSX
0.对于学习React,我们先来熟悉下JSX的语法, 下面的这些语法仅用于构建一个组件的标签模块,定义完成之后如果需要做演示,请附加以下代码: ReactDOM.render( element1, d ...
- Echarts_1:水平柱体
Echarts:http://echarts.baidu.com/index.html 这下面是我自己总结的一些配置注释,分享~ 效果图: 小白小白小白小白小白小白小白小白小白小白小白小白小白小白小白 ...
- a标签的作用
a标签的hover,active,target,visited等伪类在所有浏览器中是兼容的,而其他元素的这些伪类并不全兼容: a标签本身是跳转页面的,把跳转的地址写在href这个属性中, (1)不 ...
- 个人博客作业week7
个人阅读作业week7 一.瀑布 软件工程的瀑布模型是1970年由Winston Royce提出来的,即软件的开发按照一个严格的.顺序的.单次的瀑布流开发周期.例如需求分析阶段.概要设计阶段.详细设计 ...