【 2013 Multi-University Training Contest 8 】
HDU 4678 Mine
对于每个空白区域,求SG值。
最后异或起来等于0,先手必败。
1 #pragma comment(linker,"/STACK:102400000,102400000") 2 #include<cstdio> 3 #include<cstring> 4 #define MAXN 1010 5 #define oo 1234567890 6 int arr[MAXN][MAXN]; 7 bool vis[MAXN][MAXN]; 8 int n, m; 9 int dg, bk; 10 int sg[MAXN * MAXN][2]; 11 int go[8][2] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 }, { -1, -1 }, 12 { -1, 1 }, { 1, -1 }, { 1, 1 } }; 13 bool isIn(int x, int y) { 14 return x >= 0 && x < n && y >= 0 && y < m; 15 } 16 int SG(int digit, int blank) { 17 if (sg[digit][blank] == -1) { 18 int x, y; 19 x = y = -1; 20 if (blank) { 21 x = SG(0, 0); 22 } 23 if (digit) { 24 y = SG(digit - 1, blank); 25 } 26 for (int i = 0;; i++) { 27 if (i != x && i != y) { 28 sg[digit][blank] = i; 29 break; 30 } 31 } 32 } 33 return sg[digit][blank]; 34 } 35 void dfs(int x, int y) { 36 vis[x][y] = true; 37 if (arr[x][y] > 0) { 38 dg++; 39 } else if (arr[x][y] == 0) { 40 bk = 1; 41 int nx, ny; 42 for (int i = 0; i < 8; i++) { 43 nx = x + go[i][0]; 44 ny = y + go[i][1]; 45 if (isIn(nx, ny) && !vis[nx][ny]) { 46 dfs(nx, ny); 47 } 48 } 49 } 50 } 51 int main() { 52 int T; 53 int ca = 1; 54 int x, y; 55 int i, j, k; 56 int res; 57 memset(sg, -1, sizeof(sg)); 58 sg[0][0] = 0; 59 scanf("%d", &T); 60 while (T--) { 61 scanf("%d%d%d", &n, &m, &k); 62 memset(arr, 0, sizeof(arr)); 63 while (k--) { 64 scanf("%d%d", &x, &y); 65 arr[x][y] = -oo; 66 } 67 for (i = 0; i < n; i++) { 68 for (j = 0; j < m; j++) { 69 if (arr[i][j] < 0) { 70 for (k = 0; k < 8; k++) { 71 x = i + go[k][0]; 72 y = j + go[k][1]; 73 if (isIn(x, y)) { 74 arr[x][y]++; 75 } 76 } 77 } 78 } 79 } 80 res = 0; 81 memset(vis, false, sizeof(vis)); 82 for (i = 0; i < n; i++) { 83 for (j = 0; j < m; j++) { 84 if (!vis[i][j] && arr[i][j] == 0) { 85 dg = bk = 0; 86 dfs(i, j); 87 res ^= SG(dg, bk); 88 } 89 } 90 } 91 for (i = 0; i < n; i++) { 92 for (j = 0; j < m; j++) { 93 if (!vis[i][j]) { 94 dg = bk = 0; 95 dfs(i, j); 96 res ^= SG(dg, bk); 97 } 98 } 99 } 100 if (res) { 101 printf("Case #%d: Xiemao\n", ca++); 102 } else { 103 printf("Case #%d: Fanglaoshi\n", ca++); 104 } 105 } 106 return 0; 107 }
View Code
HDU 4679 Terrorist’s destroy
dp[i][0]表示i为根的最长链。
dp[i][1]表示i为根的次长链。
dp[i][2]表示i为根的第三长链。
1 #pragma comment(linker,"/STACK:102400000,102400000") 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define MAXN 200010 6 #define oo 0x7FFFFFFF 7 using namespace std; 8 int first[MAXN], next[MAXN], v[MAXN], cost[MAXN], id[MAXN], e; 9 int dp[MAXN][3]; 10 bool vis[MAXN]; 11 int res, idx; 12 void addEdge(int x, int y, int val, int idx) { 13 cost[e] = val; 14 id[e] = idx; 15 v[e] = y; 16 next[e] = first[x]; 17 first[x] = e++; 18 } 19 void dfs(int x) { 20 vis[x] = true; 21 dp[x][0] = dp[x][1] = dp[x][2] = 0; 22 for (int i = first[x]; i != -1; i = next[i]) { 23 int y = v[i]; 24 if (!vis[y]) { 25 dfs(y); 26 if (dp[y][0] + 1 >= dp[x][0]) { 27 dp[x][2] = dp[x][1]; 28 dp[x][1] = dp[x][0]; 29 dp[x][0] = dp[y][0] + 1; 30 } else if (dp[y][0] + 1 >= dp[x][1]) { 31 dp[x][2] = dp[x][1]; 32 dp[x][1] = dp[y][0] + 1; 33 } else if (dp[y][0] + 1 > dp[x][2]) { 34 dp[x][2] = dp[y][0] + 1; 35 } 36 } 37 } 38 } 39 void search(int x, int pre) { 40 int tmp; 41 vis[x] = true; 42 if (pre != -1) { 43 if (dp[x][0] + 1 == dp[pre][0]) { 44 if (dp[pre][1] + 1 >= dp[x][0]) { 45 dp[x][2] = dp[x][1]; 46 dp[x][1] = dp[x][0]; 47 dp[x][0] = dp[pre][1] + 1; 48 } else if (dp[pre][1] + 1 >= dp[x][1]) { 49 dp[x][2] = dp[x][1]; 50 dp[x][1] = dp[pre][1] + 1; 51 } else if (dp[pre][1] + 1 > dp[x][2]) { 52 dp[x][2] = dp[pre][1] + 1; 53 } 54 } else { 55 if (dp[pre][0] + 1 >= dp[x][0]) { 56 dp[x][2] = dp[x][1]; 57 dp[x][1] = dp[x][0]; 58 dp[x][0] = dp[pre][0] + 1; 59 } else if (dp[pre][0] + 1 >= dp[x][1]) { 60 dp[x][2] = dp[x][1]; 61 dp[x][1] = dp[pre][0] + 1; 62 } else if (dp[pre][0] + 1 > dp[x][2]) { 63 dp[x][2] = dp[pre][0] + 1; 64 } 65 } 66 } 67 for (int i = first[x]; i != -1; i = next[i]) { 68 int y = v[i]; 69 if (!vis[y]) { 70 if (dp[y][0] + 1 == dp[x][0]) { 71 tmp = dp[x][1] + dp[x][2]; 72 } else { 73 tmp = dp[x][0]; 74 if (dp[y][0] + 1 == dp[x][1]) { 75 tmp += dp[x][2]; 76 } else { 77 tmp += dp[x][1]; 78 } 79 } 80 tmp = cost[i] * max(dp[y][0] + dp[y][1], tmp); 81 if (tmp < res) { 82 res = tmp; 83 idx = id[i]; 84 } else if (tmp == res && idx > id[i]) { 85 idx = id[i]; 86 } 87 search(y, x); 88 } 89 } 90 } 91 int main() { 92 int T; 93 int ca = 1; 94 int n; 95 int i; 96 int x, y, val; 97 scanf("%d", &T); 98 while (T--) { 99 scanf("%d", &n); 100 e = 0; 101 memset(first, -1, sizeof(first)); 102 for (i = 1; i < n; i++) { 103 scanf("%d%d%d", &x, &y, &val); 104 addEdge(x, y, val, i); 105 addEdge(y, x, val, i); 106 } 107 res = oo; 108 memset(vis, false, sizeof(vis)); 109 dfs(1); 110 memset(vis, false, sizeof(vis)); 111 search(1, -1); 112 printf("Case #%d: %d\n", ca++, idx); 113 } 114 return 0; 115 }
View Code
HDU 4681 String
分别枚举D在A和B中的起点,可以暴力得到最短终点。
枚举任意两个起点与终点,通过dp可以求得两端的LCS。
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #define MAXN 1010 5 using namespace std; 6 char a[MAXN], b[MAXN], c[MAXN]; 7 vector<pair<int, int> > p1, p2; 8 int f[MAXN][MAXN], g[MAXN][MAXN]; 9 void cal(char a[], char c[], vector<pair<int, int> >&p) { 10 int i, j, k; 11 int la = strlen(a + 1); 12 int lc = strlen(c + 1); 13 p.clear(); 14 for (i = 1; i <= la; i++) { 15 k = 1; 16 if (a[i] != c[k]) { 17 continue; 18 } 19 for (j = i; j <= la; j++) { 20 if (a[j] == c[k]) { 21 k++; 22 } 23 if (k > lc) { 24 break; 25 } 26 } 27 if (k > lc) { 28 p.push_back(make_pair(i, j)); 29 } 30 } 31 } 32 int main() { 33 int T; 34 int ca = 1; 35 int ans; 36 int i, j; 37 int la, lb, lc; 38 scanf("%d", &T); 39 while (T--) { 40 scanf(" %s %s %s", a + 1, b + 1, c + 1); 41 la = strlen(a + 1); 42 lb = strlen(b + 1); 43 lc = strlen(c + 1); 44 cal(a, c, p1); 45 cal(b, c, p2); 46 ans = 0; 47 if (!(p1.empty() || p2.empty())) { 48 memset(f, 0, sizeof(f)); 49 memset(g, 0, sizeof(g)); 50 for (i = 1; i <= la; i++) { 51 for (j = 1; j <= lb; j++) { 52 if (a[i] == b[j]) { 53 f[i][j] = f[i - 1][j - 1] + 1; 54 } else { 55 f[i][j] = max(f[i - 1][j], f[i][j - 1]); 56 } 57 } 58 } 59 for (i = la; i > 0; i--) { 60 for (j = lb; j > 0; j--) { 61 if (a[i] == b[j]) { 62 g[i][j] = g[i + 1][j + 1] + 1; 63 } else { 64 g[i][j] = max(g[i + 1][j], g[i][j + 1]); 65 } 66 } 67 } 68 for (i = 0; i < (int) p1.size(); i++) { 69 for (j = 0; j < (int) p2.size(); j++) { 70 ans = max(ans, 71 lc + f[p1[i].first - 1][p2[j].first - 1] 72 + g[p1[i].second + 1][p2[j].second + 1]); 73 } 74 } 75 } 76 printf("Case #%d: %d\n", ca++, ans); 77 } 78 return 0; 79 }
View Code
转载于:https://www.cnblogs.com/DrunBee/p/3260363.html
【 2013 Multi-University Training Contest 8 】相关推荐
- Fibonacci Sum HDU - 6755【2020 Multi-University Training Contest 1】斐波那契数列变形+二项式定理
[杭电多校2020]Distinct Sub-palindromes 分析: 题目: The Fibonacci numbers are defined as below: Given three i ...
- hdu6681 Rikka with Cake【线段树】【离散化】【2019 Multi-University Training Contest 9】
题意: 在一个封闭的n*m的矩形内,有k条射线,有四个方向,上下左右,射线,射线的端点不重合,该矩形内有多少个封闭的区域 1≤n,m≤1e9,1≤k≤1e51\le n,m \le 1e9 ,1\le ...
- 【2013年04月18号】
每一次,遇到让人难受的事情,我基本都会选择逃避,像个鸵鸟,想就这样像什么都没发生一样去过生活.想想如果能瞒自己一生,也很好,无影无踪,真像徐志摩说的,悄悄的来去,不带一片云彩.这个世界,看的越多,越矛 ...
- 【2013年11月12号】日记
1 /* 一个数如果恰好等于它的因子之和, 则这个数称为"完数". 编写程序写出1000以内的完数: 2 我一开始错误的程序*/ 3 #include <stdio.h> ...
- 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6324 Problem F. Grab The Tree Time Limit: 2000/1000 MS ...
- 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...
- 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】
蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载[2013年(第4届)~2021年(第12届)] 百度网盘-CSDN蓝桥杯资料(真题PDF+其它资料) 提取码:6666 2013年 ...
- QIPAIFANS网站程序【2013最新版】
QIPAIFANS网站程序[2013最新版]今天的但是人类的qipaifans,既不利于当时生产力的发展,我暗暗到下了决心,在作文大全网上发表了七篇文章,冰儿,我不能这样的对待他们,这两个案例为鲁仲连 ...
- 【2013水王争霸赛】啊!
[2013水王争霸赛]啊! 时间限制 : 10000 MS 空间限制 : 65536 KB 问题描述 Ciocio很粗鲁,经常在做题遇到困难时爆粗口,这让何老板很是恼火. 于是何老板制定了一个规定 ...
最新文章
- win8.1怎么安装iis
- 高糊视频秒变4K,速度比TecoGAN快了9倍!东南大学提出新的视频超分辨率系统
- 常见的安全应用识别技术有哪些?
- Visualization Document Feb 12 16:42
- Spring注解原理学习之@Size and @Pattern
- 趣头条确认总编辑肖厚君离职:对现有业务没有任何影响
- 魔兽世界python脚本拍卖行_Python大法之告别脚本小子系列—信息资产收集类脚本编写(上)...
- 我的装机软件清单-备忘
- 2017年10月21日23:43:02
- [saiku] 将saiku自带的H2嵌入式数据库迁移到本地mysql数据库
- 关于字体的一些知识,以及分享一些免费可商用字体
- 【前端 教程】详解 立即执行函数
- windows下ping端口
- opencv切割视频:把长视频切割成固定时间的短视频
- [瞎搞]Lucas定理证明
- 微软Windows商店会变得更像Steam ,Xbox可自由安装PC游戏
- Docker Docker Habor一个比Register更加好用的仓库
- K8S taint(污点)和tolerations(污点容忍)
- lisp 非对称缓和曲线_利用AutoLISP语言绘制带缓和曲线的铁路曲线平面图
- Imperva是什么
热门文章
- java 注解妙用_框架开发之Java注解的妙用
- java set 取第一个_set集合取第一个元素的几种方法
- linux+npm+v+报错_linux – npm install会导致像npm ERR这样的错误...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
- python怎么把cpu占满_如何增加python CPU使用率
- jTable保存到mysql_怎么把从数据库里的数据输到JTABLE里面
- 【普及组模拟赛】作业
- python word 表格 框线_python设置表格边框的具体方法
- day02.3-元组内置方法
- C# viewstate