[HDU4867]Xor (线段树分治+类数位dp)
[HDU4867]Xor (线段树分治+类数位dp)
提供一种\((m+n) log a log m\)带有常数约\(\frac{1}{log n}\)的算法
处理询问,将后来加入的数算进序列中,则每个数\(a_i\)都有一段出现的区间\([L,R]\)
离线询问后,我们考虑用线段树分治将这些数加入到询问区间上
由于最多只有5000个修改操作,事实上这些数在线段树上覆盖的区间最多只有\(10000logm\)个,并且有着极其不满的常数(因为每个位置上的数都由多段区间组合而来,总长为\(m\),或者你可以觉得我在放屁)
如果直接处理每个数的贡献,那么这个\(dp\)是\(a*a\)转移的
然而事实上我们存在一种\(a*loga\)的转移方法
对于一个数\(x\),如果我们取\(y \leq x\)时,最高位为\(0\),则后面的位均可以随便取
换句话说,对于每一个前\(k\)位相同的集合,它们都能够转移到它们之间的任何一个,可以直接累和
同样的,考虑在第\(k\)位出现一个\(x\)在该位为\(1\),\(y\)为\(0\),都具有类似的转移性质
最后写出来跟数位\(dp\)一个样子。。。
(真不行你可以试试某变换,但是我不会!)
这样的情况个数即这个数\(1\)位的个数,这样的个数期望情况下可以看做常数。。。
所以我们得到了一个期望优秀的算法,实际运行时间也非常优秀
#include<cstdio>
#include<cctype>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define reg register
typedef long long ll;
#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)
char IO;
int rd(){
int s=0,f=0;
while(!isdigit(IO=getchar())) if(IO=='-') f=1;
do s=(s<<1)+(s<<3)+(IO^'0');
while(isdigit(IO=getchar()));
return f?-s:s;
}
const int N=1e5+10,P=1e9+7;
int n,m,E[N],Now[N],L[N],R[N],A=1023;
int dp[1024],tmp[1024],tmp2[1024];
int a[20],l,Ans[N],Qx[N],sq[N];
char opt[N];
#define Mod(x) ((x>=P)&&(x-=P))
void Solve(int p,int Up,int lim){
if(p<0) {
rep(S,0,A) tmp[S]+=dp[S^Up],Mod(tmp[S]);
return;
}
if(!lim) {
reg int t,Down=(1<<(p+1))-1;
rep(S,0,A) tmp2[S]=0;
rep(S,0,A) tmp2[t=Up^S^(S&Down)]+=dp[S],Mod(tmp2[t]); // 前几位相同的累和
rep(S,0,A) tmp[S]+=tmp2[S^(S&Down)],Mod(tmp[S]);
return;
}
rep(i,0,a[p]) Solve(p-1,Up|(i<<p),i==a[p]);
}
void Add(int x){
if(!x) return;
l=-1;
while(x) a[++l]=(x&1),x>>=1;
Solve(l,0,1);
rep(S,0,A) dp[S]=tmp[S],tmp[S]=0;
}
vector <int> G[N];
void AddQue(int p,int l,int r,int ql,int qr,int x){
if(l==ql&&r==qr) {
G[p].push_back(x);
return;
}
int mid=(l+r)>>1;
if(qr<=mid) AddQue(p<<1,l,mid,ql,qr,x);
else if(ql>mid) AddQue(p<<1|1,mid+1,r,ql,qr,x);
else AddQue(p<<1,l,mid,ql,mid,x),AddQue(p<<1|1,mid+1,r,mid+1,qr,x);
}
int tmp3[20][1024];
void AnsQue(int p,int l,int r,int dep){
rep(S,0,A) tmp3[dep][S]=dp[S];
rep(i,0,G[p].size()-1) Add(G[p][i]);
if(l==r) {
Ans[l]=dp[Qx[l]];
return;
}
int mid=(l+r)>>1;
AnsQue(p<<1,l,mid,dep+1);
AnsQue(p<<1|1,mid+1,r,dep+1);
rep(S,0,A) dp[S]=tmp3[dep][S];
}
int main(){
rep(kase,1,rd()) {
memset(dp,0,sizeof dp),dp[0]=1;
n=rd(),m=rd();
rep(i,1,n) Now[i]=i,E[i]=rd(),L[i]=1,R[i]=m;
rep(i,1,m*4) G[i].clear();
rep(i,1,m) {
while(!isalpha(opt[i]=getchar()));
if(opt[i]=='C') {
int x=rd()+1,y=rd();
R[Now[x]]=i-1;
Now[x]=++n;
E[n]=y;
L[n]=i;
R[n]=m;
} else Qx[i]=rd();
sq[i]=sq[i-1]+(opt[i]=='Q');
}
rep(i,1,n) AddQue(1,1,m,L[i],R[i],E[i]);
AnsQue(1,1,m,0);
rep(i,1,m) if(opt[i]=='Q') printf("%d\n",Ans[i]);
}
}
[HDU4867]Xor (线段树分治+类数位dp)的更多相关文章
- [基本操作]线段树分治和动态dp
不知道为什么要把这两个没什么关系的算法放到一起写...可能是都很黑科技? 1.线段树分治 例题:bzoj4026 二分图 给你一个图,资瓷加一条边,删一条边,询问当前图是不是二分图 如果用 LCT 的 ...
- 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...
- 【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)
Descroption 原题链接 给你一个\(n\)个点的图,有重边有自环保证连通,最开始有\(m\)条固定的边,要求你支持加边删边改边(均不涉及最初的\(m\)条边),每一次操作都求出图中经过\(1 ...
- 【CF938G】Shortest Path Queries(线段树分治,并查集,线性基)
[CF938G]Shortest Path Queries(线段树分治,并查集,线性基) 题面 CF 洛谷 题解 吼题啊. 对于每个边,我们用一个\(map\)维护它出现的时间, 发现询问单点,边的出 ...
- 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横
不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...
- $CF938G\ Shortest\ Path\ Queries$ 线段树分治+线性基
正解:线段树分治+线性基 解题报告: 传送门$QwQ$ 考虑如果只有操作3,就这题嘛$QwQ$ 欧克然后现在考虑加上了操作一操作二 于是就线段树分治鸭 首先线段树叶子节点是询问嘛这个不用说$QwQ$. ...
- CF1442D Sum (动态规划,线段树分治)
( 宋 体 字 看 起 来 真 舒 服 ) _{_{(宋体字看起来真舒服)}} (宋体字看起来真舒服) 题 面 ( 洛 谷 翻 译 ) 题面_{_{(洛谷翻译)}} 题面(洛谷翻译) 给定 n ...
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...
随机推荐
- Window权限维持(五):屏幕保护程序
屏幕保护是Windows功能的一部分,使用户可以在一段时间不活动后放置屏幕消息或图形动画.众所周知,Windows的此功能被威胁参与者滥用为持久性方法.这是因为屏幕保护程序是具有.scr文件扩展名的可 ...
- MVC 表格按树状形式显示 jstree jqgrid
1. 界面顯示 2.前端 jqgrid 代码 //加载表格 function GetGrid() { var selectedRowIndex = 0; var $gridTable = $('#gr ...
- centos7安装mysql5.7(rpm安装版)
1.下载mysql5.7的rpm安装包 rpm的mysql包,安装起来简单,解压版的mysql还需要做许多配置,稍有不慎就会出错!!! 下载地址:https://dev.mysql.com/downl ...
- angular6 表单验证
这里使用的是模型驱动的表单 1.app.module.ts import { ReactiveFormsModule } from '@angular/forms'; @NgModule({ ... ...
- liteos时间管理(九)
1. 时间管理 1.1 概述 1.1.1 概念 时间管理以系统时钟为基础.时间管理提供给应用程序所有和时间有关的服务. 系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数. ...
- cocos2dx3.x + xcode7.3 问题“libpng error: CgBI: unhandled critical chunk”
今天用 cocos2dx3.11.1 + xcode7.3.1 进行开发,新建项目后遇到如下问题: 在iphone(ios9.3.5)真机运行项目(用xcode自带虚拟机没有出现问题) auto sp ...
- python requests访问https的链接,不打开fiddler的情况下不报错;若是打开fiddler则报ssl错误,请求中添加verify=False,会报警告;若不想看到警告,有3种方式;
import requests# import warnings# warnings.filterwarnings("ignore") #方法一#requests.packages ...
- 第七周scrum会议
本周会议地点依旧 会议照片: 本周内容: 讨论了进行中的难点 我们正在分析图书馆首页的网页结构以及各种跳转的请求以及链接,为爬虫的实现奠定基础. flask框架我们也遇到了很多问题,正在进行官方文档的 ...
- Spring Boot2.0+中,自定义配置类扩展springMVC的功能
在spring boot1.0+,我们可以使用WebMvcConfigurerAdapter来扩展springMVC的功能,其中自定义的拦截器并不会拦截静态资源(js.css等). @Configur ...
- Python内容
1.Python介绍.计算机硬件.网络.变量.数据类型:列表+元组+字典+布尔值+字符串+数字+集合.格式化输出.if判断.for循环.while循环. 2.三元运算.字符编码.文件处理:r/rb(读 ...