楼天城[男人必做八题]
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
就做了两题,难受啊。
相关文章推荐
- wamp中修改后mysq数据库l闪退无法登陆解决办法
- SQL中count比较
- 《大道至简》
- 《剑指offer》:[10]利用前序和中序构建二叉树
- Canvas参考
- 读《大道至简》
- MongoDB快速入门学习笔记8 MongoDB的java驱动操作
- storm wordcount实例
- 阿里云ECS/Ubuntu下JDK、Tomcat、MySQL安装记录
- redis set、序列化存入缓存
- 《将博客搬至CSDN》
- GEEK编程练习— —寻找单个数
- Java——泛型(最易懂的方式阐述泛型)
- 《编程之美——微软技术面试心得》一摞烙饼的排序初体验
- C++的异常处理 & Objc的异常处理
- soliworks三维机柜布局(一)创建设备型号库
- present动画效果
- DOM(二)
- python MySQLdb在windows环境下的快速安装、问题解决方式
- Apache,CDH和Cloudera三者有什么区别