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,…
HDU 4666 Hyperspace 曼哈顿距离:|x1-x2|+|y1-y2|. 最远曼哈顿距离,枚举x1与x2的关系以及y1与y2的关系,取最大值就是答案. #include<cstdio> #include<set> #define oo 0x7FFFFFFF #define MAXM 35 #define MAXN 100010 using namespace std; multiset<int> myset[MAXM]; struct Ask { int c…
HDU 4655 Cut Pieces 假设n个数构成的总数都分成了n段,总数是n*a1*a2*...*an.但是答案显然不会那么多. 对于相邻的两个ai,ai+1,如果选择相同的颜色,那么就减少了a1*a2*...*ai-1*min(ai,ai+1)*ai+2*ai+3*...*an. 不妨假设n=3,三个数分别是a,b,c.且a<b<c. 对于所有的排列,只有a,c,b是最优的,结果是3*a*b*c-a*b-b. 当n>3的时候同样可以得到结论:a1,an,a2,an-1...使得总…
HDU 4647 Another Graph Game 如果没有边的作用,显然轮流拿当前的最大值即可. 加上边的作用,将边权平均分给两个点,如果一个人选走一条边的两个点,就获得了边的权值:如果分别被两个人拿走,两人的差值不变. 将边权平均分配给点,对点的权值排序轮流选择. #include<cstdio> #include<algorithm> #include<iostream> #define MAXN 100010 #define EPS 1e-8 typedef…
HDU 4632 Palindrome subsequence dp[x][y]表示区间[x,y]构成回文串的方案数. 若str[x]==str[y],dp[x][y]=dp[x+1][y]+dp[x][y-1]-dp[x+1][y-1]+(dp[x+1][y-1]+1)=dp[x+1][y]+dp[x][y-1]+1. 若str[x]!=str[y],dp[x][y]=dp[x+1][y]+dp[x][y-1]-dp[x+1][y-1]. #include<cstdio> #include&…
HDU 4622 Reincarnation 枚举字符串的起点,构造后缀自动机,每次插入一个字符,就能统计得到当前不同字串的个数,预处理出所有的询问. #include<cstdio> #include<cstring> #define MAXN 2010 #define MAXM 26 int res[MAXN][MAXN]; char str[MAXN]; struct node { node *next[MAXM]; node *pre; int step; int tot;…
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. 显然,答案就是cal(lcm,a,b)*(n/lcm)+cal(n%lcm,a,b). cal(n,a,b)可以通过暴力得到,即对i%a和i%b的值分段,连续的一段(遇到0终止)可以直接得到值. 因此,每段的长度将直接影响到时间复杂度. 当lcm较小时,cal中的n不会很大,即使每段长度很小也无所谓. 当lc…
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]. 考虑与f有关的项: f[n-k]是答案的一部分,即2n-k-1是答案的一部分. 把与dp有关的项: 令s[i-1]=dp[1]+dp[2]+...+dp[i-1],那么s[n-1]是答案的一部分. s[i]=s[i-1]+dp[i],又dp[i]=s[i-1]+f[i-k].推出s[i]=2*…
多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作,你能够选择一个出发点向下或向右Jump.跳的花费是|x1-x2|+|y1-y2|-1的能量 .假设你跳的这两个位置上数字同样,那么你就会获得数字表示的能量值. 对于每一次操作,你能够这样跳随意次 ,可是每一个位置仅仅能经过一次在这K次操作中. 初始能量值是0,当操作完毕后,假设n*m个方格没有都经过…
01: 02:https://www.cnblogs.com/myx12345/p/9436953.html 03: 04: 05:https://www.cnblogs.com/myx12345/p/9435543.html 06: 07: 08: 09: 10: 11: 12:…