[CF1093G]Multidimensional Queries 题解】的更多相关文章

前言 DennyQi太巨了! 定义一个点\(a\),\(a_x\)表示\(a\)在第\(x\)维空间上的坐标值 题解 这题的思路珂以说非常巧妙(原谅我又用了这个"珂"), 我们知道曼哈顿距离是\(\sum|a_i-b_i|\),\(|a_i-b_i|\)其实也珂以看作是\((a_i-b_i)\)和\((b_i-a_i)\)中较大的那个. 根据上面的分析曼哈顿距离珂以看作是\(\sum max(a_i-b_i,b_i-a_i)\), 继续分析珂以得出,每个点在每一维度上要应用的无非只有两…
[CF1093G]Multidimensional Queries 题目大意: \(k(k\le5)\)维空间中有\(n(n\le2\times10^5)\)个点.\(m\)次操作,操作包含一下两种: 将第\(i\)个点改为\((b_1,b_2,\ldots,b_k)\). 询问编号在\([l,r]\)内的所有点对中,曼哈顿距离的最大值. 思路: 枚举每一维坐标对答案的贡献的符号是正还是负,总共\(2^{k-1}\)种情况.每种情况用线段树维护最大/最小值.询问时在每棵线段树上查询区间最大值-区…
分析 非常有趣的一道题. 式子中的绝对值很难处理,但是我们发现: \[\sum_{i=1}^{k}|a_{x,i}-a_{y,i}|=\sum_{i=1}^{k}max(a_{x,i}-a_{y,i},a_{y,i}-a_{x,i})=max\{\sum_{i=1}^{k}c_ia_{x,i}-\sum_{i=1}^{k}c_ia_{y,i}\}\] 其中\(c\)是所有长度为\(k\)的只由\(-1\)和\(1\)组成的数列,共有\(2^k\)种. 所以我们可以对于每一种\(c\)维护一棵支持…
G. Multidimensional Queries 链接 分析: 考虑如何去掉绝对值符号. $\sum \limits_{i = 1}^{k} |a_{x, i} - a_{y, i}|$,由于k比较小,考虑枚举每一维的符号,发现如果不是最终的答案,结果会变小,不影响取max的操作. 然后就是单点修改,区间查询最大最小值. 代码: #include<cstdio> #include<algorithm> #include<cstring> #include<i…
题目:http://codeforces.com/contest/1093/problem/G 只好看看题解:https://codeforces.com/blog/entry/63877 主要是把绝对值符号消掉,变成枚举正负.因为答案不会变差,所以不用管符号应该是什么,直接对应地取 max . min 即可. #include<cstdio> #include<cstring> #include<algorithm> #define ls Ls[cr] #define…
感觉CF的题目名都好朴素的样子 你谷链接 首先这题显然是个dsu on tree 但是我不会. 其次这题显然是个莫队.这我会啊! 然后会发现好像不是很对劲.因为每次询问都有一个k,貌似和传统的莫队数颜色有点不一样. 本蒟蒻看到这里的时候内心是崩溃的.然后就看了一眼题解. 然后我就迷惑了.震惊,前缀和还可以O(1)修改,活到爆! 然后经过郭神的一番论证以后,我惊讶的发现,这个题还真能O(1)修改前缀和. 首先,两个数组.sum[i]表示出现次数大于i的颜色的数量.val[i]表示颜色i的出现次数.…
POJ2926 先学会这个哈夫曼距离的处理才能做 cf 的G #include <iostream> #include <stdio.h> #include <algorithm> #include <cstring> #include <cmath> using namespace std; #define maxn 100005 const int inf = (int)1e9; ]; <<+],mx[<<+]; in…
题目分析: 搜索2^k种情况,线段树分别处理就行了,正确性明显. 代码: #include<bits/stdc++.h> using namespace std; ; int n,k; ];}a[maxn]; <<][maxn*],Tmin[<<][maxn*]; void Modify(int now,int tl,int tr,int dt,int pos){ if(tl == tr){ ; ;i<k;i++){ <<i))ans += a[tl]…
题意:给定N个K维的点,Q次操作,或者修改点的坐标:或者问[L,R]这些点中最远的点. 思路:因为最后一定可以表示维+/-(x1-x2)+/-(y1-y2)+/-(z1-z2)..... 所以我们可以保存到线段树里,每次求区间最大值和最小值即可. 注意到我们可以先确定一个点的正负号,所以时间和空间节省了一半. #include<bits/stdc++.h> #define mp make_pair #define pii pair<int,int> #define F first…
题目链接: https://codeforces.com/contest/1093/problem/G 题目: 题意: 在k维空间中有n个点,每次给你两种操作,一种是将某一个点的坐标改为另一个坐标,一种操作是查询[l,r]中曼哈顿距离最大的两个点的最大曼哈顿距离. 思路: 对于曼哈顿距离,我们将其绝对值去掉会发现如下规律(以二维为例): 故这题我们可以用线段树来维护[l,r]中上述每种情况的最大值和最小值,用二进制来枚举xy的符号(1为正,0为负),最后答案是 每种情况中区间最大值-区间最小值…