题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空位就用二分 + 主席树 理应可以在主席树上的区间二分而做到\(O(nlogn)\),但是写不出来,先留着坑 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #in…
题面 传送门 题解 首先考虑一个贪心,我们把所有的人按\(a_i\)排个序,那么排序后的第一个人到\(k\),第二个人到\(k+1\),...,第\(i\)个人到\(k+i-1\),易证这样一定是最优的 然后发现这里有一个很重要的性质,\(a_i\)互不相同.那么就必定存在一个点\(mid\),在\(mid\)左边(包括\(mid\))的空格子和人一样多,右边(不包括\(mid\))也一样多 那么很明显,\(mid\)左边的所有人都需要往右跑,\(mid\)右边的所有人都需要往左跑 然后来康康答…
P1979 华容道 题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的: 有些棋子是固定的,有些棋子则是可以移动的: 任何与空白的格子相邻(…
https://www.luogu.org/problem/show?pid=1081 太遗憾了明明写出来了,却把最小值初始值弄小了,从第二个点开始就不可能对了.70分! #include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int n,…
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题.你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令. 对于每一个询问指令,你必须输出正确的回答. 输入输出格式 输…
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上差分的小套路--每一个点到根的前缀和还是很好维护对吧. 询问\(u,v\)的时候,我们可以知道\(size[root,u]\)和\(size[root,v]\)的和. 但我们需要的只是一条路径,\(lca(u,v)\)以上的全不要,\(lca(u,v)\)也只要算一次. 于是用\(size[root…
传送门 BZOJ 然而是权限题 洛谷 Solution 发现题目给出的一些规律,emm,如果我们新凑出来的一个数,那么后面一个数一定是\(sum+1\). 于是就可以主席树随便维护了! 代码实现 #include<bits/stdc++.h> using namespace std; inline int gi(){int x;scanf("%d",&x);return x;} const int N=100010; int rt[N],tot; int n,a[N…
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上差分的小套路--每一个点到根的前缀和还是很好维护对吧. 询问\(u,v\)的时候,我们可以知道\(size[root,u]\)和\(size[root,v]\)的和. 但我们需要的只是一条路径,\(lca(u,v)\)以上的全不要,\(lca(u,v)\)也只要算一次. 于是用\(size[root…
洛谷P2633/bzoj2588 Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文. 输入输出格式 输入格式: 第一行两个整数N,M. 第二行有N个整数,其中第i个整数表示点i的权值. 后面N-1行每行两个整数(x,y),表示点x到点y有一条边. 最后M行每行两个整数(u,v,k),表示一组询问. 输…
题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 \[min(deep(p)-1,k)*size(p)\] 显然是可以直接算的. 2.\(b\)是\(a\)的孩子,对答案的贡献为 \[\sum_{\text{v是u的孩子且deep(v)<=deep(u)+k}}size[v]\] 后半段就可以主席树来维护了. 下标为深度,值为\(\sum siz…
题面传送门 一道码农题---- u1s1 感觉这类题目都挺套路的,就挑个有代表性的题写一篇题解罢. 首先注意到答案满足可二分性,故考虑二分答案 \(mid\),转化为判定性问题. 考虑怎样检验 \(mid\) 是否可行,它等价于是否存在 \(s[a...b]\) 中的一个子串 \(t\) 满足 \(s[c...c+mid-1]\) 为 \(t\) 的前缀.不过不难发现这个"前缀"是假的,因为 \(\forall a\le l\le r\le b\),\(s[l...r]\) 的任意一个…
题目链接 容易发现,可能答案只有\(0\).每个数,每个数\(+1\) 于是把这\(2n+1\)个数建立一个权值线段树,可持久化一下,每个节点记录这个子树中最后加入数加入的时间的最小值\(latest\)(好好理解一下). 对于查询\((l,r)\),线段树上二分找到最小的\(latest<l\)的叶节点,那么答案就是这个节点代表的数. #include <cstdio> #include <cmath> #include <algorithm> #define…
题目链接 被自己的sb错误调到自闭.. 主席树的进阶应用. 把\(P_i\)离散化一下,得到每个\(P_i\)的排名,然后建一棵维护\(m\)个位置的主席树,每个结点记录区间总和和正在进行的任务数. 差分一下,主席树维护前缀和,每个时刻一个\(root\). 然后就是线段树里查前\(k\)小了. #include <cstdio> #include <algorithm> using namespace std; const int MAXN = 4000010; struct P…
Description 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], -, A[2k - 1]的中位数.即前1,3,5,--个数的中位数. N ≤ 100000 Solution 这题方法很多,这里介绍splay的打法 求中位数即求第$(k+1)/$2小的数,用splay维护即可,只有2中操作:插入,旋转 在树上记录一个\(c(u)\)表示节点\(u\)的子树有几个节点,用来判断第n小 只要在插入和旋转的时候维护就行了 Cod…
正解:$rmq$/主席树 解题报告: 传送门! 好像看过这题挺多次辣,,,$QwQ$ 之前$NOIp$的时候$cjk$学长讲课讲了这题(虽然那时候的$gql$太菜辣并麻油落实这道_(:з」∠)_,然后寒假考试考了这道,然后现在说搞下主席树又碰到这题辣_(:з」∠)_ 昂然后先港下题意,,,大概就给定一个序列求前$k$大区间和$QwQ$ 分别港下$rmq$和主席树趴$QwQ$ 先港$rmq$趴$QwQ$ 首先区间求和显然先搞下前缀和,这个显然是要有的$QwQ$ 考虑设$f_{i,l,r}$表示左端…
题目传送门:洛谷 P4559. 题意简述: 有 \(n\) 个学生,编号为 \(i\) 的学生有一个位置 \(a_i\). 有 \(m\) 个询问,每次询问编号在 \([l,r]\) 区间内的学生跑到区间 \([k,k+r-l]\) 中的位置花费的距离总和的最小值. 每个学生的初始位置互不相同,最终到达的位置也必须互不相同. 题解: 不难证明,学生跑到最终的位置时,他们的相对位置不改变至少是最优解之一,这可以脑补一下. 所以我们只需要求最终相对位置不变时的答案即可. 因为学生两两位置不同,所以最…
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m 名学生,方阵的行数为 n ,列数为 m . 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中的学生从 1 到 n×m 编上了号码(参见后面的样例).即:初始时,第 i 行第 j 列 的学生的编号是 (i−1)×m+j . 然而在练习方阵的时候,经常会有学生因为各种各样的事情需要离…
[洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这对点被计算的次数是\(size[u]*size[v]\)次.否则具有祖先关系,假设\(u\)是\(v\)祖先,则是\(size[v]*(n-size[u]+1)\)次. 于是先考虑所有点不具有祖先关系,再减去有祖先关系的情况就好了. 然后现在知道了统计的次数,还需要知道统计的值,显然这个\(len\…
这道题市面上就两种法:一种是SA+二分+主席树,一种是SAM+二分+主席树(有不少人打线段树合并???)(除此之外还有一种利用炒鸡水的数据的暴力SA,贼快.....)(当时学SA的时候没做这道题,现在早忘了SA了) 分析题意:就是对于一个字符串,每次询问一个子串在另一个子串里能匹配上的最大前缀(非严格前缀)长度. 我们知道,处理前缀的工具并不是十分充足,后缀倒是有一大帮,所以说把字符串倒过来,而把字符串倒过来是SAM处理问题时的常用技巧.现在,我们直接找答案,仍然很难找到一种时间复杂度合法的做法…
题目 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数. 其中a<b<c<d.位置也从0开始标号.我会使用一些方式强制你在线. 输入格式 第一行序列长度n.接下来n行按顺序给出a中的数. 接下来一行Q.然后Q行每行a,b,c,d,我们令上个询问的答案是 x(如果这是第一个询问则x=0). 令数组q={(a+x)…
[NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点. 为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳 跃距离尽可能长.由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能 移走起点和终点的岩石). 输入格式…
洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建议使用while(l <= r),会避免出现答案为 \(r\) 时和答案AFK搞混,样例就是这种情况. 复杂度为 \(O(\log n) \times\) 最短路的复杂度. 二分 + Dijkstra版本,复杂度为 \(O(\log n \times E\log E)\) . #include<s…
LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \(m\) 次询问,每次给出两个数 \(G,L\),你可以将商店里的一些果汁混合起来,使得他们的总体积不小于 \(L\) 升,总价格不超过 \(G\) 元,问:选择的果汁中美味度最小值的最大值是多少. \(1 \leq n,m \leq 10^5\),\(1 \leq d_i,p_i,l_i \leq 10^…
\(\color{#0066ff}{ 题目描述 }\) 作为一名大学生,九条可怜在去年参加了她人生中的最后一次军训. 军训中的一个重要项目是练习列队,为了训练学生,教官给每一个学生分配了一个休息位置.每次训练开始前,所有学生都在各自的休息位置休息,但是当教官发出集合命令后,被点到的学生必须要到指定位置集合. 为了简化问题,我们把休息位置和集合位置抽象成一根数轴.一共有 \(n\) 个学生,第 \(i\) 个学生的休息位置是 \(a_i\).每一次命令,教官会指定一个区间 \([l,r]\) 和集…
洛谷题面传送门 一道笛卡尔树的 hot tea. 首先我们考虑一个非常 naive 的区间 DP:\(dp_{l,r}\) 表示区间 \([l,r]\) 的答案,那么我们考虑求出 \([l,r]\) 中最大值的位置所在的位置 \(p\),那么如果我们选取的 meeting 的位置 \(\le p\),那么显然 \([p+1,r]\) 部分的贡献都是 \(a_p\),\([l,p]\) 部分的总共先最小是 \(dp_{l,p}\),最优代价为 \(dp_{l,p}+a_p·(r-p)\),否则 \…
洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V, E分别表示结点与边的集合,W表示各边长度的集合,并设T有n个结点. 路径:树网中任何两结点a,b都存在唯一的一条简单路径,用d(a,b)表示以a,b为端点的路径的长度,它是该路径上各边长度之和.我们称d(a,b)为a,b两结点间的距离. 一点v到一条路径P的距离为该点与P上的最近的结点的距离:…
题面 传送门 题解 代码不就百来行么也不算很长丫 虽然这题随机化贪心就可以过而且速度和正解差不多不过我们还是要好好学正解 前置芝士 边分治 米娜应该都知道点分治是个什么东西,而边分治,顾名思义就是对边进行分治,即每次选出一条"子树中点的个数的最大值最小"的边,处理所有经过这条边的路径的贡献,然后割掉这条边之后对子树递归下去就好了 然而出题人给你一个菊花图就能把你卡得不要不要的 我们发现上述策略在一个二叉树上是最优的,因为割掉边之后左右子树大小都会变为原来的一半 于是这里就需要多叉树转二…
To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows conveniently numbered 1..N move from the barn to her private pasture. The pastures are organized as a tree, with the barn being on pasture 1. Exactly N-1 cow…
一道技巧性非常强的计数题,历年WC出得最好(同时可能是比较简单)的题目之一. 题目传送门:洛谷P5206. 题意简述: 给定 \(n, y\). 一张图有 \(|V| = n\) 个点.对于两棵树 \(T_1=G(V, E_1)\) 和 \(T_2=G(V, E_2)\),定义这两棵树的权值 \(F(E_1, E_2)\) 为 \(y\) 的 \(G'=(V,E_1\cap E_2)\) 的联通块个数次方. 即 \(F(E_1, E_2) = y^{n - |E_1\cap E_2|}\)(因为…
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内,那就把它用并查集并起来.最后对于一个询问,直接用并查集找就好了. 但是因为有撤销操作,所以在并查集合并的时候,我们将需要合并的两个点放进栈中,最后栈序撤销,所以只能考虑按秩合并而不能路径压缩. #include <map> #include <vector> #include <…