摘要:
给出一个初始为0的序列。 询问区间最大值,并同时支持区间修改和区间翻转。 就正常模仿线段树,给Splay打懒标记即可。 巨大的坑就是要保证虚拟节点,0,1,n+2不对答案产生影响。 这里把他们的权值和区间值全置为负无穷。 //区间修改 //区间反转 //区间求MAX #include<bits/st 阅读全文
摘要:
给出一个数组,请你支持单点修改或询问区间第k小。 先离散化。 然后对线段树的每个节点维护一颗权值线段树。 权值线段树内存放区间内的所有点。 然后单点修改操作就是先把对应树链上的a_x全删了,然后把a_x改成y,再插入。 询问第k小就是先dfs出与这个区间有关的线段树节点。 然后在这些节点对应的权值线 阅读全文
摘要:
给出一个序列。 每次询问区间最小的众数 强制在线 预处理出两个数组: \(a[i][j]\):表示第i个块到第j个块的最小的众数。 \(b[i][j]\):表示前i个块中值j出现了几次,这里j需要先离散化。 预处理出a数组和b数组。 预处理a:枚举i和j,用数组暴力维护同一个i的所有j的答案。(从前 阅读全文
摘要:
题意: 给一棵树,每条边有权,求一条简单路径,使得权值和等于k且边权最小。 题解: DSU on Tree裸题,合并的时候套个map就行。注意慎用Splay,Splay常数巨大,并且感觉好像复杂度并不是均摊的。 #include<bits/stdc++.h> using namespace std; 阅读全文
摘要:
树链剖分 对树上的一条链加$12,22,...n^2$。 每次询问单点。 我们设L是u和v的LCA。 那么对于链u->L,区间加上$(dep_u-dep_x+1)^2$。 即加上$(dep_x-dep_u-1)^2$ 对于链L->v,区间加上$(dep_u-dep_L+1+dep_x-dep_L)^ 阅读全文
摘要:
题意: 给出一个序列。 每次询问一个区间内有多少个不同的数异或a<=b。 题解: 首先有个前置知识,就是不带区间的情况下有多少个不同的数异或a<=b,这是一个经典的字典树上DP的模型,找到对应的子树统计信息即可,这里不再赘述。 然后考虑区间,如果把不同的数这个条件去掉,可以直接上可持久化字典树。 但 阅读全文
摘要:
区间开平方直接上暴力即可。 因为一个数开几次就到1了。 维护一个区间最大值,当该区间最大值是1的时候直接return。 复杂度O(nlognlogn)? #include<bits/stdc++.h> using namespace std; const int maxn=1e5+100; int 阅读全文
摘要:
前置结论:给出n个点,选择一个点p使得这个n个点到p的距离之和最小。 那么这个p一定是中间两个点的线段或中间一个点。 基于这个结论,考虑用线段树维护区间点权和和区间点权乘坐标的和。 然后对每个区间询问,二分出p的位置,对p之前和p之后的区间分类计算。 修改操作就是毒瘤离散化+模拟。 #include 阅读全文
摘要:
暴力枚举两个端点,BFS算偏心距。 有O(n)的做法,跪了 #include<bits/stdc++.h> using namespace std; const int maxn=305; vector<pair<int,int> > g[maxn]; int n,s; int vis[maxn], 阅读全文
摘要:
有一个数列,初始值均为0,他进行N次操作,每次将数列[ai,bi)这个区间中所有比Hi小的数改为Hi,他想知道N次操作后数列中所有元素的和。 //每次把比Hi小的数改成Hi //把所有询问按Hi从小到大排序 //暴力修改即可 #include<bits/stdc++.h> using namespa 阅读全文