[CF1093G]Multidimensional Queries

题目大意:

\(k(k\le5)\)维空间中有\(n(n\le2\times10^5)\)个点。\(m\)次操作,操作包含一下两种:

  1. 将第\(i\)个点改为\((b_1,b_2,\ldots,b_k)\)。
  2. 询问编号在\([l,r]\)内的所有点对中,曼哈顿距离的最大值。

思路:

枚举每一维坐标对答案的贡献的符号是正还是负,总共\(2^{k-1}\)种情况。每种情况用线段树维护最大/最小值。询问时在每棵线段树上查询区间最大值-区间最小值,对所有的情况取最大值即可。

时间复杂度\(\mathcal O(2^kn\log n)\)。

源代码:

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<climits>
  4. #include<algorithm>
  5. inline int getint() {
  6. register char ch;
  7. register bool neg=false;
  8. while(!isdigit(ch=getchar())) neg|=ch=='-';
  9. register int x=ch^'0';
  10. while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
  11. return neg?-x:x;
  12. }
  13. const int N=2e5+1,K=5;
  14. int n,k,a[K];
  15. class SegmentTree {
  16. #define _left <<1
  17. #define _right <<1|1
  18. #define mid ((b+e)>>1)
  19. private:
  20. int max[N<<2],min[N<<2];
  21. void push_up(const int &p) {
  22. max[p]=std::max(max[p _left],max[p _right]);
  23. min[p]=std::min(min[p _left],min[p _right]);
  24. }
  25. public:
  26. void modify(int p,const int &y) {
  27. max[p]=min[p]=y;
  28. while(p!=1) {
  29. p>>=1;
  30. push_up(p);
  31. }
  32. }
  33. int qmax(const int &p,const int &b,const int &e,const int &l,const int &r) const {
  34. if(b==l&&e==r) return max[p];
  35. int ret=INT_MIN;
  36. if(l<=mid) ret=std::max(ret,qmax(p _left,b,mid,l,std::min(mid,r)));
  37. if(r>mid) ret=std::max(ret,qmax(p _right,mid+1,e,std::max(mid+1,l),r));
  38. return ret;
  39. }
  40. int qmin(const int &p,const int &b,const int &e,const int &l,const int &r) const {
  41. if(b==l&&e==r) return min[p];
  42. int ret=INT_MAX;
  43. if(l<=mid) ret=std::min(ret,qmin(p _left,b,mid,l,std::min(mid,r)));
  44. if(r>mid) ret=std::min(ret,qmin(p _right,mid+1,e,std::max(mid+1,l),r));
  45. return ret;
  46. }
  47. #undef _left
  48. #undef _right
  49. #undef mid
  50. };
  51. SegmentTree t[1<<K];
  52. inline int query(const int &s,const int &l,const int &r) {
  53. return t[s].qmax(1,1,n,l,r)-t[s].qmin(1,1,n,l,r);
  54. }
  55. inline int find(const int &x) {
  56. int b=1,e=n,p=1;
  57. while(b<e) {
  58. const int mid=(b+e)>>1;
  59. if(x<=mid) {
  60. e=mid;
  61. p=p<<1;
  62. } else {
  63. b=mid+1;
  64. p=p<<1|1;
  65. }
  66. }
  67. return p;
  68. }
  69. int main() {
  70. n=getint(),k=getint();
  71. for(register int i=1;i<=n;i++) {
  72. for(register int i=0;i<k;i++) a[i]=getint();
  73. const int pos=find(i);
  74. for(register int s=0;s<1<<(k-1);s++) {
  75. int val=0;
  76. for(register int j=0;j<k;j++) {
  77. val+=a[j]*(s>>j&1?:-1);
  78. }
  79. t[s].modify(pos,val);
  80. }
  81. }
  82. const int q=getint();
  83. for(register int i=0;i<q;i++) {
  84. const int opt=getint();
  85. if(opt==1) {
  86. const int x=getint(),pos=find(x);
  87. for(register int i=0;i<k;i++) a[i]=getint();
  88. for(register int s=0;s<1<<(k-1);s++) {
  89. int val=0;
  90. for(register int j=0;j<k;j++) {
  91. val+=a[j]*(s>>j&1?:-1);
  92. }
  93. t[s].modify(pos,val);
  94. }
  95. }
  96. if(opt==2) {
  97. const int l=getint(),r=getint();
  98. int ans=0;
  99. for(register int s=0;s<1<<(k-1);s++) {
  100. ans=std::max(ans,query(s,l,r));
  101. }
  102. printf("%d\n",ans);
  103. }
  104. }
  105. return 0;
  106. }

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

  1. [CF1093G]Multidimensional Queries 题解

    前言 DennyQi太巨了! 定义一个点\(a\),\(a_x\)表示\(a\)在第\(x\)维空间上的坐标值 题解 这题的思路珂以说非常巧妙(原谅我又用了这个"珂"), 我们知道 ...

  2. [CF1093G]Multidimensional Queries:线段树

    分析 非常有趣的一道题. 式子中的绝对值很难处理,但是我们发现: \[\sum_{i=1}^{k}|a_{x,i}-a_{y,i}|=\sum_{i=1}^{k}max(a_{x,i}-a_{y,i} ...

  3. CF 1093 G. Multidimensional Queries

    G. Multidimensional Queries 链接 分析: 考虑如何去掉绝对值符号. $\sum \limits_{i = 1}^{k} |a_{x, i} - a_{y, i}|$,由于k ...

  4. POJ-2926-Requirements&&Educational Codeforces Round 56G. Multidimensional Queries 【哈夫曼距离】

    POJ2926 先学会这个哈夫曼距离的处理才能做 cf 的G #include <iostream> #include <stdio.h> #include <algor ...

  5. codeforces1093G Multidimensional Queries 【线段树】

    题目分析: 搜索2^k种情况,线段树分别处理就行了,正确性明显. 代码: #include<bits/stdc++.h> using namespace std; ; int n,k; ] ...

  6. CodeForces - 1093G:Multidimensional Queries (线段树求K维最远点距离)

    题意:给定N个K维的点,Q次操作,或者修改点的坐标:或者问[L,R]这些点中最远的点. 思路:因为最后一定可以表示维+/-(x1-x2)+/-(y1-y2)+/-(z1-z2)..... 所以我们可以 ...

  7. Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))

    题目链接: https://codeforces.com/contest/1093/problem/G 题目: 题意: 在k维空间中有n个点,每次给你两种操作,一种是将某一个点的坐标改为另一个坐标,一 ...

  8. CF 1093G Multidimensional Queries——线段树(消去绝对值符号)

    题目:http://codeforces.com/contest/1093/problem/G 只好看看题解:https://codeforces.com/blog/entry/63877 主要是把绝 ...

  9. [AGC034D]Manhattan Max Matching:费用流

    前置姿势 \(k\)维空间内两点曼哈顿距离中绝对值的处理 戳这里:[CF1093G]Multidimensional Queries 多路增广的费用流 据说这个东西叫做ZKW费用流? 流程其实很简单, ...

随机推荐

  1. jenkins启动

    1.已安装JDK,因为jenkins是一款基于java的持续集成工具 2.已配置tomcat,并安装maven 3.下载一个jenkins的war包,放在tomcat/webapps目录下 4.cmd ...

  2. 二分查找算法的java实现

    1.算法思想: 二分查找又称折半查找,它是一种效率较高的查找方法.    时间复杂度:O(nlogn) 二分算法步骤描述: ① 首先在有序序列中确定整个查找区间的中间位置 mid = ( low + ...

  3. 手把手使用Git?

    下载和安装:Git下载和安装教程 学习使用Git:学习Git 安装TortoiseGit:教程 TortoiseGit与Git生成SSH密钥添加到GitHub账号的简单方法:解决方法

  4. 共有49款Windows GUI开发框架开源软件 【转】

    源文 : http://www.oschina.net/project/tag/178/gui?lang=36&os=0&sort=view&p=1 桌面应用开发引擎 Allo ...

  5. 【转】子类会调用父类的@PostConstruct方法

    如果一个类用@Service或@Component,那么只需要用@PostConstruct修饰某个方法,该方法能在类实例化的过程中自动执行,相当于类的构造函数.同时,具备了构造函数不具备的功能. @ ...

  6. Centos6.8 yum安装MySQL5.6

    第一步:安装仓库wget http://repo.mysql.com//mysql57-community-release-el6-8.noarch.rpmrpm -ivh mysql-communi ...

  7. cocos2dx模拟器修改窗口大小

    修改模拟器窗口大小SimulatorWin.cpp搜索 frameSize修改frameSize = Size(1920*0.9, 1080*0.9);

  8. 【转】Python——plot可视化数据,作业8

    Python——plot可视化数据,作业8(python programming) subject1k和subject1v的形状相同 # -*- coding: utf-8 -*- import sc ...

  9. 一, Python 一次性多行打印多个变量

    >>> n = 123 >>> f = 456.789 >>> s1 = 'hello ,world' >>> s2 = 'he ...

  10. scrapy发送邮件

    scrapy发送邮件 应用场景:在爬虫关闭或者爬虫空闲时可以通过发送邮件的提醒. 通过twisted的非阻塞IO实现,可以直接写在spider中,也可以写在中间件或者扩展中,看你具体的需求. 在网上找 ...