【 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 ...
随机推荐
- .Net程序员飞扬有用的85个工具
1.Visual Studio Visual Studio Productivity Power tool:Visual Studio专业版(及以上)的扩展,具有丰富的功能,如快速查找,导航解决方案, ...
- jq
1: http://jquery.cuishifeng.cn/index.html jquery 学习查询首页<br> 2: http://m.oschina.net/blog/75741 ...
- 组合suan
/// 求从数组a[1..n]中任选m个元素的所有组合. /// a[1..n]表示候选集,n为候选集大小,n>=m>0. /// b[1..M]用来存储当前组合中的元素(这里存储的是元素 ...
- WinForm开发框架【细化权限至操作按钮】
有不少园友经常问我程序有没有更新,真的很抱歉,最近因为工作原因一直很忙,导致程序有很长时间都没有更新了,首先在这里感谢关心俺的朋友们. 这几天好好看了一下原来的程序,还有很多地方需要改进,比如操作数据 ...
- iOS - SQLite 数据库存储
1.SQLite 数据库 SQLite 是一种轻型的嵌入式数据库,安卓和 iOS 开发使用的都是 SQLite 数据库.它占用资源非常低,在嵌入式设备中,可能需要几百 K 的内存数据就够了.他的处理速 ...
- hdu4449Building Design(三维凸包+平面旋转)
链接 看了几小时也没看懂代码表示的何意..无奈下来问问考研舍友. 还是考研舍友比较靠谱,分分钟解决了我的疑问. 可能三维的东西在纸面上真的不好表示,网上没有形象的题解,只有简单"明了&quo ...
- 真核转录组(denovo/resequencing)及案例分析
参考: 转录组文章的常规套路 文章解读:<Science>小麦转录组研究文章 转录组数据饱和度评估方法 Paper这个东西是多么的诱人,可以毕业,可以评职称,可以拿绩效. 现在的文章都是有 ...
- adb命令学习
录制屏幕操作Android4.4版本以上支持录制屏幕 adb shell screenrecord /sdcard/demo.mp4 ADB logcat 输出时间信息: adb logcat -v ...
- MySQL学习记录--生成时间日期数据
时间数据格式组件: 组件 定义 范围 YYYY 年份,包括世纪 1000~9999 MM 月份 01(January)~12(December) DD 日 01~31 HH 小时 00~23 HHH ...
- Maplace.js – 小巧实用的 jQuery 谷歌地图插件
Maplace.js是一个小的显示谷歌地图的 jQuery 插件,帮助你把谷歌地图嵌入到你的网站,快速在地图位置上创建标记和控制菜单.它需要 jQuery 和谷歌地图 API v3 支持,所以这两个都 ...