热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CF487ETourists圆方树套路题

CF487ETourists题目很套路,现将利用点双建成圆方树,对于每一个点双的方点用于存周边圆点的min,方点需要用multiset维

CF487E Tourists

题目很套路,现将利用点双建成圆方树,对于每一个点双的方点用于存周边圆点的min,方点需要用multiset维护圆点儿子的值,当然也需要每个点维护自己的权值。

建树完成后基本就是树剖的板子了,需要注意的是如果找到最后一点一个点事方点的话,需要将方点的父亲进行统计


#include
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define re register int
#define void inline void
#define eps 1e-9
//#define mod 1e9+7
//#define ls(p) p<<1
//#define rs(p) p<<1|1
//#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
#define fi first
#define se second
#define unordered_map map
#define __int128 long long
#define x0 xx0
#define y0 yy0
using namespace std;
const int mod&#61;1e9&#43;7;
const int N&#61;8e5&#43;5;
int n,m,q,all;
multiset < int > SM[N];
int w[N];
namespace SEG
{#define ls(p) p<<1#define rs(p) p<<1|1int sum[N],a[N];void push(int p){sum[p]&#61;min(sum[ls(p)],sum[rs(p)]);}void bulid(int p,int l,int r){if(l&#61;&#61;r){sum[p]&#61;a[l];return;}int mid&#61;(l&#43;r)>>1;bulid(ls(p),l,mid);bulid(rs(p),mid&#43;1,r);push(p);}void update(int p,int l,int r,int pos,int val){if(l&#61;&#61;r){sum[p]&#61;val;return;}int mid&#61;(l&#43;r)>>1;if(pos<&#61;mid) update(ls(p),l,mid,pos,val);else update(rs(p),mid&#43;1,r,pos,val);push(p);}int ask(int p,int l,int r,int L,int R){if(L<&#61;l&&r<&#61;R) return sum[p];int mid&#61;(l&#43;r)>>1;int ans&#61;1e9;if(L<&#61;mid) ans&#61;min(ans,ask(ls(p),l,mid,L,R));if(mid<R) ans&#61;min(ans,ask(rs(p),mid&#43;1,r,L,R));return ans;}#undef ls#undef rs
}
namespace GP2
{struct node{int ver,next;}e[N];int tot&#61;1,head[N];int d[N],top[N],dfn[N],sz[N],son[N],fa[N];int num;void add(int x,int y){e[&#43;&#43;tot].ver&#61;y;e[tot].next&#61;head[x];head[x]&#61;tot;}void addedge(int x,int y){add(x,y);add(y,x);}void dfs1(int x,int pre){int ma&#61;-1;sz[x]&#61;1;d[x]&#61;d[pre]&#43;1;fa[x]&#61;pre;for(re i&#61;head[x];i;i&#61;e[i].next){int y&#61;e[i].ver;if(y&#61;&#61;pre) continue;dfs1(y,x);sz[x]&#43;&#61;sz[y];if(sz[y]>ma) son[x]&#61;y,ma&#61;sz[y];}}void dfs2(int x,int pre){dfn[x]&#61;&#43;&#43;num;top[x]&#61;pre;if(!son[x]) return;dfs2(son[x],pre);for(re i&#61;head[x];i;i&#61;e[i].next){int y&#61;e[i].ver;if(y&#61;&#61;son[x]||y&#61;&#61;fa[x]) continue;dfs2(y,y);}}void init(){dfs1(1,0);dfs2(1,1);for(re i&#61;1;i<&#61;n;i&#43;&#43;) SEG::a[dfn[i]]&#61;w[i];for(int i&#61;n&#43;1;i<&#61;all;i&#43;&#43;){for(int j&#61;head[i];j;j&#61;e[j].next){int y&#61;e[j].ver;if (y!&#61;fa[i]) SM[i].insert(w[y]);}if(SM[i].empty()) w[i]&#61;1e9;else w[i]&#61;*SM[i].begin();SEG::a[dfn[i]]&#61;w[i];}SEG::bulid(1,1,all);}void add1(int x,int num){int f&#61;fa[x];if(f){SM[f].erase(SM[f].find(w[x]));SM[f].insert(num);w[f]&#61;*SM[f].begin();SEG::update(1,1,all,dfn[f],w[f]);}w[x]&#61;num;SEG::update(1,1,all,dfn[x],num);}int ask(int x,int y){int ans&#61;1e9;while(top[x]!&#61;top[y]){if(d[top[x]]<d[top[y]]) swap(x,y);ans&#61;min(ans,SEG::ask(1,1,all,dfn[top[x]],dfn[x]));x&#61;fa[top[x]];}if(d[x]>d[y]) swap(x,y);ans&#61;min(ans,SEG::ask(1,1,all,dfn[x],dfn[y]));if(x>n) ans&#61;min(ans,w[fa[x]]);// return ans;}
}
namespace GP1
{struct node{int ver,next;}e[N];int tot&#61;1,head[N];int dfn[N],low[N];int num,instack[N],top,sum;void add(int x,int y){e[&#43;&#43;tot].ver&#61;y;e[tot].next&#61;head[x];head[x]&#61;tot;}void addedge(int x,int y){add(x,y);add(y,x);}void tarjan(int x,int in_edge){dfn[x]&#61;low[x]&#61;&#43;&#43;sum;instack[&#43;&#43;top]&#61;x;
// cout<for(re i&#61;head[x];i;i&#61;e[i].next){int y&#61;e[i].ver;if(!dfn[y]){tarjan(y,i);low[x]&#61;min(low[x],low[y]);if(low[y]>&#61;dfn[x]){all&#43;&#43;;w[all]&#61;1e9;int z;do{z&#61;instack[top--];GP2::addedge(z,all);}while(z!&#61;y);GP2::addedge(x,all);w[all]&#61;min(w[all],w[x]);}}else if(i!&#61;(in_edge^1)) low[x]&#61;min(low[x],dfn[y]);}}
}
void solve()
{cin>>n>>m>>q;all&#61;n;for(re i&#61;1;i<&#61;n;i&#43;&#43;) scanf("%d",&w[i]);for(re i&#61;1;i<&#61;m;i&#43;&#43;){int x,y;scanf("%d%d",&x,&y);GP1::addedge(x,y);}GP1::tarjan(1,0);GP2::init();while(q--){char op[5];int x,y;scanf("%s%d%d",op,&x,&y);if(op[0]&#61;&#61;&#39;C&#39;) GP2::add1(x,y);else printf("%d\n",GP2::ask(x,y));}
}
signed main()
{
// fflush(stdout);
// srand(102321547);
// freopen("9.in.txt", "r", stdin);
// freopen("9.out.txt", "w", stdout);
// freopen("9.out", "w", stdout);int T&#61;1;
// cin>>T;for(int index&#61;1;index<&#61;T;index&#43;&#43;){
// printf("Case %d: ",index);solve();
// puts("");}return 0;
}
/*
7 9 1
1
2
3
4
5
6
7
1 2
2 5
1 5
2 3
3 4
2 4
5 6
6 7
5 7
A 6 7*/


推荐阅读
  • P2765魔术球问题这道题的思路实在是太罕见了,所以发一篇blog从某一新放入的球开始看起1.放入原来的柱子上2.放入新的柱子并将每个点进行拆点࿰ ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讲述了CodeForces1016C题目的解法。文章首先介绍了一种错误的理解,然后给出了正确的解法。其中,当位于一个角上时,有两种选择,一种是先一直走一行再返回来走,另一种是走到这一列的另一行上然后再往右走一列。作者给出了两种解法,一种是直接计算,一种是动态规划。最后,取两种解法的最优解作为答案。文章附上了源代码。 ... [详细]
  • 796.[APIO2012]派遣在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为Master。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
author-avatar
摇身一变鄙人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有