10 2016 档案

摘要:思路:模拟kruskal的过程,可以发现对于所有权值相同的边,有很多种选择的方案,而且权值不同的边并不会相互影响,因为先考虑权值较小的边,权值比当前权值大的边显然不在考虑范围之内,而权值比当前权值小的边所组成的连通块已经经过缩点变成一个点了,因此处理权值相同的所有边可以看成是一个阶段,最后的答案也就 阅读全文
posted @ 2016-10-31 17:49 DUXT 阅读(210) 评论(0) 推荐(0)
摘要:思路:一道很裸的生成树计数问题,然而要高精度,而且听说直接行列式求值会被卡精度,所以可以模拟行列式求值的过程得到递推公式:f[i]=3*f[i-1]-f[i-2]+2,证明详见vfk博客: http://vfleaking.blog.163.com/blog/static/1748076342011 阅读全文
posted @ 2016-10-30 20:40 DUXT 阅读(150) 评论(0) 推荐(0)
摘要:思路:反着做用并查集维护连通块个数就好了。 阅读全文
posted @ 2016-10-30 16:26 DUXT 阅读(170) 评论(0) 推荐(0)
摘要:思路:因为Q、S、B操作总和不超过100,因此怎么暴力怎么写。。。。当然记忆化搜索还是要的 阅读全文
posted @ 2016-10-30 15:57 DUXT 阅读(192) 评论(0) 推荐(0)
摘要:思路:设f[i][j]表示前i个数逆序对为j的方案数,第i+1个数可以新形成1~i个逆序对,于是f[i][j]=Σf[i-1][j-k],然后用一个前缀和优化成n^2即可。 阅读全文
posted @ 2016-10-29 18:02 DUXT 阅读(381) 评论(0) 推荐(1)
摘要:思路:刷水有益健康。 阅读全文
posted @ 2016-10-29 17:23 DUXT 阅读(201) 评论(0) 推荐(0)
摘要:思路:首先先背包预处理出f[x]表示所有物品背出体积为x的方案数。然后统计答案,利用dp。 C[i][j]表示不用物品i,组成体积j的方案数。 转移公式:C[i][j]=f[j]-C[i][j-w[i]] 阅读全文
posted @ 2016-10-29 17:21 DUXT 阅读(275) 评论(0) 推荐(0)
摘要:思路:首先限制数很多,逐步来考虑,限制一很容易满足,考虑限制二,也就是让奇数位和偶数位上的数递增,限制三就是让奇数位上的数小于奇数位加一对应的偶数位上的数,那么我们可以把形成序列的过程看成加数的过程,从小到大逐步加(这显然满足限制一),然后加数的条件一是从小到大依次放奇数位或偶数位,因此也满足限制二 阅读全文
posted @ 2016-10-29 17:08 DUXT 阅读(502) 评论(0) 推荐(0)
摘要:思路:首先容易想到二分答案,但如何去check呢,对于一段区间[l,r],把所有小于答案的都赋值为-1,大于等于它的都赋值为1,然后求左端点在[a,b],右端点在[c,d]的最大子串和即可(也就是区间[a,b]的最大右子串和加上(b,c)的子串和加上区间[c,d]的最大左子串和)这样既可,用个线段树 阅读全文
posted @ 2016-10-28 14:23 DUXT 阅读(143) 评论(0) 推荐(0)
摘要:思路:可持久化线段树,利用权值线段树,把建树过程看成插入,插入第i个元素就在第i-1棵树的基础上新建结点然后得到第i棵树,那么询问区间[l,r]就是第r棵树上的信息对应减去第l-1棵树上的信息,然后再利用权值线段树的职能找第k大,这里就巧妙地利用了可持久化线段树不修改原来线段树上的信息而是新建结点来 阅读全文
posted @ 2016-10-28 12:04 DUXT 阅读(144) 评论(0) 推荐(0)
摘要:思路:树套树,我写了两种,一种是线段树套splay,线段树维护区间信息,splay维护第k大,一种是树状数组套权值线段树(并不是什么可持久化线段树,只不过是动态开点罢了,为什么网上一大堆题解都是可持久化线段树。。。。。明明可以直接修改的,不过可持久化线段树应该也是可以写的),树状数组维护前缀和,权值 阅读全文
posted @ 2016-10-28 11:55 DUXT 阅读(176) 评论(0) 推荐(0)
摘要:思路:折半搜索,每个数的状态只有三种:不选、选入集合A、选入集合B,然后就暴搜出其中一半,插入hash表,然后再暴搜另一半,在hash表里查找就好了。 阅读全文
posted @ 2016-10-28 11:36 DUXT 阅读(286) 评论(0) 推荐(3)
摘要:思路:插入、修改操作是splay的模型,然后询问的话就可以二分答案,然后再用splay去判,关键就在于怎么去判断。 可以用字符串hash,splay每个节点维护一个hash域,然后就可以定义一个进制去hash即可二分判断,hash值让其自然溢出即可。 阅读全文
posted @ 2016-10-28 11:29 DUXT 阅读(242) 评论(0) 推荐(0)
摘要:思路:设f[i][j]表示前i位后j位与不吉利串前j位相同的方案数,然后f[i][j]+=f[i-1][k]*trans[k][j],trans[k][j]表示串s后k位与不吉利串前k位相同,添加一个字符后后j位与不吉利串前j位相同的方案数,显然这个矩阵是可以用kmp求的,然后因为只能由i转移到i+ 阅读全文
posted @ 2016-10-28 11:23 DUXT 阅读(218) 评论(1) 推荐(0)
摘要:思路:首先所有情况就是m^n,然后不可能发生越狱的情况就是第一个有m种选择,第二个要与第一个不同就是m-1种选择,第三个要与第二个不同也是m-1种选择,然后不可能发生越狱的情况数就是m*(m-1)^(n-1),然后用总方案数减去它即可。 阅读全文
posted @ 2016-10-28 11:10 DUXT 阅读(279) 评论(3) 推荐(0)
摘要:思路:首先按斜率排序,如果斜率相同就取截距最大的,显然截距小的会被覆盖而对答案没有贡献,然后考虑斜率不同的如何统计答案,可以用一个单调栈维护,当前新插入的直线显然斜率是要比当前栈顶斜率要大的,然后如果新插入的直线l[i]与stack[top]的交点在stack[top]与stack[top-1]的交 阅读全文
posted @ 2016-10-28 11:04 DUXT 阅读(172) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2016-10-28 10:42 DUXT 阅读(7) 评论(0) 推荐(0)
摘要:思路:将关键点按dfs序排序,然后显然就是dfs序中相邻的两个点的距离之和加上最后一个点到第一点的距离(YY一下很显然),动态维护就用splay就好了(我是一个不会用set的蒟蒻。。。。。) 阅读全文
posted @ 2016-10-24 17:16 DUXT 阅读(191) 评论(0) 推荐(0)
摘要:思路:建出虚树然后treedp即可,f[i]表示将以i为根的子树与根隔绝的最小代价,f[i]=min(val[i],Σf[son[i]])(val[i]表示将点i与根隔绝的代价),需要注意的是如果i就是关键点那么f[i]=val[i]。 阅读全文
posted @ 2016-10-24 11:51 DUXT 阅读(184) 评论(0) 推荐(0)
摘要:思路:首先因为n的范围很大,考虑建立虚树,就是把大部分的冗余的点去掉然后建立一颗新的树然后再树形dp,具体实现可以考虑用一个栈维护,首先求出每个点的dfn然后按照dfn排序,然后用一个栈维护(栈里存的关键点或关键点之间的lca或关键点lca的lca等等。。。),然后枚举关键点,求出关键点与当前栈顶元 阅读全文
posted @ 2016-10-24 10:55 DUXT 阅读(155) 评论(0) 推荐(0)
摘要:思路:首先这道题可以直接裸上树剖。 然后参见了黄学长的博客发现了一种更为高明的解法,可以在树上差分,令x为路径(u,v)的lca,然后f[u]++,f[v]++,f[x]--,f[fa[x]]--,然后直接一遍dfs累加起来就好了。(为什么我的代码常数辣么大。。。差分被树剖虐。。。。) 阅读全文
posted @ 2016-10-23 20:00 DUXT 阅读(177) 评论(0) 推荐(0)
摘要:思路:首先先求出以1为根的答案,然后考虑由i转移到i的儿子的答案的变化,显然以son[i]为根的子树的所有结点的深度都会减一,其余的点的深度都会加一,然后就可以直接O(n)求出所有结点的答案,然后取max更新答案即可。 #include<iostream> #include<cstdio> #inc 阅读全文
posted @ 2016-10-23 19:55 DUXT 阅读(181) 评论(0) 推荐(0)
摘要:思路:状压dp,设f[i][j]表示当前已经选出的牛的状态为i,最后一头选出的牛为j的方案数。 然后注意就是初值不能是f[0][i]=1,因为所有牛本来都可以第一个被选中,然而这样一定初值有些牛可能就无法被第一个选出了,因此应该是f[(1<<i)][i]=1。 #include<iostream> 阅读全文
posted @ 2016-10-23 19:51 DUXT 阅读(233) 评论(0) 推荐(0)
摘要:思路:状压dp,枚举疾病的集合,然后判断一下可行性即可。 #include<bits/stdc++.h> using namespace std; #define maxs 400000 #define maxn 1900 int n,d,k; int a[maxn],f[maxs],num[max 阅读全文
posted @ 2016-10-23 19:47 DUXT 阅读(250) 评论(0) 推荐(0)
摘要:思路:状压dp,f[i][j]表示新的排列的状态为i(也就是新的排列已经选了哪些数),然后模d的余数为j的方案数。 但考虑到可能有些数会出现多次,假设一个数x出现了cnt[x]次,那么对于一个可行的答案,显然也包含cnt[x]个x,那么这样的答案就会被计算多次,因为如果状态i先加入第一个x再加入第二 阅读全文
posted @ 2016-10-23 19:44 DUXT 阅读(334) 评论(0) 推荐(0)
摘要:思路:看到n十分于是考虑状压dp,先预处理出处于状态s的情况下过桥的时间和重量,然后枚举状态转移即可,f[i]=min(f[i],f[j]+time[i^j])(j∈i)(自称会状压dp结果连枚举非空子集都不会的我。。。。。) 顺便普及如何枚举非空子集:for (int j=i;j;j=j&(i-1 阅读全文
posted @ 2016-10-23 19:33 DUXT 阅读(197) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2016-10-17 09:57 DUXT 阅读(9) 评论(0) 推荐(0)
摘要:A:题意:给定一个由字母表组成的首尾相接的环,环上有一个指针,最初指向字母a,每次可以顺时针或逆时针旋转一格,例如a顺时针转到z,逆时针转到b,然后问转出给定字符串最少需要转多少次。 思路:模拟。 1 #include<iostream> 2 #include<cstdio> 3 #include< 阅读全文
posted @ 2016-10-17 09:07 DUXT 阅读(260) 评论(0) 推荐(0)
摘要:思路:首先如果颜色相同直接利用以前的答案即可,可以离线排序或是在线hash,然后考虑怎么快速统计答案。 首先如果点a是点b的祖先,那么一定有点b在以点a为根的子树的dfs序区间内的,于是先搞出dfs序。 然后如果颜色a的点数很小,颜色b的点数很大,那么可以考虑枚举a的点数,然后对于每一种颜色开个ve 阅读全文
posted @ 2016-10-14 17:44 DUXT 阅读(577) 评论(0) 推荐(0)
摘要:思路:考虑离线操作,以y为关键字排序,对于y相同的一起操作,然后考虑y的范围,当y<=sqrt(n)时,直接O(n)预处理出f[x]表示f[x]+f[x+y]+f[x+2*y]+..+f[x+k*y]的答案,然后这样的y显然不超过sqrt(n)个,复杂度也就是O(n*sqrt(n))的;如果y>sq 阅读全文
posted @ 2016-10-14 16:58 DUXT 阅读(242) 评论(0) 推荐(0)
摘要:T1:bzoj4711:小奇挖矿 题意:喵星系有n个星球,标号为1到n,星球以及星球间的航线形成一棵树。所有星球间的双向航线的长度都为1。小奇要在若干个星球建矿石仓库,设立每个仓库的费用为K。对于未设立矿石仓库的星球,设其到一个仓库的距离为i,则将矿石运回的费用为Di。请你帮它决策最小化费用。 思路 阅读全文
posted @ 2016-10-13 21:21 DUXT 阅读(401) 评论(0) 推荐(0)
摘要:思路:首先考虑如何求珠子个数,一个珠子由a,b,c三个数组成且属于区间[1,a],并满足gcd(a,b,c)=1。由于要求本质相同,对于a,b,c这样的一个无序的数列且满足gcd(a,b,c)=1,设其总方案数为t1,那么显然本质相同的重复了6次,即(a,b,c),(a,c,b),(b,a,c),( 阅读全文
posted @ 2016-10-13 20:10 DUXT 阅读(494) 评论(0) 推荐(0)
摘要:题目大意:一串项链由n个戒指组成,对于每个戒指,一共有M个点,R种颜色,且旋转后相同的戒指是相同的,然后一串项链又由N个戒指组成,同时要满足相邻的两个戒指不能相同,这串项链上某个位置插入了一个特殊的东西,且如果特殊的东西插入的地方不同,即使戒指都是相同的,这两串项链也是不同的,求一共有多少不同的爱之 阅读全文
posted @ 2016-10-12 10:13 DUXT 阅读(591) 评论(0) 推荐(0)
摘要:思路:由于题目给出了置换,又要求本质不同的方案数,考虑使用Burnside引理,Burnside引理即通过所有置换和原来相同的方案数之和除以方案数总数,而对于某一个置换要使置换后得到的与原来的相同,就应该把置换形成的环染成同一种颜色,也就是说属于一个环内的元素颜色一定相同,然后有一定要有一定量的红蓝 阅读全文
posted @ 2016-10-12 09:29 DUXT 阅读(416) 评论(0) 推荐(0)
摘要:思路:以bzoj1119为例,题目已经给出了置换,而每一次交换的代价是交换二者的权值之和,而置换一定是会产生一些环的,这样就可以只用环内某一个元素去置换而使得其余所有元素均在正确的位置上,显然要选择环内最小的数,但也可能存在一个数使得它不在当前处理的环内而它先与当前环内某个数进行交换,然后再在环内进 阅读全文
posted @ 2016-10-12 08:26 DUXT 阅读(189) 评论(0) 推荐(0)
摘要:思路:由于题目中是通过改变点的编号来判断两种染色方案是否相同,而染色的确是边,于是考虑如何将点置换转化为边置换。 对于一个有n个点的完全图,其点置换有n!个(即全排列个数),又由于每一个边置换都对应了一个点置换(因为是改变点的编号才得到的边置换),因而边置换也是n!个,也就是说已经确定了Polya定 阅读全文
posted @ 2016-10-11 21:51 DUXT 阅读(289) 评论(0) 推荐(0)
摘要:思路:polya裸题,如果是旋转,对于旋转i格的循环节长度len=lcm(i,n)/i,个数就是n/len=gcd(i,n);如果是翻转,奇数个点对称轴就是一个点一条边,那么循环节个数即n/2+1, 偶数个点有n/2条对称轴穿过两个点,循环节个数是n/2+1,n/2条对称轴穿过两条边,循环节个数就是 阅读全文
posted @ 2016-10-10 22:00 DUXT 阅读(212) 评论(0) 推荐(0)
摘要:思路:区间dp,设状态f[l][r][bo]表示区间[l,r]的答案,bo=1表示该区间可以放M也可以不放M,bo=0表示该区间不能放M,并且对于任意一个状态f,l和l-1之间均有一个M,于是就可以进行转移了。 对于区间[l,r]中的任意位置都可能要放一个M,于是当bo=1时f[l][r][bo]= 阅读全文
posted @ 2016-10-10 20:29 DUXT 阅读(194) 评论(0) 推荐(0)
摘要:思路:完全背包加容斥原理 首先不考虑限制,那么很容易可以预处理出f[i](f[i]+=f[i-c[i]],1<=i<=4,i-c[i]>=0)。 然后考虑如何求出限制后的答案。 首先考虑这样的一个问题:x1+x2+x3+x4+x5+...+xn=m有多少组整数解。显然插板法可以解决这个问题,但如果引 阅读全文
posted @ 2016-10-10 09:27 DUXT 阅读(263) 评论(0) 推荐(0)
摘要:思路:区间dp,令f[l][r]表示l到r的答案,于是f[l][r]=min(f[l][mid],f[mid+1][r]),如果能折叠f[l][r]=min(f[l][r],f[l][l+len-1]+calc(r-l+1,len),calc是计算数字的长度。记忆化搜索即可。 1 #include< 阅读全文
posted @ 2016-10-10 08:12 DUXT 阅读(167) 评论(0) 推荐(0)
摘要:思路:区间dp,用f[i][j]表示区间[i,j]的答案,然后转移即可。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using names 阅读全文
posted @ 2016-10-09 20:52 DUXT 阅读(209) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2016-10-09 14:29 DUXT 阅读(3) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2016-10-09 14:16 DUXT 阅读(5) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2016-10-08 22:07 DUXT 阅读(5) 评论(0) 推荐(0)