博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【纪中集训2019.3.25】芬威克树
阅读量:7035 次
发布时间:2019-06-28

本文共 2069 字,大约阅读时间需要 6 分钟。

题目

描述

1101338-20190401203110317-645058988.png

​ 第一段代码正确第用\(k\)进制\(BIT\)维护了前缀和;

​ 第二段代码由于写错了\(line \ 4\),所以意义发生了改变;

​ 维护第二段代码执行\(ADD(x,v)\)\(QUERY(x)\)的答案;

范围

​ $1 \le n \le 10^9  ,  1 \le q \le 2 \times 10^5  ,  2 \le k \le 10^5   $ ;

题解

  • 首先不管如何变化,这都是一个树形结构;

  • 但是由于\(n\)较大,所以无法直接支持维护树链;

  • \(k = t \times 2 ^ p (t \% 2=1)\) ;

  • 对于\(v = x 2^y (x \% 2=1)\)

    • 1.当\(y \ge p\)时,执行ADD时\(v\)的最低位是不会改变的,同时由于\(x\)\(t\)的意义下有逆元,所以\(v\)至多有一个满足$y\ge p $的儿子,即这些节点形成了很多条链;
    • 2.当\(y<p\)时,执行一次加最低位值会让\(y++\),注意有可能最低位变化然后重新来过,但是最多有\(log_k n\)次,即这些点最多向上$log_k  n  \times p = log_{k}  n  log_2  k = log_2  n $ 次就会到1中的链上去;
  • 可以暴力\(HASH\)维护\(2\),离散后用\(BIT\)维护\(1\) ;

  • 只需要找到\(1\)中的链的叶子,注意在链上每次的进位是确定的,为对最低位的高一位进1;

  • 链叶子满足\(x\)处于最低位,同时无法退位,所以形如:$ (2x+1) 2^p k^y  ,  (y \ge 0 , 0 \le x \lt \frac{\frac{t}{2^p}-1}{2}) $即可;

  • 可以\(klog \ k\)倍增方便地找到这些位置;

  • 时间复杂度应该是:$k log_2 k + q (log_2 n + log_2 q +loq_2 k ) $ ; ?(似乎和出题人分析的有点不太一样。。。)

  • orz 租酥雨

    #include
    #define pb push_back#define mk make_pair#define fi first#define se second#define ull unsigned long long #define il inline #define rg register using namespace std;const int N=200010,M=31;int n,m,k,MX,A,B,S,cnt,id;struct data{int op,x,y;}Q[N];int f[N][M],bin[M];pair
    v1[N];//map
    mp1;//,mp2;vector
    vec[N],val[N],v2[N];ull pw[100];il char gc(){ static char*p1,*p2,s[1000000]; if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin); return(p1==p2)?EOF:*p1++;}il int rd(){ int x=0;char c=gc(); while(c<'0'||c>'9')c=gc(); while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc(); return x;}const int sz=123451;struct Hash{ int o,hd[sz],nt[N*M],v[N*M],w[N*M]; int& operator [](const int&x){ int y=x%sz; for(rg int i=hd[y];i;i=nt[i]){ if(v[i]==x)return w[i]; } nt[++o]=hd[y],hd[y]=o,v[o]=x,w[o]=0; return w[o]; }}mp1,mp2;il void init(){ int iv2=A+1>>1; for(rg int i=1;i
    >1][0]; while((f[i][0]&1)==0)f[i][0]>>=1; } for(rg int i=1;i
    >=B; while(x&&((x&1)==0))x>>=1; for(rg int i=0;i

转载于:https://www.cnblogs.com/Paul-Guderian/p/10638687.html

你可能感兴趣的文章
python在类中实现swith case功能
查看>>
SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka)
查看>>
leetcode Sort List
查看>>
开源分布式存储SeaweedFS
查看>>
Servlet容器原型(二)——一个简单的连接器
查看>>
Quartz和UIKit坐标系
查看>>
Path Sum
查看>>
Spring使用Cache、整合Ehcache
查看>>
Quartz定时任务调度cron表达式时间格式
查看>>
ubuntu 安装mysql环境(离线压缩包方式)
查看>>
HTML <legend> 标签
查看>>
使用express配置前端代码服务器
查看>>
oracel设置自增ID。
查看>>
Maven com.sun.jdmk:jmxtools:jar 下载不下来
查看>>
DevExpress之Skin自定义使用
查看>>
可变参数
查看>>
[日推荐]『饿了么外卖服务』饿了么官方小程序,无需下载安装!
查看>>
Maven的学习资料收集--(四)使用Maven构建Web项目-测试
查看>>
redis安装与配置
查看>>
粒子群算法
查看>>