【题解】P2610 [ZJOI2012]旅游
题意
T国的国土可以用一个凸N边形来表示,包含 \(N-2\) 个城市,每个城市都是顶点为 \(N\) 边形顶点的三角形,两人的旅游路线可以看做是连接N个顶点中不相邻两点的线段。问一路能经过最多多少城市。
一个城市被当做经过当且仅当其与线路有至少两个公共点。
思路
很巧妙的一道题。(不愧是ZJOI)
三角剖分是个很有意思的信息。不是让你想递推啊喂
考虑什么样的城市是不满足三角剖分的。会发现,不可能存在一些城市围成一圈(这样有一个点就会在内部而不是端点),所以如果将相邻的城市连边,是不可能存在环的。没有环,又是连通的,那么就是树了。
问题就转化成了求树的直径,裸题。
然而事实上,建图有亿点麻烦...但是非常幸运的是,由于这道题是三角形,所以肯定是二叉树,那么我们有pair!我们有 map!我们有STL!重点是我们有O2!
于是这道题就做完了。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct edge
{
int to,nxt;
}e[N<<1];
int head[N],tot=0,n,s[N][3],ans,g[N],f[N];
map<pair<int,int>,int> mp;
void add( int u,int v )
{
e[++tot].to=v; e[tot].nxt=head[u]; head[u]=tot;
e[++tot].to=u; e[tot].nxt=head[v]; head[v]=tot;
}
int dfs( int u,int fa )
{
for ( int i=head[u]; i; i=e[i].nxt )
{
int v=e[i].to;
if ( v==fa ) continue;
int dis=dfs( v,u )+1;
if ( f[u]<dis ) g[u]=f[u],f[u]=dis;
else if ( g[u]<dis ) g[u]=dis;
}
ans=max( ans,f[u]+g[u]+1 );
return f[u];
}
void build( int i,int j,int u )
{
pair<int,int> pr=make_pair( i,j );
if ( mp[pr] ) add( u,mp[pr] );
else mp[pr]=u;
}
int main()
{
scanf( "%d",&n );
for ( int i=1; i<=n-2; i++ )
{
scanf( "%d%d%d",&s[i][0],&s[i][1],&s[i][2] ); sort( s[i],s[i]+3 );
build( s[i][0],s[i][1],i ); build( s[i][1],s[i][2],i ); build( s[i][0],s[i][2],i );
}
dfs( 1,0 );
printf( "%d",ans );
return 0;
}
【题解】P2610 [ZJOI2012]旅游的更多相关文章
- [洛谷P2610] [ZJOI2012]旅游
洛谷题目链接:[ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个 ...
- P2610 [ZJOI2012]旅游
题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出 ...
- P2610 [ZJOI2012]旅游 树的直径
这个题就是建图不太好建,但是我们一想,三角形貌似只能两两挨着,最后会变成一个二叉树,所以问题就变成求树的直径.建图用pair套map超级简单. 题干: 到了难得的暑假,为了庆祝小白在数学考试中取得的优 ...
- [ZJOI2012]旅游(树的直径)
[ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示 ...
- 题解 P2610 【[ZJOI2012]旅游】
今天模拟赛考了这道题,那就来水一篇题解吧...(话说提高组模拟赛考什么省选题啊??) 这道题要我们求一条线段最多能经过的三角形数量. 回想小学学过的奥数,老师告诉过我们这样一件事:`点无大小 线无粗细 ...
- BZOJ2657:[ZJOI2012]旅游——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2657 https://www.luogu.org/problemnew/show/P2610 到了难 ...
- P2610 【[ZJOI2012]旅游】(dfs+树的直径)
楼下那篇题解说实话就是什么都没说,所以我再发一篇正常一点的. 楼下思路大体是正确的,但是之所以是说什么都没说,是因为他有两个比较致命的遗漏.首先是点,这里的点不是平时我们认为的点,如果多少接触过对偶图 ...
- BZOJ2657 [Zjoi2012]旅游(journey) 【树的直径】
题目 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出境口 ...
- [bzoj2657][Zjoi2012]旅游 journey_ 对偶图_树形dp
旅游 bzoj-2657 Zjoi-2012 题目大意:题目链接 注释:$1\le K\le 2\cdot 10^5$. 想法:这题... 感觉和上一个题的提示有些类似,就是题目生怕你不知道这是一道对 ...
随机推荐
- UNP——第四章,TCP套接字编程
1.socket 函数 首先被调用的函数,用于选择通信协议. socket调用成功后,得到的套接字为主动套接字CLOSED状态. PF 和 AF 的关系 PF的是协议族,AF是地址族,理论上一个PF包 ...
- create-react-app添加对TypeScript支持
背景 最近一直在重构react项目,由于项目历史原因,将之前parcel打包工具换成了webpack,并选择了使用create-react-app作为项目开发脚手架. 接着就是把项目中flow类型检查 ...
- Python_爬虫项目
1.爬虫--智联招聘信息搜集 原文链接 1 #-*- coding: utf-8 -*- 2 import re 3 import csv 4 import requests 5 from tq ...
- Linux安装部署Redis(超级详细)
前言 网上搜索了一筐如何在Linux下安装部署Redis的文章,各种文章混搭在一起勉强安装成功了.自己也记录下,方便后续安装时候有个借鉴之处. Redis版本 5.0.4 服务器版本 Linux Ce ...
- 百度ping工具
function postUrl($url, $postvar) { $ch = curl_init(); $headers = array( "POST".$url." ...
- 教你在CorelDRAW中制作水印
水印是一种数字保护的手段,在图像上添加水印即能证明本人的版权,还能对版权的保护做出贡献.也就是在图片上打上半透明的标记,因其具有透明和阴影的特性,使之不管在较为阴暗或明亮的图片上都能完美使用,嵌入的水 ...
- Vegas视频的音频叠加效果怎么实现,可以用其他软件吗
有时我们会用Vegas为某段影片配音,我们要怎么把配音和背景声融合在一起呢?想必马上会有人反应过来:让配音和背景声分别置于两条轨道上就好了.这当然是一个相当好的方式. 可是,如果我想要把两段音频合成一 ...
- 「CF578F」 Mirror Box
description CF578F solution 考虑转化题目的要求 1.对于任意一条边,都存在一条从界垂直射入的光线,经过反射穿过这条边. 当图中有环时,环内的边一定不满足条件,而在不存在环时 ...
- 浅谈 STL
简介 STL是Standard Template Library的简称,中文名标准模板库,从根本上说,STL是一些"容器"的集合,这些"容器"有list,vec ...
- Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree 题解(贪心+易错)
题目链接 题目大意 给你一课树,要你给每一条边分权值,每条边的权值大于0,他们的乘积等于k,而且要使得n-1条边1的数量尽可能少,定义 f(u,v)为u到v的边权和求 \(\max \sum_{i=1 ...