上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 22 下一页
摘要: 思路:我们其实只需要枚举每条边,求得最小值就行了。先dfs算出每个节点作为根时,其子树的最长路径,以及进过该节点的最长,次长,第三长路径。然后在次dfs枚举求出切断某条边,求出这条边的两个端点为子树根,其子树的最长路径。b就是其中较大的。#pragma comment(linker, "/STACK:1024000000,1024000000")#include#include#include#include#include#include#define Maxn 200010using namespace std;int road[Maxn],Max[Maxn],lMax 阅读全文
posted @ 2013-08-16 15:50 fangguo 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 思路:首先看到这题以为能用poj1904的模版直接A掉,WA了几次,然后又TLE了几次。还是想到了正解。一开始我想的大致方向已经是对的了。先是由王子向每个喜欢的公主建边,再求一次最大匹配,找出匹配后,由匹配的公主向王子建边。但可能会有没有匹配到的公主和王子,那么这个王子可以和任何它喜欢的公主结婚,这个公主也可以和任何喜欢她的王子结婚。因为这些不在匹配中的点,加到匹配中后,减少的匹配数和增加的匹配数都是1。我们也就想像poj1904那样,将他们变为一个强连通分量,我开始出错就在这。直接在原图上将他们建边变为强连通分量会使原图性质发生改变。所有我们对每个没有匹配的公主,建一个虚拟的王子,让他们变成 阅读全文
posted @ 2013-08-16 15:36 fangguo 阅读(546) 评论(0) 推荐(0) 编辑
摘要: 思路:首先当然是要用树的点分治了。根节点为root,那么经过root的合法路径数求出来这题就解决了。因为我们可以用分治枚举根,最后将所有根的路径数加起来就是结果。当然这里的根不是整棵树的根,是子树根。我们为每个节点分配一个长度为30的数组记录给定因数在每个节点权值出现的次数。如果某几个权值相乘的值Value的三次根仍是整数的话,那么Value在给定因数的所有幂一定是3的倍数。通过这个转换,我们将所有的幂都对3取余,结果还是一样。在判断经过root的合法路径数时,我们进入其一个子树,将经过的路径因数的幂相加,判读其是否有对立状态存在,若存在,结果+1。所谓对立状态就是能够合成合法路径的状态。例如 阅读全文
posted @ 2013-08-15 10:49 fangguo 阅读(492) 评论(0) 推荐(1) 编辑
摘要: 思路:1741的A1送 1.#include#include#include#include#include#define Maxn 40010#define Maxm 80010#define inf 0x7fffffffusing namespace std;int head[Maxn],vi[Maxn],e,ans,num,k,n,m;int mx[Maxn],mi,dis[Maxn],root,size[Maxn];struct Edge{ int u,v,val,next;}edge[Maxm];void init(){ memset(vi,0,sizeof(vi)); ... 阅读全文
posted @ 2013-08-14 20:55 fangguo 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 思路:这题我是看 漆子超《分治算法在树的路径问题中的应用》写的。附代码:#include#include#include#include#include#define Maxn 10010#define Maxm 20010#define inf 0x7fffffffusing namespace std;int head[Maxn],vi[Maxn],e,ans,num,k,n;int mx[Maxn],mi,dis[Maxn],root,size[Maxn];struct Edge{ int u,v,val,next;}edge[Maxm];void init(){ memse... 阅读全文
posted @ 2013-08-14 20:44 fangguo 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 思路:主要就是一个动态方程dp[now][(j*Exp[len[num[i]]]+num[i])%k]+=dp[pre][j];我用的是滚动数组。其实也就是dp[i][(j*Exp[len[num[i]]]+num[i])%k]+=dp[i-1][j];唯一需要注意的就是存在长度长于n的串,要减掉。#include#include#include#include#define Maxn 100010using namespace std;int len[Maxn],Exp[Maxn*3],n,k,num[Maxn];int dp[3][210];void init(){ int i; ... 阅读全文
posted @ 2013-08-14 18:17 fangguo 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 思路:这题我是看了题目后,上百度搜了一下才知道还有求最大曼哈顿距离的方法。直接把代码copy过来,研读一下,知道了代码实现机制,自然就很容易想到用优先队列来维护每种状态下的xi,yi之和的最大值最小值,以及其属于哪个点。那么对于删点操作只需要标记为不存在就可以了。在队列出队时,若队顶元素不存在,就出队。#include #include #include #include #include #include #include #include using namespace std;const int Maxn=100005;const int inf=0x7fffffff;struct Qu 阅读全文
posted @ 2013-08-14 15:09 fangguo 阅读(807) 评论(0) 推荐(0) 编辑
摘要: 题意:每个用户对数据库的查询请求都会首先用该数据库的服务器序列的第一个去执行任务,若第一个坏了,就由第二个执行。最多只会坏一个服务器。要求是考虑最多坏一个的情况下,所有服务器中执行用户查询的数目最大值与最小值之差不能超过1。思路:对于n>=m的情况,很容易能解决掉,关键是n#include#include#include#includeusing namespace std;int ans[110][3],pre[110],vi[110],num[110],n,m;struct Que{ int val,c; int operator temp.c; }};int Ok(){... 阅读全文
posted @ 2013-08-14 15:03 fangguo 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 思路:首先声明我是参考:http://blog.csdn.net/frog1902/article/details/9921845这位大牛的博客的。他说的已经很详尽,但我还是要补充几点。看完他的解题报告在看我的才好些。我这的back[i]对于他的lim[i]。我要补充的是,back[i]不是真正的back[i],可以看到这行代码:back[u]=max(back[u],dep[v]+1);也就是说是其返回祖节点再往下的一个节点。对于没有回退边的点,其back[i]==0相当于有一个回退边到根节点,那么本节点到根节点上的任何一条边被选择都是可行的。dp时,首先将dp[u][i](back[u]# 阅读全文
posted @ 2013-08-13 12:47 fangguo 阅读(709) 评论(0) 推荐(0) 编辑
摘要: 思路:用sum[i]表示区间长度为i的不相同数的个数和,假使所有的数都不相同,那么sum[i]=sum[i-1]+n-i+1-later[i-1]; later[i-1]表示的是序列最后面的长度为i-1的序列不同数的个数。这个式子的意义是每个长度为i-1的序列扩展为长度为i的序列,其不同数的个数会加1,一共有n-i+1个长度为i-1的序列能扩展,因为最后面的一个长度为i-1的序列肯定是扩展不了的(后面没数了),故要将最后面的长度为i-1的序列减去,即减later[i-1]。那么对存在相同数的情况就是,任何数x,如果距离其上次出现的位置小于等于i-1,那么在n-i+1的基础上就要减去1。但这个并 阅读全文
posted @ 2013-08-12 20:35 fangguo 阅读(262) 评论(0) 推荐(0) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 22 下一页