上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 22 下一页
摘要: 思路:用Sum[dep][i]记录从tree[po].l到i中进入左子树的和。#include#include#include#include#include#include#define Maxn 100010#define inf 0x7fffffff#define lowbit(x) (x&(-x))#define lson(x) (x>1)using namespace std;struct Tree{ int l,r;}tree[Maxn*4];__int64 Sum[20][Maxn],sum[Maxn];__int64 lnum,lsum;int sorted[Ma 阅读全文
posted @ 2013-08-09 15:51 fangguo 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 思路:二分枚举区间第k大。用划分树查找是否符合要求的高度。#include#include#include#include#include#define Maxn 100010#define lson(x) x>1)using namespace std;int val[20][Maxn],toLeft[20][Maxn],sorted[Maxn];struct Tree{ int l,r;}tree[Maxn*4];void BuildTree(int l,int r,int dep,int po){ tree[po].l=l,tree[po].r=r; if(l==r) ... 阅读全文
posted @ 2013-08-09 15:48 fangguo 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 思路:直接搜索#include#include#include#includeusing namespace std;int belong[5010],num[5010],n;int dfs(int s,int pre,int cur){ int i,j; if(cur==n/2) return 1; for(i=s;ipre) { belong[j]=1; if(dfs(s+1,j,cur+1)) return 1; ... 阅读全文
posted @ 2013-08-09 14:11 fangguo 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 思路:我们定义两个数组,ant[Maxn][2],bob[Maxn][2]。ant[i][0]表示还未确定哪个城市被全费用占领,ant[i][1]表示确定了哪个城市被全费用占领。那么ant[i][0]的转移方程是ant[u][0]+=min(ant[v][0],bob[v][1]);即与它相连的那个城市也未确定全费用占领的城市,或者被bob占领,且确定了全费用。由于ant[u][0]表示未确定,故不能从ant[v][1]的确定状态转移过来。ant[u][1]=ant[u][0]+min(a[u],m1+a[u]/2);对于u节点确定了全费用占领城市,那么要么就是自己全费用占领,或者是他的某个相 阅读全文
posted @ 2013-08-08 11:00 fangguo 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 思路:先将图进行缩点,建成一颗树,那么如果这是一条单路径树(即最大点度不超过2),就不在能删的一条边,使得不连通。因为将其头尾相连,形成一个圈,那么删任意一条边,图都是连通的。上面的是无解的情况,如果有解,那么这个解一定是树中不全在一条路径上的三条边中的一条,使得这三条边中的最大边最小,即得解。同样,对任意一个节点,其三个子树上的边一定是三条不全在一条路径上的边。问题就转化为求一个节点的第三小边。但直接求第三小边容易出错,并且不易求得。我们可以先选一条树中的最小边,这条边一定是三条边中的一条,我们就沿着这条边的两个端点找。那么问题就又变成了求一个节点的次小边了。这个很容易求得。感谢http:/ 阅读全文
posted @ 2013-08-07 21:41 fangguo 阅读(534) 评论(3) 推荐(0) 编辑
摘要: 思路:我们定义一个dfn[i],Maxndfn[i]来确定节点i的访问次序,以及其子节点的最大访问次序。那么另一个节点是其子树的节点当且仅当dfn[j]>=dfn[i]&&dfn[j]#include#include#include#include#define Maxn 100010#define inf 0x7fffffffusing namespace std;int son[Maxn],nson[Maxn],der[Maxn],nder[Maxn],n,q,dfn[Maxn],Maxdfn[Maxn],lab,dp[Maxn],road[Maxn],father[ 阅读全文
posted @ 2013-08-07 17:13 fangguo 阅读(360) 评论(0) 推荐(0) 编辑
摘要: 思路:设sum[i],le[i],back[i],worm[i]分别表示以i为根节点需要的完成步数,叶子节点数,失败回退步数,以及i是否有虫。#include#include#include#include#define Maxn 1010using namespace std;int sum[Maxn],worm[Maxn],le[Maxn],vi[Maxn],head[Maxn],e,n,back[Maxn];struct Edge{ int u,v,next;}edge[Maxn*Maxn];void init(){ memset(sum,0,sizeof(sum)); ... 阅读全文
posted @ 2013-08-07 14:01 fangguo 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 思路:若没有边权,则对点权从大到小排序即可,考虑边,将边权拆成两半加到它所关联的两个点的点权中即可,因为当两个人分别选择不同的点时,这一权值将互相抵消。#include#include#include#includeusing namespace std;double val[100010];int cmp(double a,double b){ return a>b;}int main(){ int n,i,m,j,a,b; double c; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++ 阅读全文
posted @ 2013-08-06 21:49 fangguo 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 思路:定义一个三维数组dp[x][i][j]其中x为now和pre两种状态,now表示当前两行最优解,pre表示出了本行外,前两行的最优解。那么状态转移方程为dp[now][j][k]=max(dp[now][j][k],dp[pre][k][r]+num[i][j][1])。num[i][j][1]表示第i行的第j个状态的1的个数。转移条件是!(num[i][j][0]&num[i-1][k][0])&&!(num[i][j][0]&num[i-2][r][0])&&!(num[i-1][k][0]&num[i-2][r][0])为真。 阅读全文
posted @ 2013-08-06 17:59 fangguo 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 思路:将每一行看做一个二进制位,那么所有的合法状态为相邻为1的个数一定要为偶数个。这样就可以先把所有的合法状态找到。由于没一层的合法状态都是一样的,那么可以用一个数组保存。由第i-1行到第i行的状态转移是dp[i][now|num[j]]+=dp[i-1][k],其中now为(1#include#include#include#define Maxn 13#define inf 0x7fffffffusing namespace std;__int64 dp[Maxn][1=1;i--) sum+=graphic[i]*(1<<(m-i)); num[++c... 阅读全文
posted @ 2013-08-06 14:28 fangguo 阅读(141) 评论(0) 推荐(0) 编辑
上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 22 下一页