HDU3727 - Jewel(主席树)
题目大意
对一个序列进行以下四种操作:
1、Insert x 在序列尾部插入x
2、Query_1 s t k 查询区间[s,t]的第k小
3、Query_2 x 查询x的在序列中排名
4、Query_3 k 查询序列中的第k小
题解
第一个和第二个显然是主席树能够实现的功能,第三四个操作用vector+lower_bound就可以实现,妈蛋,写完交上去一直WA,fuck,然后把存储操作类型的每个字符串的大小从10改成15居然变RE了!!!才发现用来存储操作的数组开小了,只开到100000。。。改完就A了。。。3687MS,好慢。。。假设插入操作为n,其他操作位m,时间复杂度是nlogn+mlogn 应该没有这么慢的说啊,莫非是lower_bound调用次数太多,所以耗时很多?
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define MAXN 100005
#define lson l,m,ls[s]
#define rson m+1,r,rs[s]
typedef long long LL;
int ls[20*MAXN],rs[20*MAXN];
int cnt[20*MAXN],T[MAXN];
int a[MAXN],num[MAXN];
char op[2*MAXN][15];
int L[2*MAXN],R[2*MAXN],K[2*MAXN];
int tot;
vector<int>ivec;
void build(int l,int r,int &s)
{
s=++tot;
cnt[s]=0;
if(l==r) return;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void update(int last,int p,int l,int r,int &s)
{
s=++tot;
ls[s]=ls[last],rs[s]=rs[last];
cnt[s]=cnt[last]+1;
if(l==r) return;
int m=(l+r)>>1;
if(p<=m) update(ls[last],p,lson);
else update(rs[last],p,rson);
}
int query(int ss,int tt,int l,int r,int k)
{
if(l==r) return r;
int sum=cnt[ls[tt]]-cnt[ls[ss]];
int m=(l+r)>>1;
if(sum>=k) return query(ls[ss],ls[tt],l,m,k);
else return query(rs[ss],rs[tt],m+1,r,k-sum);
}
int main()
{
int m,kase=0;
while(scanf("%d",&m)!=EOF)
{
memset(cnt,0,sizeof(cnt));
int len=0,n;
LL qy1=0,qy2=0,qy3=0;
ivec.clear();
for(int i=0; i<m; i++)
{
scanf("%s%d",op[i],&L[i]);
if(!strcmp(op[i],"Insert"))
{
++len;
num[len]=a[len]=L[i];
}
else if(!strcmp(op[i],"Query_1"))
scanf("%d%d",&R[i],&K[i]);
}
sort(a+1,a+len+1);
n=len;
len=unique(a+1,a+len+1)-a-1;
for(int i=1; i<=n; i++) num[i]=lower_bound(a+1,a+len+1,num[i])-a;
tot=0;
build(1,len,T[0]);
for(int i=1; i<=n; i++) update(T[i-1],num[i],1,len,T[i]);
for(int i=0; i<m; i++)
{
if(!strcmp(op[i],"Insert"))
ivec.insert(lower_bound(ivec.begin(),ivec.end(),L[i]),L[i]);
else if(!strcmp(op[i],"Query_1"))
qy1+=a[query(T[L[i]-1],T[R[i]],1,len,K[i])];
else if(!strcmp(op[i],"Query_2"))
qy2+=lower_bound(ivec.begin(),ivec.end(),L[i])-ivec.begin()+1;
else
qy3+=ivec[L[i]-1];
}
printf("Case %d:\n",++kase);
printf("%I64d\n%I64d\n%I64d\n",qy1,qy2,qy3);
}
return 0;
}
HDU3727 - Jewel(主席树)的更多相关文章
- HDU 3727 Jewel 主席树
题意: 一开始有一个空序列,然后有下面四种操作: Insert x在序列尾部加入一个值为\(x\)的元素,而且保证序列中每个元素都互不相同. Query_1 s t k查询区间\([s,t]\)中第\ ...
- HDU3727 Jewel(主席树+树状数组(或二分))
Problem Description Jimmy wants to make a special necklace for his girlfriend. He bought many beads ...
- HDU3727--Jewel (主席树 静态区间第k大)
Jewel Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3522 Solved: 1041[Submi ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
随机推荐
- uCGUI字符串显示过程分析和uCGUI字库的组建
为什么要分析字符串的显示过程? 学习uCGUI主要是学习如何使用的,为何要深究到源码的层次呢? 就分析字符串显示过程的原因来说,是因为移植汉字字库的需要.uCGUI并么有合适的汉字字库,而且完整的汉字 ...
- ArcGIS API for JavaScript 学习笔记(一)
终于开始了 噩梦一般的ArcGIS 我特别不习惯这种结构化的程序写法 写起来特别吃力 特别是把几个功能整合到同一个页面去的时候. 写程序的时候,一般我喜欢先写个Demo然后再把Demo上面的功能加到页 ...
- 7.MVC框架开发(创建层级项目)
在一个项目比较大的时候,就会有多个层级项目 1)在项目中选定项目右建新建区域(新的层级项目),项目->右键->添加->区域,构成了一套独立的MVC的目录,这个目录包括Views,Co ...
- python 批量修改图片大小
一个文件夹下面有好多图片格式是jpg大小是1920*1080,把它们处理成1280*720并按原先图片的名保存在另一路径下这里首先要找到给定路径下所有的图片文件,然后在修改图片文件的大小,这里用到PI ...
- [转]关于MYSQL Innodb 锁行还是锁表
关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 目时由于业务逻辑的需要,必须对数 ...
- 谷歌笔试题——排序,只允许0和其他元素交换
2.2 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序. 这题有一个隐含条件:即数组元素是连续的,即0--n-1,当你排好序后,你会发现数组元素和该元素的下标 ...
- LFI & RFI & PHP封装协议之安全问题研究
目录 . 文件包含的基本概念 . LFI(Local File Include) . RFI(Remote File Include) . PHP中的封装协议(伪协议).PHP的流式文件操作模式所带来 ...
- hdu 4800 Josephina and RPG
简单dp #include<cstdio> #define maxn 10005 #include<cstring> #include<algorithm> usi ...
- Linux的直接I/O机制
转自Linux的直接I/O机制 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O.本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程 ...
- Firefly官方教程之Netconnect使用文档
1.distributed说明该模块包含了服务端与客户端通信的一些处理方法,包括发送数据的封装,协议头的封装,tcp通信时进行分包,处理粘包问题.2.结构解析 LiberateFactory,协议工厂 ...