摘要:
(1)飞行员配对方案问题:二分图最大匹配。思路:略。View Code 1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 1010 4 int cx[MAXN], cy[MAXN]; 5 int first[MAXN], next[MAXN], v[MAXN], e; 6 bool vis[MAXN]; 7 inline void addEdge(int x, int y) { 8 v[e] = y; 9 next[e] = first[x];10 first[x] = e++;11 }12 int path(. 阅读全文
摘要:
0、BFS将无根树转化为有根树。1、bef[x]=y。表示x的父亲是y。这样建树构成了一片森林。2、Access(x)。表示以x为起点,一直到根节点,构造出一条链。这条链用splay维护,可以很好的支持插入和删除操作。这条链只有根节点与原树有联系。3、Splay(x)。同伸展树,用于维护提取出的链。通过splay操作,使得均摊logn。4、MakeRoot(x)。表示把x节点设为根。一棵树根的变化,仅与x到根的路径有关,即把路径反向即可。因此相当于把x到根的链翻转,bef构成的森林不变。A、操作1:link,操作2:cut。【HDU】2475 BoxB、路径中单点更新/成段更新/查询。(其实这 阅读全文
摘要:
伸展树是一枚二叉树,可以维护一个数列,或者可以作为二叉搜索树,因为无论怎么旋转,它的中序遍历是不变的。1、伸展操作。Splay(x,goal):旋转结点x,使它成为结点goal的儿子。至于旋转,本质上只有左旋和右旋。2、插入。如果作为二叉搜索树,则插入与二叉搜索树一样,最后把该结点旋转到根。如果用于维护一个数列,要求在x位置之前插入val(val可以为一个数字或一个序列),则将第x-1个结点旋转到根,将第x个结点旋转到第x-1个结点的儿子,那么根据中序遍历,val应插入在第x个结点的左儿子。3、删除。与插入同理。4、Select(k)。在二叉搜索树中,对每个结点维护一个num值,如果x左儿子的 阅读全文
摘要:
给出n个单词,再给出一段包含m个字符的文章,找出有多少个单词在文章里出现过。1、对n个单词构造字典树。2、构造失败指针。设当前节点为X,失败指针指向Y。1。若当前节点X没有儿子t,则X的儿子t等价于Y的儿子t。2。若当前节点X有儿子t,t的失败指针指向Y的儿子t。Y与X有最长公共后缀。3、模式匹配。沿着next指针遍历。例:4个单词:0101、1011、1100、0010。在构造完失败指针后,顺便完善next指针,使得匹配时只需沿着next指针遍历,匹配时沿着fail指针遍历是为了统计出当前串包含的子串。模板题:【HDU】2222 Keywords Search【HDU】2896 病毒侵袭【H 阅读全文
摘要:
1、精确覆盖。View Code 1 #include<cstdio> 2 #define INF 0x7FFFFFFF 3 #define MAXN 1000010 4 int n, m, size; 5 int L[MAXN], R[MAXN], U[MAXN], D[MAXN], H[MAXN]; 6 int S[MAXN], C[MAXN], X[MAXN], Q[MAXN]; 7 void Init() 8 { 9 int i;10 for (i = 0; i <= m; i++)11 {12 S[i] = 0;13 L[i ... 阅读全文
摘要:
1、基本定义。子串:字符串S的子串r[i...j]。后缀:以i开始的后缀表示为Suffix(i)。大小比较:按字典序。后缀数组:SA是一个一维数组。将S的后缀从小到大排序后,后缀的开头位置顺次放入SA。(SA[i]=j:排在第i个的是Suffix(j))名词数组:Rank[i]是Suffix(i)在后缀中从小到大排列的名次。(Rank[i]=j:Suffix(i)排在第j个)后缀数组和名次数组为互逆运算:设Rank[i]=j,则SA[j]=i。2、倍增算法。目的:设字符串长度为n,在O(nlog2n)求出SA数组和Rank数组。 1 int wa[MAXN],wb[MAXN],wv[MAXN] 阅读全文
摘要:
1、单点更新。【HDU】1166 敌兵布阵【HDU】1754 I Hate It【POJ】3264 Balanced Lineup【HDU】3074 Multiply game【POJ】2352 Stars【HDU】1394 Minimum Inversion Number【HDU】2795 Billboard【HDU】4046 Panda【POJ】2828 Buy Tickets【ZOJ】3279 Ants【FOJ】1962 新击鼓传花游戏【FOJ】1921 栀子花开【Codeforces】159C String Manipulation 1.0【POJ】2886 Who Gets the 阅读全文
2013年8月15日
摘要:
HDU 4678 Mine对于每个空白区域,求SG值。最后异或起来等于0,先手必败。 1 #pragma comment(linker,"/STACK:102400000,102400000") 2 #include 3 #include 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 阅读全文
2013年8月13日
摘要:
HDU 4666 Hyperspace曼哈顿距离:|x1-x2|+|y1-y2|。最远曼哈顿距离,枚举x1与x2的关系以及y1与y2的关系,取最大值就是答案。 1 #include 2 #include 3 #define oo 0x7FFFFFFF 4 #define MAXM 35 5 #define MAXN 100010 6 using namespace std; 7 multiset myset[MAXM]; 8 struct Ask { 9 int cmd;10 int arr[MAXM];11 } q[MAXN];12 int main() {13 in... 阅读全文
摘要:
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。且a3的时候同样可以得到结论:a1,an,a2,an-1...使得总的段数最多。 1 #include 2 #include 3 #include 4 typedef long long LL; 5 #define MOD 1000000007 6 #define MAXN 阅读全文
2013年8月8日
摘要:
HDU 4647 Another Graph Game如果没有边的作用,显然轮流拿当前的最大值即可。加上边的作用,将边权平均分给两个点,如果一个人选走一条边的两个点,就获得了边的权值;如果分别被两个人拿走,两人的差值不变。将边权平均分配给点,对点的权值排序轮流选择。 1 #include 2 #include 3 #include 4 #define MAXN 100010 5 #define EPS 1e-8 6 typedef long long LL; 7 using namespace std; 8 double arr[MAXN]; 9 int main() {10 int ... 阅读全文
2013年8月5日
摘要:
HDU 4632 Palindrome subsequencedp[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]。 1 #include 2 #include 3 #define MAXN 1010 4 #define MOD 10007 5 char str[MAXN]; 阅读全文
2013年8月1日
摘要:
HDU 4622 Reincarnation枚举字符串的起点,构造后缀自动机,每次插入一个字符,就能统计得到当前不同字串的个数,预处理出所有的询问。 1 #include 2 #include 3 #define MAXN 2010 4 #define MAXM 26 5 int res[MAXN][MAXN]; 6 char str[MAXN]; 7 struct node { 8 node *next[MAXM]; 9 node *pre;10 int step;11 int tot;12 } sam[MAXN next[idx] == 0) {28 ... 阅读全文
2013年7月29日
摘要:
HDU 4611 Balls Rearrangement令lcm=LCM(a,b),gcd=GCD(a,b)。cal(n,a,b)表示sum(abs(i%a-i%b)),0 2 #include 3 typedef long long LL; 4 using namespace std; 5 LL GCD(LL x, LL y) { 6 return y ? GCD(y, x % y) : x; 7 } 8 LL LCM(LL x, LL y) { 9 return x / GCD(x, y) * y;10 }11 LL cal(LL n, LL a, LL b) {12 ... 阅读全文
2013年7月23日
摘要:
HDU 4602 Partitionf[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*s[i-1]+f[i-k],dp[k]=s[k]=1。可以推出s[n-1]=2n-k-1+(n-k-1)*2n-k 阅读全文
2012年9月15日
摘要:
题意:给出A和C(1<=A,C<=10^9),所有满足B * B * K + 1 = A * A, (K >= 0)的B,构成边长为B的正方形,等角度的围绕在一个小正方形的周围。用C种颜色着色,边长为B的正方形旋转后相同视为相同的方案,整个图形绕中间的小正方形旋转后相同也视为相同的着色方案,求着色方案数。整体思路是:首先,忽略中间的小正方形,得到所有的B,求边长为B的着色的方案数X。其次,将每个B看成一个点,求用X种颜色对一个环着色的方案数。最后,将答案乘以C。要得到所有的B。由于A*A达10^18次方,根号n的复杂度寻找B肯定行不通。观察到B*B*K=A*A-1=(A+1) 阅读全文