Luogu3320 SDOI2015 寻宝游戏 链并
可以发现从哪里开始的最优答案都是一样的。我们只需要用一种比较好维护的方法维护答案就好了。
我们考虑用$dfs$序加上$set$维护链并。先预处理$dfs$序,将当前有宝藏的点丢入$set$中,按照$dfs$序排序,那么答案就是相邻两个点之间的路径的和加上第一个点到最后一个点的路径的和。动态维护这个答案九星了。
#include<bits/stdc++.h> #define int long long //This code is written by Itst using namespace std; inline int read(){ ; ; char c = getchar(); while(c != EOF && !isdigit(c)){ if(c == '-') f = ; c = getchar(); } while(c != EOF && isdigit(c)){ a = (a << ) + (a << ) + (c ^ '); c = getchar(); } return f ? -a : a; } ; struct Edge{ int end , upEd , w; }Ed[MAXN << ]; ] , dep[MAXN] , ans , N , M , ts , cntEd; struct cmp{ bool operator ()(int a , int b){ return dfn[a] < dfn[b]; } }; set < int , cmp > s; set < int , cmp > :: iterator it , it1 , it2; inline void addEd(int a , int b , int c){ Ed[++cntEd].end = b; Ed[cntEd].upEd = head[a]; Ed[cntEd].w = c; head[a] = cntEd; } void dfs(int now , int fa){ jump[now][] = fa; dep[now] = dep[fa] + ; dfn[now] = ++ts; ; jump[now][i - ] ; ++i) jump[now][i] = jump[jump[now][i - ]][i - ]; for(int i = head[now] ; i ; i = Ed[i].upEd) if(Ed[i].end != fa){ len[Ed[i].end] = len[now] + Ed[i].w; dfs(Ed[i].end , now); } } inline int jumpToLCA(int x , int y){ if(dep[x] < dep[y]) swap(x , y); ; i >= ; --i) << i) >= dep[y]) x = jump[x][i]; if(x == y) return x; ; i >= ; --i) if(jump[x][i] != jump[y][i]){ x = jump[x][i]; y = jump[y][i]; } ]; } inline int calcLen(int x , int y){ ); } inline void insert(int x){ it = s.lower_bound(x); if(it == s.end() || *it != x){ if(!s.empty()){ int p , q; if(it == s.end()) q = *s.begin(); else q = *it; if(it == s.begin()) p = *--s.end(); else p = *--it; ans = ans - calcLen(p , q) + calcLen(p , x) + calcLen(x , q); } s.insert(x); } else{ int p , q; it1 = it; ++it1; if(it1 == s.end()) q = *s.begin(); else q = *it1; it1 = it; if(it1 == s.begin()) p = *--s.end(); else p = *--it1; ans = ans + calcLen(p , q) - calcLen(p , x) - calcLen(x , q); s.erase(it); } } signed main(){ #ifndef ONLINE_JUDGE freopen("3320.in" , "r" , stdin); //freopen("3320.out" , "w" , stdout); #endif N = read(); M = read(); ; i < N ; ++i){ int a = read() , b = read() , c = read(); addEd(a , b , c); addEd(b , a , c); } dfs( , ); ; i <= M ; ++i){ insert(read()); printf("%lld\n" , ans); } ; }
Luogu3320 SDOI2015 寻宝游戏 链并的更多相关文章
- 【BZOJ3991】[SDOI2015]寻宝游戏 树链的并+set
[BZOJ3991][SDOI2015]寻宝游戏 Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩 ...
- CH#56C 异象石 和 BZOJ3991 [SDOI2015]寻宝游戏
异象石 CH Round #56 - 国庆节欢乐赛 描述 Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上 ...
- [BZOJ3991][SDOI2015]寻宝游戏
[BZOJ3991][SDOI2015]寻宝游戏 试题描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择 ...
- bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...
- P3320 [SDOI2015]寻宝游戏 解题报告
P3320 [SDOI2015]寻宝游戏 题目描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有\(N\)个村庄和\(N-1\)条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以 ...
- 【LG3320】[SDOI2015]寻宝游戏
[LG3320][SDOI2015]寻宝游戏 题面 洛谷 题解 不需要建虚树的虚树2333... 贪心地想一下,起始节点肯定是在关键点上,访问顺序就是\(dfs\)序. 那么对于每次询问, \[ An ...
- 3991: [SDOI2015]寻宝游戏
3991: [SDOI2015]寻宝游戏 https://www.lydsy.com/JudgeOnline/problem.php?id=3991 分析: 虚树+set. 要求树上许多点之间的路径的 ...
- P3320 [SDOI2015]寻宝游戏
题目 P3320 [SDOI2015]寻宝游戏 做法 很巧妙的一种思路,懂了之后觉得大水题 首先要知道:在一棵树上标记一些点,然后从任意一点出发,遍历所有的的最小路径为\(dfs\)序从小到大遍历 那 ...
- [SDOI2015]寻宝游戏(LCA,set)
[SDOI2015]寻宝游戏 题目描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到 ...
随机推荐
- python之线程相关操作(补充)
1 线程的其他方法 import threading import time from threading import Thread, current_thread def f1(n): time. ...
- 关于z-index使用方法
z-index控制的是元素的层叠顺序,当z-index越大此层越靠上:但是z-index需在已给元素定位(定位方式不限)的前提下否则该属性失效!! jquery获取index值的方法: $(" ...
- 图片缩放PhoneView
第一步:导包 implementation 'com.github.chrisbanes:PhotoView:2.0.0' 第二步:加bmob仓库地址 在build.gradle(project)中的 ...
- 云卡门禁安卓SDK_BLEDOOR_SDK_ANDROID_2016_12_15
package com.bosk.bledoor.sdk; //sdk包的开门服务类,AndroidManifest.xml 必须注册 //<service //android:name=&qu ...
- Django 拾遗
1.python_2_unicode_compatible装饰器 from django.db import models from django.utils.encoding import pyth ...
- NetBeans数据库笔记---三层架构
1.创建数据库,数据表 用MySQL数据库和Navicat for MySQL工具创建表 2.创建实体类——反应表结构(列——变量) 也就是对应表建立的gets和sets方法,实体类的名字一般都与数据 ...
- Windows 10 执行pip list报错 UnicodeDecodeError: 'gbk' codec can't decode
在命令行执行任何pip命令都报错: C:\Users\hyang0>pip --version Traceback (most recent call last): File "c:\ ...
- 【Beta Scrum】冲刺!5/5
1. 今日完成情况 人员 学号 分工 是否完成 完成情况 胡武成 031502610 解决短信内容,辅助web端解决在线编辑 Y 短信已解决,在线编辑已有解决方案 郭剑南 031502609 修改we ...
- work flow 工作流程
常用git 命令 v-1 # 切换分支 git checkout site-v1.7.8 # 提交代码前,先拉取分支 git pull # 拉取失败说明有冲突,解决冲突... # 保存在stash之中 ...
- POI生成Web版Word文件
POI生成Web版Word文件 1 通过URL的输入流实现 2 直接把Html文本写入到Word文件 所谓的使用POI生成Web版Word文件是指利用POI将Html代码插入到 ...