hdu 3727 Jewel (可持久化线段树+bit)
链接: 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)的更多相关文章
- HDU 3727 Jewel 可持久化线段树
Jewel Problem Description Jimmy wants to make a special necklace for his girlfriend. He bought man ...
- 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 ...
- HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 5820 (可持久化线段树)
Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...
- HDU 5919 Sequence II(可持久化线段树)
[题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...
- 主席树[可持久化线段树](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 ...
- 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 ...
- HDU 4866 Shooting(持久化线段树)
view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...
- HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和
To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...
随机推荐
- 使用jquery-combobox实现select下拉框多选之后,如何将下拉框的值传给input隐藏域
我在之前的一篇博文中eaeyui-combobox实现组合查询(即实现多个值得搜索)地址:http://www.cnblogs.com/dushan/p/4778897.html 实现了select下 ...
- Hive 数据的导入导出
数据的导入: 通过文件导入,使用load命令 一.导入本地文件: load data local inpath '/home/hadoop/files/emp.txt' overwrite into ...
- .Net Core 系列之一 hello world
OS: win10 企业版 中文环境 .Net Core: 切记不要装64版本,否则可能会出现vs2017无法生成.net core 2.0的项目 dotnet-sdk-2.0.0-win-x86.e ...
- C# 泛型分组和Linq分组的异同
没什么好说的,因为用的到,所以作个记录, 代码如下: using System; using System.Collections.Generic; using System.Linq; using ...
- J-query extend()方法
1.如果没有冲突参数会弥在后面. 2.参数如果和前面的参数存在相同的名称,那么后面的会覆盖前面的参数值.
- 针对负载均衡集群中的session解决方案的总结
在日常运维工作中,当给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,无论是PHP.Python.Ruby还是Java语言环境,只要使用服务器保存Session,在做负 ...
- Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...
- require.ensure的用法;异步加载-代码分割;
webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...
- vue-cli中的check-versions.js配置文件包括semver,chalk,shell插件的解释
本文介绍vue-cli脚手架build目录中check-versions.js的配置 本文件是用来检测node和npm版本的 直接上代码加注释 // 下面的插件是chalk插件,他的作用是在控制台中输 ...
- .apply()用法和call()的区别
Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里 ...