[BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接: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 【树状数组套线段树 || 线段树套线段树】的更多相关文章
- bzoj 1901 Dynamic Rankings (树状数组套线段树)
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...
- BZOJ.1901.Dynamic Rankings(树状数组套主席树(动态主席树))
题目链接 BZOJ 洛谷 区间第k小,我们可以想到主席树.然而这是静态的,怎么支持修改? 静态的主席树是利用前缀和+差分来求解的,那么对于每个位置上的每棵树看做一个点,拿树状数组更新. 还是树状数组的 ...
- BZOJ 1901 Dynamic Rankings (整体二分+树状数组)
题目大意:略 洛谷传送门 这道题在洛谷上数据比较强 貌似这个题比较常见的写法是树状数组套主席树,动态修改 我写的是整体二分 一开始的序列全都视为插入 对于修改操作,把它拆分成插入和删除两个操作 像$C ...
- BZOJ.1901.Dynamic Rankings(线段树套平衡树 Splay)
题目链接or Here 题意:n个数,有两个操作:1.修改某个数为v:2.询问一段区间第k小的数 如果没有修改,则可以用线段树,每个节点P[a,b]存储大小为b-a+1的数组,代表其中的数 同时,这个 ...
- BZOJ 1901 Dynamic Rankings 树董事长
标题效果:间隔可以改变k少 我的两个天树牌主席... 隔断Count On A Tree 之后我一直认为,随着树的主席的变化是分域林木覆盖率可持久段树. .. 事实上,我是误导... 尼可持久化线段树 ...
- [BZOJ 1901] Dynamic Rankings
Link: BZOJ 1901 传送门 Solution: 带修改主席树的模板题 对于静态区间第$k$大直接上主席树就行了 但加上修改后会发现修改时复杂度不满足要求了: 去掉/增加第$i$位上的值时要 ...
- BZOJ.1901.Dynamic Rankings(整体二分)
题目链接 BZOJ 洛谷 (以下是口胡) 对于多组的询问.修改,我们可以发现: 假设有对p1,p2,p3...的询问,在这之前有对p0的修改(比如+1),且p0<=p1,p2,p3...,那么我 ...
- 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树
外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...
- Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6321 Solved: 2628[Su ...
随机推荐
- adb取出安装在手机中的apk
Android实战技巧之十八:adb取出安装在手机中的apk 场景: 朋友看见你Android手机中的游戏或应用很好玩,也想装一个此程序,但限于网络条件不能从网上下载.那么最简单的办法就是直接从你手机 ...
- MSDN无法显示该页的解决办法
今天打开msdn,发现 查阅api时候 出现 “无法显示该页的解决办法“ 这个问题.解决方案如下: 在“运行”中输入regsvr32 "C:\Program Files\Common Fil ...
- Abstract Factory 抽象工厂模式
提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具 ...
- (转)ASP.NET QueryString乱码解决问题
正常的情况下,现在asp.net的网站很多都直接使用UTF8来进行页面编码的,这与Javascript.缺省网站的编码是相同的,但是也有相当一部分采用GB2312. 对于GB2312的网站如果直接用j ...
- IIS应用地址池监控
目的:公司服务器IIS有十几个应用地址池,总在不经意间停掉一个,停止线系统日志里会有一大堆警告日志,然后就停掉了,分析了好几次,网上有人说是某一个网站的问题应该查网站, 但是网站又有那么多地址,谁知道 ...
- 用数据库管理SERV-U的用户时,如何修改密码及原理
将serv-u设置成数据库管理用户的前提是先要建立数据源 如何用Serv-U连接ODBC|1.可以在 FTP所在服务器安装一个 SQL Server 数据库,也可以使用论坛自带的数据库.建议在 FT ...
- Ajax结合Js操作灵活操作表格
Table页面: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...
- Java随机生成定长纯数字或数字字母混合数
(转)Java随机生成定长纯数字或数字字母混合数 运行效果图: 具体实现代码
- Android 点击事件,4种回调。
1. 继承监听接口. 2. xml方式 : 设置 android:onClick 3. 内部类 4. 匿名类 ------------------------------------------- ...
- ios7--系统自带的向右滑动手势返回上一个界面
当从控制器A push到控制器B,我们返回控制器A,除了使用按钮返回 [self.navigationController pushViewController:Vc animated:YES]; 还 ...