您的位置:首页 > 其它

楼天城[男人必做八题]

2016-06-02 21:10 225 查看

六月了,离九校联考又近了一点。

之前的任务都结束地差不多了,下礼拜一听完课就要准备期末考了吧。

在那之前先鏼一下loutiancheng男人必做八题

传送门:http://wenku.baidu.com/link?url=7BJZ9bqoGrBJoeeiFdQtQgx3bKwyurWrWBuH9UGKAJETJipFaAUsKW0qohnINsvXILOCq0NC4uTuOZfyRruMkHh_huDfnbCi5wvxdB91NW7

poj1742 背包

卡着常A的。。。惭愧

再交一遍又不过了。。。。。。。。。。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 400000
#define maxn 10000555
using namespace std;
int edgenum,sum,n,ans,m,root;
int vet
,ff
,flag
,head
,son
,next
,dis
,pri
;
int tree[maxn];
void add(int u,int v,int w)
{
edgenum++;vet[edgenum]=v;next[edgenum]=head[u];
head[u]=edgenum;pri[edgenum]=w;
}
void jia(int x,int v)
{
while(x<=m)
{
tree[x]+=v;
x+=x&(-x);
}
}
int ask(int x)
{
int tmp=0;
while(x>0)
{
tmp+=tree[x];x-=x&(-x);
}return tmp;
}
void getdeep(int u,int fa)
{
if(dis[u]<=m){
ans++;
ans+=ask(m-dis[u]);
}else return;
int e=head[u];
while(e>0)
{
int v=vet[e];
if(flag[v]==0&&v!=fa)
{
dis[v]=dis[u]+pri[e];getdeep(v,u);
}
e=next[e];
}
}
void Add(int u,int fa,int biao)
{
if(dis[u]<=m&&dis[u]>0)jia(dis[u],biao);
int e=head[u];
while(e>0)
{
int v=vet[e];
if(flag[v]==0&&v!=fa)
{
Add(v,u,biao);
}
e=next[e];
}
}
void getroot(int u,int fa)
{
int e=head[u];son[u]=1;ff[u]=0;
while(e>0)
{
int v=vet[e];
if(v!=fa&&flag[v]==0)
{
getroot(v,u);son[u]+=son[v];
ff[u]=max(ff[u],son[v]);
}
e=next[e];
}
ff[u]=max(ff[u],sum-son[u]);
if(ff[u]<ff[root])root=u;
}
void work(int u)
{
int e=head[u];flag[u]=1;dis[u]=0;
while(e>0)
{
int v=vet[e];
if(flag[v]==0)dis[v]=dis[u]+pri[e],getdeep(v,0),Add(v,0,1);
e=next[e];
}
//
e=head[u];
while(e>0)
{
int v=vet[e];
if(flag[v]==0)
{
Add(v,0,-1);
}
e=next[e];
}
e=head[u];
//
while(e>0)
{
int v=vet[e];
if(flag[v]==0){
sum=son[v];
root=0;getroot(v,0);work(root);
}
e=next[e];
}
}
int main()
{
freopen("1741.in","r",stdin);
//freopen("my.out","w",stdout);
int u,v,w;
scanf("%d%d",&n,&m);
while(n!=0||m!=0)
{
for(int i=1;i<=n;i++)flag[i]=0;
ans=0;
for(int i=1;i<=n;i++)ff[i]=0;
ff[0]=10000;
memset(dis,-1,sizeof(dis));
edgenum=0;memset(head,0,sizeof(head));
for(int i=1;i<=n-1;i++)scanf("%d%d%d",&u,&v,&w),add(u,v,w),add(v,u,w);
sum=n; root=0;
getroot(1,0);work(root);
printf("%d\n",ans);scanf("%d%d",&n,&m);
}

}
View Code

 

就做了两题,难受啊。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: