题目链接:BZOJ - 1901

题目分析

树状数组套线段树或线段树套线段树都可以解决这道题。

第一层是区间,第二层是权值。

空间复杂度和时间复杂度均为 O(n log^2 n)。

线段树比树状数组麻烦好多...我容易写错= =

代码

树状数组套线段树

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring> using namespace std; const int MaxN = 10000 + 5, MN = 1000000015, MaxNode = 10000 * 30 * 15 + 15; int n, m, Index, Used_Index;
int A[MaxN], Root[MaxN], Son[MaxNode][2], T[MaxNode], U[MaxN], C[MaxN]; void Add(int &x, int s, int t, int Pos, int Num)
{
if (x == 0) x = ++Index;
T[x] += Num;
if (s == t) return;
int m = (s + t) >> 1;
if (Pos <= m) Add(Son[x][0], s, m, Pos, Num);
else Add(Son[x][1], m + 1, t, Pos, Num);
} void Change(int x, int Pos, int Num)
{
for (int i = x; i <= n; i += i & -i)
Add(Root[i], 0, MN, Pos, Num);
} int Get_Sum(int x)
{
int ret = 0;
for (int i = x; i; i -= i & -i)
ret += T[Son[U[i]][0]];
return ret;
} void Init_U(int x)
{
for (int i = x; i; i -= i & -i)
U[i] = Root[i];
} void Turn(int x, int f)
{
for (int i = x; i; i -= i & -i)
{
if (C[i] == Used_Index) break;
C[i] = Used_Index;
U[i] = Son[U[i]][f];
}
} int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &A[i]);
Change(i, A[i], 1);
}
char f;
int Pos, Num, L, R, k, Temp;
for (int i = 1; i <= m; ++i)
{
f = '-';
while (f < 'A' || f > 'Z') f = getchar();
if (f == 'C')
{
scanf("%d%d", &Pos, &Num);
Change(Pos, A[Pos], -1);
A[Pos] = Num;
Change(Pos, Num, 1);
}
else
{
scanf("%d%d%d", &L, &R, &k);
int l, r, mid;
l = 0; r = MN;
Init_U(L - 1);
Init_U(R);
Used_Index = 0;
while (l < r)
{
mid = (l + r) >> 1;
Temp = Get_Sum(R) - Get_Sum(L - 1);
++Used_Index;
if (Temp >= k)
{
r = mid;
Turn(L - 1, 0);
Turn(R, 0);
}
else
{
l = mid + 1;
k -= Temp;
Turn(L - 1, 1);
Turn(R, 1);
}
}
printf("%d\n", l);
}
}
return 0;
}

线段树套线段树

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; const int MaxN = 10000 + 5, MN = 1000000000 + 15, MaxNode = 10000 * 30 * 15 + 15; int n, m, Index, Used_Index;
int A[MaxN], Root[MaxN * 4], T[MaxNode], Son[MaxNode][2], U[MaxN * 4], C[MaxN * 4]; void Add(int &x, int s, int t, int Pos, int Num)
{
if (x == 0) x = ++Index;
T[x] += Num;
if (s == t) return;
int m = (s + t) >> 1;
if (Pos <= m) Add(Son[x][0], s, m, Pos, Num);
else Add(Son[x][1], m + 1, t, Pos, Num);
} void Change(int x, int s, int t, int Pos, int Pos_2, int Num)
{
Add(Root[x], 0, MN, Pos_2, Num);
if (s == t) return;
int m = (s + t) >> 1;
if (Pos <= m) Change(x << 1, s, m, Pos, Pos_2, Num);
else Change(x << 1 | 1, m + 1, t, Pos, Pos_2, Num);
} void Init_U(int x, int s, int t, int Pos)
{
if (Pos >= t)
{
U[x] = Root[x];
return;
}
int m = (s + t) >> 1;
Init_U(x << 1, s, m, Pos);
if (Pos >= m + 1) Init_U(x << 1 | 1, m + 1, t, Pos);
} void Turn(int x, int s, int t, int Pos, int f)
{
if (Pos >= t)
{
if (C[x] == Used_Index) return;
C[x] = Used_Index;
U[x] = Son[U[x]][f];
return;
}
int m = (s + t) >> 1;
Turn(x << 1, s, m, Pos, f);
if (Pos >= m + 1) Turn(x << 1 | 1, m + 1, t, Pos, f);
} int Get_Sum(int x, int s, int t, int Pos)
{
if (Pos >= t) return T[Son[U[x]][0]];
int ret = 0, m = (s + t) >> 1;
ret += Get_Sum(x << 1, s, m, Pos);
if (Pos >= m + 1) ret += Get_Sum(x << 1 | 1, m + 1, t, Pos);
return ret;
} int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &A[i]);
Change(1, 0, n, i, A[i], 1);
}
char f;
int L, R, Pos, Num, k;
for (int i = 1; i <= m; ++i)
{
f = '-';
while (f < 'A' || f > 'Z') f = getchar();
if (f == 'C')
{
scanf("%d%d", &Pos, &Num);
Change(1, 0, n, Pos, A[Pos], -1);
A[Pos] = Num;
Change(1, 0, n, Pos, Num, 1);
}
else
{
scanf("%d%d%d", &L, &R, &k);
int l, r, mid, Temp;
Used_Index = 0;
Init_U(1, 0, n, L - 1);
Init_U(1, 0, n, R);
l = 0; r = MN;
while (l < r)
{
++Used_Index;
mid = (l + r) >> 1;
Temp = Get_Sum(1, 0, n, R) - Get_Sum(1, 0, n, L - 1);
if (Temp >= k)
{
r = mid;
Turn(1, 0, n, R, 0);
Turn(1, 0, n, L - 1, 0);
}
else
{
l = mid + 1;
Turn(1, 0, n, R, 1);
Turn(1, 0, n, L - 1, 1);
k -= Temp;
}
}
printf("%d\n", l);
}
}
return 0;
}

  

[BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】的更多相关文章

  1. bzoj 1901 Dynamic Rankings (树状数组套线段树)

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...

  2. BZOJ.1901.Dynamic Rankings(树状数组套主席树(动态主席树))

    题目链接 BZOJ 洛谷 区间第k小,我们可以想到主席树.然而这是静态的,怎么支持修改? 静态的主席树是利用前缀和+差分来求解的,那么对于每个位置上的每棵树看做一个点,拿树状数组更新. 还是树状数组的 ...

  3. BZOJ 1901 Dynamic Rankings (整体二分+树状数组)

    题目大意:略 洛谷传送门 这道题在洛谷上数据比较强 貌似这个题比较常见的写法是树状数组套主席树,动态修改 我写的是整体二分 一开始的序列全都视为插入 对于修改操作,把它拆分成插入和删除两个操作 像$C ...

  4. BZOJ.1901.Dynamic Rankings(线段树套平衡树 Splay)

    题目链接or Here 题意:n个数,有两个操作:1.修改某个数为v:2.询问一段区间第k小的数 如果没有修改,则可以用线段树,每个节点P[a,b]存储大小为b-a+1的数组,代表其中的数 同时,这个 ...

  5. BZOJ 1901 Dynamic Rankings 树董事长

    标题效果:间隔可以改变k少 我的两个天树牌主席... 隔断Count On A Tree 之后我一直认为,随着树的主席的变化是分域林木覆盖率可持久段树. .. 事实上,我是误导... 尼可持久化线段树 ...

  6. [BZOJ 1901] Dynamic Rankings

    Link: BZOJ 1901 传送门 Solution: 带修改主席树的模板题 对于静态区间第$k$大直接上主席树就行了 但加上修改后会发现修改时复杂度不满足要求了: 去掉/增加第$i$位上的值时要 ...

  7. BZOJ.1901.Dynamic Rankings(整体二分)

    题目链接 BZOJ 洛谷 (以下是口胡) 对于多组的询问.修改,我们可以发现: 假设有对p1,p2,p3...的询问,在这之前有对p0的修改(比如+1),且p0<=p1,p2,p3...,那么我 ...

  8. 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树

    外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...

  9. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6321  Solved: 2628[Su ...

随机推荐

  1. Java JDBC批处理插入数据操作(转)

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

  2. locale------- linux字符集

    查看当前系统字符集 [root@server1 ~]# locale LANG=zh_CN.UTF-8LC_CTYPE="zh_CN.UTF-8"LC_NUMERIC=" ...

  3. C#中对于可变性的限制

    发现很少有集中讨论C#可变性限制的中文博文(要么就是一大段文字中夹杂很多凌乱的部分),所以写发篇博文,集中讨论,这些限制基本是基于安全考虑,亦或者根本难以实现而产生的. 注:本文不再解释什么是可变性, ...

  4. java Thread.join()

    thread1.join()方法阻塞调用此方法的线程,直到线程thread1完成,此线程再继续. 通常用于在main()主线程内,等待其它线程完成再结束main()主线程 @Test /** * ou ...

  5. ubuntu中使用nginx把本地80端口转到其他端口

    ubuntu中使用nginx把本地80端口转到其他端口 因为只是在开发的过程中遇到要使用域名的方式访问, 而linux默认把1024以下的端口全部禁用. 在网上找了N多方式开启80端口无果后, 方才想 ...

  6. Hadoop书籍汇总

    <Hadoop实战>陆嘉恒 <Hadoop - The Definitive Guide>Tom White,中文版<Hadoop权威指南> <Hadoop技 ...

  7. ASP.NET分页存储过程,解决搜索时丢失条件信息

    存储过程: -- ============================================= -- Author: -- Create date: -- Description: 分页 ...

  8. Linux下载jdk ,Linux如何下载jdk

    Linux下载jdk Linux如何下载jdk >>>>>>>>>>>>>>>>>>> ...

  9. Python学习入门教程,字符串函数扩充详解

    因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数.本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)中字符串函数的详解与扩充. 如果您想学习 ...

  10. 使用Newtonsoft.Json序列化和反序列化对象(源码)

    Json数据格式,简单而强大. 使用Json,不得不提到Newtonsoft.Json,它帮助我们更方便的使用Json,当然,不使用它也是可以的,还有许多方法将对象序列化成Json字符串,暂且不提. ...