ZOJ - 2112 Dynamic Rankings(BIT套主席树)
2024-08-25 20:24:52
纠结了好久的一道题,以前是用线段树套平衡树二分做的,感觉时间复杂度和分块差不多了。。。
终于用BIT套函数式线段树了过了,120ms就是快,此题主要是卡内存。
假设离散后有ns个不同的值,递归层数是log2(ns)左右,nlog(ns),主席树是前缀区间,BIT保存修改的值是mlog2(ns)log2(ns)。
虽然这个算出来还是会爆,但是实际上会有一些结点复用,具体设置多少请相信玄学。(2e6左右)
ZOJ的Node*计算内存似乎有问题,必须用int
/*********************************************************
* ------------------ *
* author AbyssFish *
**********************************************************/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
//#pragma pack(4) const int MAX_N = 5e4+;
const int MAX_M = 1e4+;
const int MAX_NM = MAX_N+MAX_M;
const int MAX_D = ;
const int MAX_ND = 0xac*MAX_M+0x42fed;//MAX_D*MAX_N+MAX_M*MAX_D*MAX_D; int b[MAX_NM];
int mp_a[MAX_NM]; int ns, n_; int N, M; struct Cmd
{
int i, j, k;
}qus[MAX_M]; struct Node
{
int lc, rc;
int s;
}p[MAX_ND]; int root[MAX_N];
int cnt; #define lsn p[o].lc,l,md
#define rsn p[o].rc,md+1,r void build(int x,int &o,int l = , int r = ns)
{
p[++cnt] = p[o];
o = cnt;
p[o].s++;
if(r > l){
int md = (l+r)>>;
if(x <= md) build(x,lsn);
else build(x,rsn);
}
} int BIT[MAX_N]; void inst(int x, int d, int &o, int l = , int r = ns)
{
if(o == ){
p[++cnt] = p[o];
o = cnt;
}
p[o].s += d;
if(l < r){
int md = (l+r)>>;
if(x<=md) inst(x,d,lsn);
else inst(x,d,rsn);
} } #define lowbit(x) ((x)&(-x)) void modify_bit(int pos, int x, int d)
{
while(pos <= N){
inst(x,d,BIT[pos]);
pos += lowbit(pos);
}
} typedef vector<int> Prefix; void prefix_bit(int pos, Prefix &res)
{
res.clear();
while(pos > ){
res.push_back(BIT[pos]);
pos -= lowbit(pos);
}
} inline int cal_lft(Prefix &pfx)
{
int re = ;
for(int i = pfx.size()-; i >= ; i--){
re += p[p[pfx[i]].lc].s;
}
return re;
} #define dump(pfx,ch)\
for(i = pfx.size()-; i >= ; i--){\
pfx[i] = p[pfx[i]].ch;\
} Prefix X, Y; int qkth(int k,int l = , int r = ns)
{
if(l == r) return mp_a[l];
else {
int l_cnt = cal_lft(Y)-cal_lft(X);
int md = (l+r)>>, i;
if(k <= l_cnt){
dump(X,lc)
dump(Y,lc)
return qkth(k,l,md);
}
else {
dump(X,rc)
dump(Y,rc)
return qkth(k-l_cnt,md+,r);
}
} } void solve()
{
cnt = ;
memset(BIT+,,sizeof(int)*N);
int i;
for(i = ; i <= N; i++){
root[i] = root[i-];
build(b[i], root[i]);
} for(i = ; i < M; i++){
if(qus[i].j < ){
int pos = qus[i].i;
modify_bit(pos,b[pos],-);
modify_bit(pos,b[pos] = b[qus[i].k],);
}
else {
int L = qus[i].i-, R = qus[i].j;
prefix_bit(L,X);
prefix_bit(R,Y);
X.push_back(root[L]);
Y.push_back(root[R]);
printf("%d\n",qkth(qus[i].k));
}
}
} int * const a = (int *)(p+);
int * const r = a + MAX_NM; void init()
{
scanf("%d%d",&N,&M);
for(int i = ; i <= N; i++){
scanf("%d",a+i);
r[i] = i;
} n_ = N;
char ch[];
for(int i = ; i < M; i++){
scanf("%s",ch);
if(*ch == 'Q') {
scanf("%d%d%d",&qus[i].i,&qus[i].j,&qus[i].k);
}
else {
qus[i].k = ++n_;
r[n_] = n_;
scanf("%d%d",&qus[i].i,a+n_);
qus[i].j = -;
}
} sort(r+,r+n_+,[](int i,int j){ return a[i]<a[j]; });
mp_a[b[r[]] = ns = ] = a[r[]];
for(int i = ; i <= n_; i++) {
int k = r[i];
if(a[k] != a[r[i-]]){
mp_a[b[k] = ++ns] = a[k];
}
else {
b[k] = ns;
}
}
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
//cout<<ceil(log2(MAX_N+MAX_M))+1;
//cout<<sizeof(Node*)<<endl;
//cout<<MAX_ND<<endl;
// cout<<MAX_ND*sizeof(Node)+(MAX_NM)*16+MAX_M*12+MAX_N*8;
// cout<<sizeof(a)+sizeof(root)+sizeof(meo)+sizeof(qus)+sizeof(BIT)<<endl;//sizeof(b)+sizeof(mp_a)+sizeof(r)
p[] = {,,};
X.reserve(MAX_D+);
Y.reserve(MAX_D+); int T; scanf("%d",&T);
while(T--){
init();
solve();
}
return ;
}
最新文章
- Azure billing 分析
- Home键状态保存运用场景
- php如何计算两个时间戳之间相差的日时分秒
- Powershell Switch 条件
- 深度神经网络(DNN)的正则化
- windows下pycharm远程调试pyspark
- 【Qt编程】基于Qt的词典开发系列<;二>;--本地词典的设计
- AFNetworking Delete请求,报参数为空的错误
- 【转】iOS中修改AVPlayer的请求头信息
- 编码原则:最小化使用控制结构(条件和循环)续:告别 break 和 continue
- DJango之视图函数
- Passbook
- ace admin后台模板
- iptables 介绍
- dp练习(3)——棋盘问题
- Python Post img
- JZYZOJ1261 字典序最小的lis
- JAVA篇之环境安装(Windows)
- SpringMVC Controller层的单元测试
- 抽样分布(2) t分布
热门文章
- python 格式化时间含中文报错: 'locale' codec can't encode character '\u5e74'
- php数组&#183;的方法3-数组指针
- Java——socket
- Vue中的scoped和scoped穿透
- http 协议的简单学习 虽然有点老但是 还不错
- ckeditor(在线文本编辑器)使用教程
- 加解密---Java安全
- 关于JAVA的基本知识
- 性能测试工具LoadRunner13-LR之Virtual User Generator 创建java脚本以及小结
- (转)AIX下的MPIO、RDAC、SDDPCM多路径软件操作 (AIX下的MPIO,查看AIX下hdisk与盘柜卷lun的对应关系)