bzoj 3611

 

和BZOJ消耗站一样,先将那个询问的简图构建出来,然后就是简单的树形DP。

(倍增数组开小了,然后就狂WA,自己生成的极限数据深度又没有那么高,链又奇迹般正确)

 

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <vector>
  4 #include <algorithm>
  5 #define min(a,b) ((a)<(b)?(a):(b))
  6 #define max(a,b) ((a)>(b)?(a):(b))
  7 #define oo 0x3f3f3f3f3f3f3f3f
  8 #define N 1000010
  9 #define P 19
 10 using namespace std;
 11 
 12 typedef long long dnt;
 13 
 14 int n, m;
 15 vector<int> g[N];
 16 int dfn[N], anc[N][P+1], dep[N], idc;
 17 int head[N], ikey[N], dest[N+N], next[N+N], etot;
 18 dnt dp[N][4]; 
 19 int qcnt, aa[N], stk[N], top;
 20 dnt ans[3];
 21 
 22 void adde( int u, int v ) {
 23     etot++;
 24     next[etot] = head[u];
 25     dest[etot] = v;
 26     head[u] = etot;
 27 }
 28 void dfs( int u ) {
 29     dfn[u] = ++idc;
 30     for( int p=1; p<=P; p++ )
 31         anc[u][p] = anc[anc[u][p-1]][p-1];
 32     for( int t=0; t<g[u].size(); t++ ) {
 33         int v=g[u][t];
 34         if( v==anc[u][0] ) continue;
 35         anc[v][0] = u;
 36         dep[v] = dep[u]+1;
 37         dfs(v);
 38     }
 39 }
 40 bool cmp( int u, int v ) {
 41     return dfn[u]<dfn[v];
 42 }
 43 int lca( int u, int v ) {
 44     if( dep[u]<dep[v] ) swap(u,v);
 45     int t=dep[u]-dep[v];
 46     for( int p=0; t; t>>=1,p++ )
 47         if( t&1 ) u=anc[u][p];
 48     if( u==v ) return u;
 49     for( int p=P; p>=0 && anc[u][0]!=anc[v][0]; p-- )
 50         if( anc[u][p]!=anc[v][p] ) u=anc[u][p], v=anc[v][p];
 51     return anc[u][0];
 52 }
 53 void build() {
 54     stk[top=1] = 1;
 55     head[1] = 0;
 56 
 57     sort( aa+1, aa+1+qcnt, cmp );
 58 
 59     etot = 0;
 60     for( int i=2-(aa[1]!=1); i<=qcnt; i++ ) {
 61         int ca=lca(aa[i],stk[top]);
 62         while( dep[ca]<dep[stk[top]] ) {
 63             int u;
 64             u = stk[top--];
 65             if( dep[ca]>=dep[stk[top]] ) {
 66                 if( ca!=stk[top] ) {
 67                     stk[++top] = ca;
 68                     head[ca] = 0;
 69                 }
 70                 adde( stk[top], u );
 71                 break;
 72             } 
 73             adde( stk[top], u );
 74         }
 75         stk[++top] = aa[i];
 76         head[aa[i]] = 0;
 77     }
 78     for( int i=top; i>=2; i-- )
 79         adde( stk[i-1], stk[i] );
 80 }
 81 dnt sml, big, sum, cnt;
 82 void dodp( int u ) {
 83     if( ikey[u] ) {
 84         dp[u][0] = 0;
 85         dp[u][1] = 0;
 86         dp[u][2] = 1;
 87         dp[u][3] = 0;
 88     } else {
 89         dp[u][0] = oo;
 90         dp[u][1] = -oo;
 91         dp[u][2] = 0;
 92         dp[u][3] = 0;
 93     }
 94     for( int t=head[u]; t; t=next[t] ) {
 95         int v=dest[t]; 
 96         dnt w=dep[v]-dep[u];
 97         dodp(v);
 98         dp[u][0] = min( dp[u][0], dp[v][0]+w );
 99         dp[u][1] = max( dp[u][1], dp[v][1]+w );
100         dp[u][2] += dp[v][2];
101         dp[u][3] += dp[v][3]+w*dp[v][2];
102     }
103     if( ikey[u] ) {
104         sml = 0;
105         big = 0;
106         sum = 0;
107         cnt = 1;
108     } else {
109         sml = oo;
110         big = -oo;
111         sum = 0;
112         cnt = 0;
113     }
114     for( int t=head[u]; t; t=next[t] ) {
115         int v=dest[t]; 
116         dnt w=dep[v]-dep[u];
117         ans[0] = min( ans[0], sml+w+dp[v][0] );
118         ans[1] = max( ans[1], big+w+dp[v][1] );
119         ans[2] += cnt*(dp[v][3]+w*dp[v][2]) + sum*dp[v][2];
120         sml = min( sml, dp[v][0]+w );
121         big = max( big, dp[v][1]+w );
122         cnt += dp[v][2];
123         sum += dp[v][3]+w*dp[v][2];
124     }
125 }
126 int main() {
127     scanf( "%d", &n );
128     for( int i=1,u,v; i<n; i++ ) {
129         scanf( "%d%d", &u, &v );
130         g[u].push_back( v );
131         g[v].push_back( u );
132     }
133     anc[1][0] = 1;
134     dep[1] = 0;
135     dfs(1);
136     scanf( "%d", &m );
137     for( int i=1; i<=m; i++ ) {
138         scanf( "%d", &qcnt );
139         for( int j=1; j<=qcnt; j++ )
140             scanf( "%d", aa+j );
141 
142         if( qcnt==1 ) {
143             printf( "0 0 0\n" );
144             continue;
145         }
146 
147         build();
148 
149         for( int j=1; j<=qcnt; j++ )
150             ikey[aa[j]] = 1;
151         ans[0] = oo;
152         ans[1] = 0;
153         ans[2] = 0;
154         dodp(1);
155         for( int j=1; j<=qcnt; j++ )
156             ikey[aa[j]] = 0;
157 
158         printf( "%lld %lld %lld\n", ans[2], ans[0], ans[1] );
159     }
160 }
View Code

 

转载于:https://www.cnblogs.com/idy002/p/4394525.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode添加源文件_VSCode自制的IDE编译多个源文件

文/EdwardVSCode的预定义变量我们上一篇文章中讲述了如何将MinGW工具嵌入到VSCode文本编辑器中&#xff0c;在这个配置的过程中&#xff0c;我们只需要通过修改VSCode生成的“luanch.json”和“task.json”两个JSON文件中的特定字段&#xff0c;就可以实现开发环境的搭建。那么…

c# 第四课 interfaces

An interface is a contract(协定) that guarantees to a client how a class or struct will behave.When a class implements an interface(实现一个接口), it tells any potential(可能的) client “I guarantee I’ll support all the methods, properties, events, and in…

mysql+自动还原备份_Mysql 自动备份与恢复

自动备份MySql 5.0有三个方案&#xff1a;备份方案一&#xff1a; 通过 mysqldump命令,直接生成一个完整的 .sql 文件Step 1: 创建一个批处理(说明&#xff1a;root 是mysql默认用户名, aaaaaa 是mysql密码, bugtracker 是数据库名)------------mySql_backup.bat--------------…

SqlServer按时间自动生成生成单据编号

SET _tmpDateTime GETDATE() EXEC dbo.Dtw_Common_GenerateProofCode ProofType SO,WhsCodeWhsCode, ProofDate _tmpDateTime, RtnCode _tmpProofCode OUTPUT --生成的最终的CODE USE [SZVB]GO/****** Object: StoredProcedure [dbo].[Dtw_Common_GenerateProofCode]…

hive创建分区表 指定分隔符_HIVE 对于分区表的操作

CREATE EXTERNALTABLE IF NOT EXISTS data_zh(ROWKEY STRING,STATION INT,YEAR INT,MONTH INT,DAY INT,HOUR INT,MINUTE INT,)PARTITIONED BY (AGE INT)指定分区(此列并没真正存储列&#xff0c;也就是不存于你的数据中。但是如果你的数据从Oracle按年份导出&#xff0c;按照年…

Web Service 学习

1. Web services 平台的元素&#xff1a; SOAP (简易对象访问协议) UDDI (通用描述、发现及整合) WSDL (Web services 描述语言)1.1 什么是 SOAP&#xff1f; 基本的 Web services 平台是 XML HTTP。 SOAP 指简易对象访问协议 SOAP 是一种通信协议 SOAP 用于应用程序之间的通信…

java高级mysql面试题_Java高级面试题

一.基础知识&#xff1a;1)集合类&#xff1a;List和Set比较&#xff0c;各自的子类比较(ArrayList&#xff0c;Vector&#xff0c;LinkedList&#xff1b;HashSet&#xff0c;TreeSet)&#xff1b;2)HashMap的底层实现&#xff0c;之后会问ConcurrentHashMap的底层实现&#x…

转:Oracle 中union的用法

UNION 指令的目的是将两个 SQL 语句的结果合并起来,可以查看你要的查询结果. 例如: SELECT Date FROM Store_Information UNION SELECT Date FROM Internet_Sales 注意:union用法中,两个select语句的字段类型匹配,而且字段个数要相同,如上面的例子,在实际的软件开发过程,会遇到…

mysql skip_counter_mysql的三个故障解决小结

mysql使用过程中经常会遇到的三个故障&#xff0c;在此小结一下。1、MySQl服务无法启动我们在使用mysql的过程中&#xff0c;常会遇到MySQl服务无法启动&#xff0c;具体报错信息&#xff1a;Starting MySQL ERROR.The server quit without updating PID file (/[FAILED]l/mysq…

Httpd 使用ip可以访问,localhost和127.0.0.1不能访问

解决方法&#xff1a;打开/etc/httpd/conf目录下的httpd.conf文件&#xff0c; 加入 Listen 127.0.0.1:81 加入后&#xff1a; Listen xxx.xxx.xxx.xxx:81 Listen 127.0.0.1:81 其中xxx.xxx.xxx.xxx是我的ip 这样通过ip、localhost、127.0.0.1都可以访问了 转载于:https://www.…

如何将每一条记录放入到对应的范围中

编程序的时候遇到一个问题&#xff1a; 画热图 &#xff1a;计算热力值--->画网格&#xff0c;将在一定范围内定位出的mac累积计数--->编写出了定位程序&#xff0c;但是如何将每个具体的坐标值放入对应的范围&#xff08;网格&#xff09;--->因为具体坐标和网格选取…

mysql主从进行扩展_Mysql主从知识扩展部分1

一、使用mysql-proxy 快速实现mysql 集群 读写分离1、有两种方法&#xff1a;a)程序代码内部实现&#xff0c;对select操作分发到从库&#xff0c;其他到主库&#xff0c;再生产环境中应用比较广泛&#xff0c;比较知名的有DISCUZX2&#xff0c;优点性能好&#xff0c;成本低&a…

Python之异常追踪模块:traceback

正常时输出追踪信息&#xff1a; import traceback def stack():print The python stack:traceback.print_stack() from twisted.internet import reactor reactor.callWhenRunning(stack) reactor.run()#摘录来自: likebeta. “Twisted与异步编程入门”。 iBooks. 异常时输出…

mysql事务所_mysql事务

1.事务的ACID属性事务(Database Transaction) &#xff0c;是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成&#xff0c;否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元&…

[草稿]挂载新硬盘

查看新硬盘&创建分区 xxxxxx:/dev$ sudo fdisk -l [sudo] password for xxx: Disk /dev/sda: 85.9 GB, 85899345920 bytes 255 heads, 63 sectors/track, 10443 cylinders, total 167772160 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/physical):…

php mysql 迁移_将phpstudy中的mysql迁移至Linux教程

项目目的将原来windows环境中使用phpstudy搭建的mysql 5.5.53 中的数据迁移至新主机Linux环境中环境情况新主机系统平台&#xff1a;CentOS release 7.4 (Final) 内核 3.10.0-693.el7.x86_64mysql环境&#xff1a;mysql> statusServer version: 5.6.39-log…

Swift 操作符

这里只记录一些swift特殊的运算符 1.swift里面 仅仅进行赋值操作&#xff0c;不再向右边返回左值 2.模运算的操作数可以是小数了 3.Nil Coalescing Operator nil coalescing operator用来判断一个可选值是否有值&#xff0c;如果没有的话就赋予其一个缺省值 注意这里面“&…

python json.dumps慢_python json.dumps中文乱码问题解决

json.dumps(var,ensure_asciiFalse)并不能解决中文乱码的问题json.dumps在不同版本的Python下会有不同的表现&#xff0c; 注意下面提到的中文乱码问题在Python3版本中不存在。注:下面的代码再python 2.7版本下测试通过# -*- coding: utf-8 -*-odata {a : 你好}print odata结果…

UIView常见方法总结

一、随机生成数 1. arc4random() 会生成任意正整数和0 2. arc4random_uniform(100) 会生成0~99的整数 &#xff08;包括0和99&#xff09; 二、UIView常见方法 1. addSubview:(UIView *)child 添加子控件用&#xff08;最新添加的子控件&#xff0c;会显示在最上面&#xff09;…

netty java_Netty框架学习及第一个Netty应用

编辑推荐:本文来自于csdn,文章主要介绍了Netty的基础&#xff0c;有什么特点&#xff0c;其构成部分是什么&#xff0c;以及相关的应用。1.什么是Netty&#xff1f;Netty是一个利用Java的高级网络的能力&#xff0c;隐藏其背后的复杂性而提供一个易于使用的API的客户端/服务器框…