大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举取最大即可. 如果用树剖求$lca$, 复杂度就为$O(nlog^2n)$. #include <iostream> #include <cstdio> #include <algorithm> #include <queue> #define REP(i,a,…
BZOJ 洛谷 对树DFS得到括号序列.比如这样一个括号序列:[A[B[E][F[H][I]]][C][D[G]]]. 那比如\(D,E\)间的最短距离,就是将\(D,E\)间的括号序列取出:][[][]]][][,然后去掉其中匹配的括号,得到:]][[. 所以\(D,E\)在树上的最短距离为\(4\).因为左边一个右括号就表示向上一层,右边一个左括号就表示向下一层. 对一个区间记一个二元组\((a,b)\),表示该区间(去掉匹配括号后的)括号序列是]]..][..[,一共\(a\)个],\(b…
题目大意 给定一棵所有点初始值为黑的无权树,你需要支援两种操作: 把一个点的颜色反转 统计最远黑色点对. 题解 本题是一个树上的结构.对于树上的结构,我们可以采用点分治.树链剖分等方法处理,这个题用了一个巧妙的方法,化树为线性数列,从而解决了问题. 定义一种对一棵树的括号编码.这种编码方式很直观,所以,这里不给出严格的定义,用以下这棵树为例: 它的括号序列就是\((A(B)(C(D)(E)))\) 括号序列有着非常好的性质.对于一个括号序列,两个点之间的距离就是他们中间的括号成对消除之后剩余括号…
神做法-%dalao,写的超详细 konjac的博客. 如果觉得上面链接的代码不够优秀好看,欢迎回来看本蒟蒻代码- CODE WITH ANNOTATION 代码中−6-6−6表示左括号'[',用−9-9−9表示右括号']'. emmmm- #include<bits/stdc++.h> using namespace std; char cb[1<<15],*cs=cb,*ct=cb; #define getc() (cs==ct&&(ct=(cs=cb)+fre…
大意: 给定括号序列, 每次询问交换两个括号, 求括号树的直径. 用[ZJOI2007]捉迷藏的方法维护即可. #include <iostream> #include <algorithm> #include <cstdio> #include <queue> #define REP(i,a,n) for(int i=a;i<=n;++i) #define pb push_back #define lc (o<<1) #define rc…
这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B堆:每个节点一个,存所有儿子的堆的堆顶.特别地,如果该节点关灯,那么将加入一个0:如果没有元素,堆顶应返回负数. A堆:全局一个,存所有B堆的最大值和最小值之和.特别地,如果B堆不足两个,返回负数. 这样,我们一开始需要关闭所有的等,即对所有点调用一次turn_off.由于堆顶返回的是负数,删除时找…
这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了QAQ)百度了一下才知道有一种高大上的叫括号序列的东西= = 岛娘真是太厉害了,先丢链接:http://www.shuizilong.com/house/archives/bzoj-1095-zjoi2007hide-%E6%8D%89%E8%BF%B7%E8%97%8F/ 这个括号序列貌似可以解决一些关于树上两点距离查询的问题(可以替代点分治?)好像很高端的样子找论文看看吧 CODE:(最近在搞github,相信不久就能够…
对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数... 由此可以得出线段树的做法.. #include<cstdio> #include<iostream> #define maxn 100000 #define inf (1<<25) using namespace std; ]; struct node{ int l1,l2,r1,r2,c1,c2,dis; void val(int x){ c1=c2=; l1=l2=r1=r2…
题目链接:https://vjudge.net/problem/POJ-2886 题意:n个人围成一个圈,每个人有姓名s和权值val两个属性,第一轮序号为k的人退出,并根据其val指定下一个人,val为正即其右第val个人,val为负及其左第val个人.求第p个出局的人的姓名,其中p的约数最多,并输出约数的数量. 思路:首先是数学问题,可通过唯一分解定理或筛法打表计算出n个人时第几个出局的人的约数最多f1[n],和约数的数量f2[n],数据很小,不打表的话会超时.然后进行f1[n]次循环,每次找…
题目链接:https://vjudge.net/problem/POJ-2828 题意:有n个人,依次给出这n个人进入队列时前面有多少人p[i],和它的权值v[i],求最终队列的权值序列. 思路:基本类似于poj2182,简化题意后即为求序列1..n中第k小的值的问题.读入数据量比较大,最好读入优化.我们从n..1逆序遍历,则可以确认最后一个人的最终位置为p[n]+1,然后从序列中删除p[n]+1,继续操作倒数第二个...这一操作可以通过线段树来完成.线段树的结点包括3个值:l(区间左端点),r…
题目链接:https://vjudge.net/problem/POJ-2182 题意:有n头牛,从1..n编号,乱序排成一列,给出第2..n个牛其前面有多少比它编号小的个数,记为a[i],求该序列的完整编号ans[i]. 思路:最近几天开始学线段树,加油!!我们从序列最后一个开始,则可以确定ans[n]=a[n]+1,然后把编号a[n]+1删除,继续判断倒数第二个...而这一求序列中第k小的数可通过线段树来完成.线段树结点包含l(区间左端点),r(区间右端点),len(区间剩余的编号个数).每…
题面 请务必不要吐槽我的标签 传送门 思路 一个很重要的结论:原序列的一组同构的解等价于同一棵拥有$n$个节点的笛卡尔树 注意笛卡尔树的定义:父亲节点是区间最值,并且分割区间为左右部分 所以如果两个序列的笛卡尔树同构,那么他们的每一个区间最小值位置相同,也就是原题目中的同构条件了 一个很重要的结论:定义笛卡尔树节点的深度为根到这个节点的路径上向左走的次数,那么合法序列的笛卡尔树所有节点深度不超过$m$ 首先,我们可以定义区间的父节点是所有最值中最靠左的,那么容易得到,节点的左儿子中的所有权值严格…
题意:给出一段括号,多次询问某个区间内能匹配多少括号. 题解:线段树,结构体三个属性,多余的左括号l,多余的右括号r,能够匹配的括号数val. 当前结点的val=左儿子的val+右儿子的val+min(左儿子的l,右儿子的r).原本匹配好的括号数加上多余的可以匹配的括号. 同时在左右儿子的l和r累加后减去新匹配的括号数. #include<stdio.h> #include<iostream> #include<algorithm> #include<cstrin…
并查集 #include<stdio.h> ]; void sset(int x) { ;i<=x;i++) stt[i]=i; } int ffind(int x) { if(x==stt[x]) return x; else return stt[x]=ffind(stt[x]); } void Union(int a,int b) { int x=ffind(a); int y=ffind(b); if(x==y) return; stt[y]=x; } int main() {…
There is a sequence of brackets, which supports two kinds of operations. we can choose a interval [l,r], and set all the elements range in this interval to left bracket or right bracket. we can reverse a interval, which means that for all the element…
大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <iostream> #include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <map>…
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=3333 Description After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because Turing Tree could easily have the solution. As well, wily 3xian made lots of new…
In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 = 1; F2 = 1; Fn = Fn - 1 + Fn - 2 (n > 2). DZY loves Fibonacci numbers very much. Today DZY gives you an array consisting of n integers: a1, a2, ...,…
Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1779    Accepted Submission(s): 427 Problem Description 百度科技园内有n 个零食机,零食机之间通过n−1 条路相互连通.每个零食机都有一个值v ,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充,零食机的价值v…
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col.为了满足墨墨的要求,你知道你需要干什么了吗? 输入 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数.第2行N个整数,分别代表初始画笔排中第i支画笔的颜色.第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分. 输出…
题目描述 给出一棵树,点有点权.多次增加某个点的点权,并在某一棵子树中询问:选出若干个节点,使得每个叶子节点到根节点的路径上至少有一个节点被选择,求选出的点的点权和的最小值. 输入 输入文件第一行包含一个数n,表示树的大小. 接下来一行包含n个数,表示第i个点的权值. 接下来n-1行每行包含两个数fr,to.表示书中有一条边(fr,to). 接下来一行一个整数,表示操作的个数. 接下来m行每行表示一个操作,若该行第一个数为Q,则表示询问操作,后面跟一个参数x,表示对应子树的根:若 为C,则表示修…
http://www.lightoj.com/volume_showproblem.php?problem=1097 题意:一个自然数序列,先去掉所有偶数项,在此基础上的序列的第二项为3,则删去所有3的倍数的元素,再是7……重复操作,最后问第n项的值 思路:使用线段树构造序列,对一个数进行标记是否已被删去,和为元素个数.由于样例给出了大小,所以很容易控制空间. /** @Date : 2016-12-05-19.34 * @Author : Lweleth (SoungEarlf@gmail.c…
1095: [ZJOI2007]Hide 捉迷藏 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条走廊的分布使得任意两个屋子都互相可达.游戏是这样进行的,孩子们负责躲藏,Jiajia负责找,而Wind负责操纵这N个屋子的灯.在起初的时候,所有的灯都没有被打开.每一次,孩子们只会躲藏在没有开灯的房间中,但是为了增加刺激性,孩子…
题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条走廊的分布使得任意两个屋子都互相可达. 游戏是这样进行的,孩子们负责躲藏,Jiajia负责找,而Wind负责操纵这N个屋子的灯.在起初的时候,所有的灯都没有被打开.每一次,孩子们只会躲藏在没有开灯的房间中,但是为了增加刺激性,孩子们会要求打开某个房间的电灯或者关闭某个房间的电灯.为了评估某一次游戏的…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离. [思路] 括号序列+线段树 对树进行一遍dfs我们可以得到一个括号序列.如: [A[B[E][F[H][I]]][C][D[G]]]  E和G之间去掉匹配的括号和字母之后的串就是:  ]][[ 把它看作一个二元组(a,b)表示有a个]和b个[,而且这个二元组的形式一定是…]]]][[[…的,则E…
题意 给你一颗有 \(n\) 个点的树 , 共有 \(m\) 次操作 有两种类别qwq 将树上一个点染黑/白; 询问树上最远的两个黑点的距离. \((n \le 200000, m ≤500000)\) 题解 树上距离如果不带权的话我们很容易用一个括号序列来维护qwq 进来的时候我们添加一个左括号 把这个数字放进来 出去的时候我们添加一个右括号 其实这个和欧拉序差不多 比如 这颗树的括号序列就是 \((1(2)(3(4)(5(6(7))))(8))\) 然后有一个显然的定理 对于树上任意两个点…
[题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序列+线段树 [题解]参考:konjac 括号序列其实就是入栈出栈序,每个点在进入时加左括号和点编号,退出时加右括号. 这样做的好处:两个点间的括号数(除去匹配的括号)就是两点间路径的长度. 除去匹配的括号后,容易发现两个点间的括号时")))((("的形式,右括号就是向上一条边,左括号就是向…
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条走廊的分布使得任意两个屋 子都互相可达.游戏是这样进行的,孩子们负责躲藏,Jiajia负责找,而Wind负责操纵这N个屋子的灯.在起初的 时候,所有的灯都没有被打开.每一次,孩子们只会躲藏在没有开灯的房间中,但是为了增加刺激性,孩子们会要 求打开某个房间的电灯或者关闭某个房间…
[题目描述] Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条走廊的分布使得任意两个屋子都互相可达. 游戏是这样进行的,孩子们负责躲藏,Jiajia负责找,而Wind负责操纵这N个屋子的灯.在起初的时候,所有的灯都没有被打开.每一次,孩子们只会躲 藏在没有开灯的房间中,但是为了增加刺激性,孩子们会要求打开某个房间的电灯或者关闭某个房间的电灯.为了评估某一次…
校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同 K=2,读入l,r表示询问l~r之间能见到多少种树 (l,r>0) 格式 输入格式 第一行n,m表示道路总长为n,共有m个操作 接下来m行为m个操作 输出格式 对于每个k=2输出一个答案 样例1 样例输入1 5 4 1 1…