链接: http://acm.hdu.edu.cn/showproblem.php?pid=3727

题意:

对一段序列进行四种操作:

Insert x :在序列尾部插入一个x;

Query_1 s t k : 求区间[s,t]中第k小的数

Query_2 x: 求x在序列中的排名

Query_3 k:求序列中第k小的数

思路;

第2,4个操作明显就是很裸的主席树求第k小。第3个操作我们可以单独用个树状数组维护,第一个操作因为会对序列造成影响,我们可以对所有操作进行离线处理,

分析完后可以发现这应该是一道比较简单的题。

主席树写搓了。。找了半天的错。。自闭

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mid int m = (l + r) >> 1
#pragma comment(linker, "/STACK:102400000,102400000")
const int M = 2e5 + ;
int c[M],ls[M*],rs[M*],sum[M*],a[M],root[M],num;
ll ans1,ans2,ans3;
int n,len,cnt,idx;
void add(int x){
while(x <= len){
c[x] += ;
x += (x&-x);
}
} int getsum(int x){
int ans = ;
while(x){
ans += c[x];
x -= (x&-x);
}
return ans;
} void update(int &now,int l,int r,int p){
int old = now; now = ++idx;
ls[now] = ls[old]; rs[now] = rs[old];
sum[now] = sum[old] + ;
if(l == r) return ;
mid;
if(p <= m) update(ls[now],l,m,p);
else update(rs[now],m+,r,p);
} int query_1(int old,int now,int l,int r,int k){
if(l == r)
return l;
mid;
int ret = sum[ls[now]] - sum[ls[old]];
//cout<<sum[ls[now]]<<" "<<sum[ls[old]]<<endl;
if(ret >= k)
return query_1(ls[old],ls[now],l,m,k);
else
return query_1(rs[old],rs[now],m+,r,k-ret);
} int query_3(int &now,int l,int r,int k){
if(l == r) return l;
mid;
int ret = sum[ls[now]];
if(ret >= k) return query_3(ls[now],l,m,k);
else return query_3(rs[now],m+,r,k - ret);
} int find(int x){
return lower_bound(a+,a++len,x) - a;
} void init(){
cnt = ; idx = ; len = ,num = ;
ans1 = ; ans2 = ;ans3 = ;
memset(c,,sizeof(c));
memset(ls,,sizeof(ls));
memset(rs,,sizeof(rs));
memset(sum,,sizeof(sum));
memset(root,,sizeof(root));
} struct node{
int x,s,t,k;
}q[M];
char op[M][];
int main()
{
int cas = ;
while(scanf("%d",&n)!=EOF){
init();
for(int i = ;i <= n;i ++){
scanf("%s",op[i]);
if(op[i][] == 'I'){
scanf("%d",&q[i].x);
a[++cnt] = q[i].x;
}
else{
if(op[i][] == '')
scanf("%d%d%d",&q[i].s,&q[i].t,&q[i].k);
else if(op[i][] == '')
scanf("%d",&q[i].x),a[++cnt] = q[i].x;
else if(op[i][] == '')
scanf("%d",&q[i].k);
}
}
sort(a+,a++cnt);
len = unique(a+,a++cnt) - a-;
for(int i = ;i <= n;i ++){
if(op[i][] == 'I'){
int fx = find(q[i].x);
root[num] = root[num-];
update(root[num],,len,fx);
num++;
add(fx);
}
else{
if(op[i][] == '')
ans1 += a[query_1(root[q[i].s-],root[q[i].t],,len,q[i].k)];
else if(op[i][] == ''){
int fx = find(q[i].x);
ans2 += getsum(fx-) + ;
}
else if(op[i][] == '')
ans3 += a[query_3(root[num-],,len,q[i].k)];
//cout<<ans1<<" "<<ans2<<" "<<ans3<<" "<<endl;
}
}
printf("Case %d:\n",cas++);
printf("%lld\n%lld\n%lld\n",ans1,ans2,ans3);
}
return ;
}
/*
3 0
1 0
3 1
2 1
*/

hdu 3727 Jewel (可持久化线段树+bit)的更多相关文章

  1. HDU 3727 Jewel 可持久化线段树

    Jewel Problem Description   Jimmy wants to make a special necklace for his girlfriend. He bought man ...

  2. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. HDU 5820 (可持久化线段树)

    Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...

  5. HDU 5919 Sequence II(可持久化线段树)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...

  6. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  7. HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. HDU 4866 Shooting(持久化线段树)

    view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...

  9. HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和

    To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

随机推荐

  1. 4-(基础入门篇)学会刷Wi-Fi模块固件(刷AT指令固件)

    http://www.cnblogs.com/yangfengwu/p/8965054.html 基础教程源码链接如果失效,请在淘宝介绍中下载,由于链接很容易失效,如果失效请联系卖家,谢谢 https ...

  2. Ubuntu16.04中搭建TFTP 和 NFS 服务器

    Ubuntu 16.04中搭建TFTP服务 1. 安装 $ apt-get install tftp-hpa tftpd-hpa   2. 建立目录 $ mkdir /tftpboot # 这是建立t ...

  3. Luogu P3959 宝藏

    这道题正解是状压DP,不过我不会所以写一下随机化算法来骗骗分. 听说当时考场上就有很多写prim然后挂掉的神仙,其实这道题是可以prim过的 prim是一种基于贪心的算法,在本题中由于盲目的选择当前最 ...

  4. 《Head First 设计模式》例子的C++实现(2 观察者模式)

    最近在学习设计模式,用的是 <Head First 设计模式>这本书.感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式.唯一有点不方便的地方是这本书的例子全都是用的 Java ...

  5. 性能调优之vmstat命令

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.IO读写.CPU活动等进行监视.它是对系统的整体情况进行统计,不足之处是无法对某 ...

  6. ABP从入门到精通(4):使用基于JWT标准的Token访问WebApi

    项目:asp.net zero 4.2.0 .net core(1.1) 版本 我们做项目的时候可能会遇到需要提供api给app调用,ABP动态生成的WebApi提供了方便的基于JWT标准的Token ...

  7. 编写一个供浏览器端使用的NPM包

    此文已由作者吴维伟授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在编写程序时,总会有一些代码是我们不愿意一遍又一遍重复地去写的,比如一些UI或交互相似组件,或是一些相似的流 ...

  8. 老牌阅读器nook2刷机整理

    kindle肯定是现在大多数人了解电纸书这个产品的开端,也给我留下了一段美好的回忆,不折腾,不死机,官方书城让人省心不少,不过作为半个折腾爱好者,kindle显然不符合我的理念,遂慢慢入了安卓电纸书的 ...

  9. 使用Megacli64对服务器物理磁盘做Raid并通过uuid方式挂载

    需求说明:公司最近来了一批服务器,用于大数据业务部署.数据节点服务器由14块物理磁盘,其中有2块是900G的盘,12块是4T的盘.在服务器系统安装时,进入系统的BIOS界面:1)将2块900G的磁盘做 ...

  10. NTP系统时间同步-操作记录

    在初始化一台linux服务器后,发现这台服务器的时间不对[root@dev ~]# date2016年 10月 11日 星期二 07:04:34 CST Linux时钟分为系统时钟 (System C ...