NOIP2015BLOCKADE c++ 代码

  1 #include<algorithm>
  2 #include<fstream>
  3 #include<functional>
  4 #include<iostream>
  5 using namespace std;
  6 static const int N=50001;
  7 typedef long long int64;
  8 struct node
  9 {
 10     int v,w;
 11     node *next;
 12 }alist[3*N];
 13 struct heapnode
 14 {
 15     int64 w;
 16     int u;
 17     bool operator>(const heapnode &r)const
 18     {
 19         return w>r.w;
 20     }
 21 };
 22 int p[N][19];
 23 int64 w[N][19];
 24 void dfs1(int u)
 25 {
 26     for(node *i=alist[u].next;i;i=i->next)
 27         if(i->v!=p[u][0])
 28         {
 29             p[i->v][0]=u;
 30             w[i->v][0]=i->w;
 31             dfs1(i->v);
 32         }
 33 }
 34 bool visit[N];
 35 void dfs2(int u)
 36 {
 37     if(visit[u])return;
 38     if(!alist[u].next->next)return;
 39     visit[u]=true;
 40     for(node *i=alist[u].next;i;i=i->next)
 41         if(i->v!=p[u][0])
 42         {
 43             dfs2(i->v);
 44             if(!visit[i->v])
 45             {
 46                 visit[u]=false;
 47                 break;
 48             }
 49         }
 50 }
 51 int main()
 52 {
 53     ifstream fin("blockade.in");
 54     ofstream fout("blockade.out");
 55     int n(0),m(0);
 56     fin>>n;
 57     node *anode(alist+n+1);
 58     for(int i=0;i<n-1;i++)
 59     {
 60         int u(0),v(0),ww(0);
 61         fin>>u>>v>>ww;
 62         anode->v=v;
 63         anode->w=ww;
 64         anode->next=alist[u].next;
 65         alist[u].next=anode++;
 66         anode->v=u;
 67         anode->w=ww;
 68         anode->next=alist[v].next;
 69         alist[v].next=anode++;
 70     }
 71     fin>>m;
 72     static int d[N];
 73     for(int i=0;i<m;i++)
 74         fin>>d[i];
 75     int NScount=0;
 76     for(node *i=alist[1].next;i;i=i->next)
 77     {
 78         NScount++;
 79         p[i->v][0]=1;
 80         w[i->v][0]=i->w;
 81         dfs1(i->v);
 82     }
 83     if(NScount>m)
 84     {
 85         fout<<"-1"<<endl;
 86         return 0;
 87     }
 88     for(int j=1;j<=18;j++)
 89         for(int i=1;i<=n;i++)
 90         {
 91             p[i][j]=p[p[i][j-1]][j-1];
 92             w[i][j]=w[i][j-1]+w[p[i][j-1]][j-1];
 93         }
 94     static heapnode a[N],b[N];
 95     heapnode *atop(0),*aback(0),*btop(0),*bback(0);
 96     static int _w[N];
 97     for(node *i=alist[1].next;i;i=i->next)
 98         _w[i->v]=i->w;
 99     int64 l(0),r(1e16),ans(1e16);
100     greater<heapnode> comp;
101     while(l<=r)
102     {
103         atop=a;
104         aback=a;
105         btop=b;
106         bback=b;
107         int64 mm=(l+r)>>1;
108         for(int i=1;i<=n;i++)
109             visit[i]=false;
110         for(int i=0;i<m;i++)
111         {
112             int u=d[i];
113             int64 ww=mm;
114             for(int j=18;j>=0;j--)
115                 if(p[u][j]&&p[u][j]!=1&&ww>=w[u][j])
116                 {
117                     ww-=w[u][j];
118                     u=p[u][j];
119                 }
120             if(/*p[u][0]==1&&*/ww>w[u][0])
121             {
122                 aback->w=ww-w[u][0];
123                 aback->u=u;
124                 aback++;
125                 push_heap(atop,aback,comp);
126             }
127             else visit[u]=true;
128         }
129         dfs2(1);
130         if(visit[1])
131         {
132             ans=mm;
133             r=mm-1;
134         }
135         else
136         {
137             for(node *i=alist[1].next;i;i=i->next)
138                 if(!visit[i->v])
139                 {
140                     bback->w=i->w;
141                     bback->u=i->v;
142                     bback++;
143                     push_heap(btop,bback,comp);
144                 }
145             while(btop!=bback||atop!=aback)
146             {
147                 while(atop!=aback&&!visit[atop->u]&&atop->w<_w[atop->u])
148                 {
149                     visit[atop->u]=true;
150                     pop_heap(atop,aback,comp);
151                     aback--;
152                 }
153                 while(btop!=bback&&visit[btop->u])
154                 {
155                     pop_heap(btop,bback,comp);
156                     bback--;
157                 }
158                 if(btop==bback||atop==aback)break;
159                 if(atop->w>=btop->w)
160                 {
161                     visit[btop->u]=true;
162                     pop_heap(atop,aback,comp);
163                     aback--;
164                     pop_heap(btop,bback,comp);
165                     bback--;
166                 }
167                 else
168                 {
169                     pop_heap(atop,aback,comp);
170                     aback--;
171                 }
172             }
173             if(btop==bback)
174             {
175                 ans=min(ans,mm);
176                 r=mm-1;
177             }
178             else l=mm+1;
179         }
180     }
181     fout<<ans<<endl;
182     return 0;
183 }
时间: 2024-10-12 12:34:28

NOIP2015BLOCKADE c++ 代码的相关文章

错误和问题解决的成本

问题描写叙述 错误 数据收集 根本原因 版本号   组件:数据修复           在一个实际成本组织中,(平均,先进先出,后进先出) 一个或更 多的下面情况可能发生: 1.导航到物料成本历史表单上的数量信息,与现有量表单的数量不匹配的记录 2. 一些物料前期已计成本的数量与前面的事务处理历史表单的数量不匹配 3. 全部的库存值报表与事务处理值报表不匹配 4. 存货层次成本更新表单的总数量与现有量数量表单不匹配(只在先进先出/后进先出) 5.这些症状的不论什么一个意味着 MMT-CQL不匹配

Xcode 快速开发 代码块 快捷键

Xcode的代码片段(Code Snippets)创建自定义的代码片段,当你重用这些代码片段时,会给你带来很大的方便. 常用的: 1.strong:@property (nonatomic,strong) <#Class#> *<#object#>;2.weak:@property (nonatomic,weak) <#Class#> *<#object#>;3.copy:@property (nonatomic,copy) NSString *<#s

solr分布式索引【实战一、分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例】

1 private static Properties prop = new Properties(); 2 3 private static String confFilePath = "conf" + File.separator + "config.properties";// 配置文件目录 4 static { 5 // 加载properties 6 InputStream is = null; 7 InputStreamReader isr = null;

微信支付PHP SDK —— 公众号支付代码详解

在微信支付 开发者文档页面 下载最新的 php SDK http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 这里假设你已经申请完微信支付 1. 微信后台配置  如图 我们先进行测试,所以先把测试授权目录和 测试白名单添加上.测试授权目录是你要发起微信请求的哪个文件所在的目录. 例如jsapi 发起请求一般是jsapi.php所在目录 为测试目录,测试白名单即开发人员的微信号. 正式的支付授权目录不能和测试的一样否则会报错.不填

如何上传代码到github?

如何上传代码到github? 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可: https://git-for-windows.github.io/ 1.进入Github首页,点击New repository新建一个项目  2.填写相应信息后点击create即可 Repository name: 仓库名称 Description(可选): 仓库描述介绍 Public,

自己写的代码会写了,还是太渣,复杂度什么的直接报表

原题目是这样子的,本人按照一贯的作风想得很简单 #include<iostream> using namespace std; void H(int n) { while (n > 1) { if (n % 2 == 0) //这一步把取余和除法弄混淆. { cout << n << " "; n = n / 2; } else { cout << n << " "; n = 3 * n + 1; }

category is in invalid format hint微信第三方平台将第三方提交的代码包提交审核出错

微信第三方平台通过接口https://api.weixin.qq.com/wxa/submit_audit?access_token=TOKEN将第三方提交的代码包提交审核时一直返回错误码85008的错误信息: category is in invalid format hint 查了半天是接口提交数据时json_encode时中文不能编码提交 将向微信的提交代码     $this->https_post($url,json_encode($postData)); 改为     $this->

CSS颜色代码大全

CSS颜色代码大全 颜色代码表(一): EEEEEE FFCCFF FF66FF FF00FF DDDDDD FFCCCC FF66CC FF00CC CCCCCC FFCC99 FF6699 FF0099 BBBBBB FFCC66 FF6666 FF0066 AAAAAA FFCC33 FF6633 FF0033 999999 FFCC00 FF6600 FF0000 888888 CCCCFF CC66FF CC00FF 777777 CCCCCC CC66CC CC00CC 666666

mp4网页播放代码,有声音无图像的解决办法~

mp4网页播放代码,有声音无图像的解决办法~ 关于网页播放mp4格式的视频,找了一些插件,这里推荐一下video.js 官方网址:http://www.videojs.com/ github :https://github.com/videojs/video.js/ demo:http://www.videojs.com/downloads/video-js-4.12.5.zip 使用方法: ①引入文件:指派flash播放的swf文件 <link href="//example.com/p