HDU-3727 Jewel
Initially, there is no bead at all, that is, there is an empty chain. Jimmy always sticks the new bead to the right of the chain, to make the chain longer and longer. We number the leftmost bead as Position 1, and the bead to its right as Position 2, and so on. Jimmy usually asks questions about the beads' positions, size ranks and actual sizes. Specifically speaking, there are 4 kinds of operations you should process:
Insert x
Put a bead with size x to the right of the chain (0 < x < 231, and x is different from all the sizes of beads currently in the chain)
Query_1 s t k
Query the k-th smallest bead between position s and t, inclusive. You can assume 1 <= s <= t <= L, (L is the length of the current chain), and 1 <= k <= min (100, t-s+1)
Query_2 x
Query the rank of the bead with size x, if we sort all the current beads by ascent order of sizes. The result should between 1 and L (L is the length of the current chain)
Query_3 k
Query the size of the k-th smallest bead currently (1 <= k <= L, L is the length of the current chain)
InputThere are several test cases in the input. The first line for each test case is an integer N, indicating the number of operations. Then N lines follow, each line contains one operation, as described above.
You can assume the amount of "Insert" operation is no more than 100000, and the amounts of "Query_1", "Query_2" and "Query_3" are all less than 35000.
There are several test cases in the input. The first line for each test case is an integer N, indicating the number of operations. Then N lines follow, each line contains one operation, as described above.
You can assume the amount of "Insert" operation is no more than 100000, and the amounts of "Query_1", "Query_2" and "Query_3" are all less than 35000.Query the rank of the bead with size x, if we sort all the current beads by ascent order of sizes. The result should between 1 and L (L is the length of the current chain)
Query_3 k
Query the size of the k-th smallest bead currently (1 <= k <= L, L is the length of the current chain)
OutputOutput 4 lines for each test case. The first line is "Case T:", where T is the id of the case. The next 3 lines indicate the sum of results for Query_1, Query_2 and Query_3, respectively.
Sample Input
10
Insert 1
Insert 4
Insert 2
Insert 5
Insert 6
Query_1 1 5 5
Query_1 2 3 2
Query_2 4
Query_3 3
Query_3 1
Sample Output
Case 1:
10
3
5
Hint
The answers for the 5 queries are 6, 4, 3, 4, 1, respectively.
题解:可持续化线段树的模板题
AC代码为:
/*
有四种操作
1、在序列最优插入一个数字(该数字从没出现过)
2、询问序列内某区间第k小值
3、询问当前序列内数字x是第几小的(x一定在序列中)
4、询问当前序列内第k小的值
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int tot,rt[N];
char s[10];
vector<int> v;
struct data
{
int id;
int l,r,x;
}data[N*2];
inline int getid(int x) {return lower_bound(v.begin(),v.end(),x) - v.begin() + 1;}
void input(int n)
{
char s[10];
int x;
for(int i=0;i<n;i++)
{
scanf("%s",s);
if(s[0]=='I')
{
scanf("%d",&x);
data[i].id = 0;
data[i].x = x;
v.push_back(x);
}
else if(s[6]=='1')
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
data[i].id = 1;
data[i].l = a, data[i].r = b, data[i].x = c;
}
else if(s[6]=='2')
{
scanf("%d",&x);
data[i].id = 2;
data[i].x = x;
}
else
{
scanf("%d",&x);
data[i].id = 3;
data[i].x = x;
}
}
}
struct node
{
int l,r,sum;
}tree[N*24];
inline void build(int l,int r,int &x) //1~v.size()
{
x = ++tot;
tree[x].sum = 0;
if(l==r) return;
int m = (l+r) >> 1;
build(l,m,tree[x].l);
build(m+1,r,tree[x].r);
}
inline void update(int l,int r,int &x,int y,int k)
{
tree[++tot] = tree[y], tree[tot].sum++,x=tot;
if(l==r) return;
int m = (l+r) >> 1;
if(k<=m) update(l,m,tree[x].l,tree[y].l,k);
else update(m+1,r,tree[x].r,tree[y].r,k);
}
inline int query1(int l,int r,int y,int x,int k) //查找区间第k小的数
{
if(l==r) return l;
int mid = (l+r) >> 1;
int sum = tree[tree[x].l].sum - tree[tree[y].l].sum;
if(k<=sum) return query1(l,mid,tree[y].l,tree[x].l,k);
else return query1(mid+1,r,tree[y].r,tree[x].r,k-sum);
}
inline int query2(int l,int r,int x,int k) //在当前序列中,输出X是第几小的数。
{
if(l==r) return 1;
int mid = (l+r) >> 1;
if(k<=mid) return query2(l,mid,tree[x].l,k);
else
{
int sum = tree[tree[x].l].sum;
return sum += query2(mid+1,r,tree[x].r,k);
}
}
inline int query3(int l,int r,int x,int k) //找到当前序列中第X小的数是几
{
if(l==r) return l;
int mid = (l+r) >> 1;
int sum = tree[tree[x].l].sum;
if(sum>=k) return query3(l,mid,tree[x].l,k);
else return query3(mid+1,r,tree[x].r,k-sum);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n;
int cas = 1;
while(~scanf("%d",&n))
{
v.clear();
tot = 0;
LL ans1 = 0, ans2 = 0, ans3 = 0;
input(n);
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
int cnt = v.size();
build(1,cnt,rt[0]);
int now = 1;
for(int i=0;i<n;i++)
{
if(data[i].id==0)
{
update(1,cnt,rt[now],rt[now-1],getid(data[i].x));
now++;
}
else if(data[i].id==1)
{
int l = data[i].l, r = data[i].r, x = data[i].x;
ans1 += v[query1(1,cnt,rt[l-1],rt[r],x)-1];
}
else if(data[i].id==2) ans2+=query2(1,cnt,rt[now-1],getid(data[i].x));
else ans3+=v[query3(1,cnt,rt[now-1],data[i].x)-1];
}
printf("Case %d:\n%I64d\n%I64d\n%I64d\n",cas++,ans1,ans2,ans3);
}
return 0;
}
HDU-3727 Jewel的更多相关文章
- hdu 3727 Jewel (可持久化线段树+bit)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=3727 题意: 对一段序列进行四种操作: Insert x :在序列尾部插入一个x: Query_1 s ...
- HDU 3727 Jewel 可持久化线段树
Jewel Problem Description Jimmy wants to make a special necklace for his girlfriend. He bought man ...
- HDU 3727 Jewel 主席树
题意: 一开始有一个空序列,然后有下面四种操作: Insert x在序列尾部加入一个值为\(x\)的元素,而且保证序列中每个元素都互不相同. Query_1 s t k查询区间\([s,t]\)中第\ ...
- 【HDOJ】3727 Jewel
静态区间第K大值.主席树和划分树都可解. /* 3727 */ #include <iostream> #include <sstream> #include <stri ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
随机推荐
- 学Linux到底学什么?
前言 我们常常听到很多人说要学学Linux或者被人告知说应该学学Linux,那么学Linux到底要学什么? 为什么要学Linux 在回答学什么之前,我们先看看为什么要学.首先我们需要认识到的是,很多服 ...
- Eclipse添加自定义注释
首先介绍几个常用的注解: @author 作者名 @date 日期 @version 版本标识 @parameter 参数及其意义 @return 返回值 @throws 异常类及抛出条件 @depr ...
- C语言:互质
今天遇到一道奇怪的程序题,和平常的不同.同样都是互质,但是一般的题目都是判断两个数字是否互质,但这道题则是给定一个数字n,要求输出所有小于等于n的与n互质的数,题目已经在下面给出: 质数与互质概念不是 ...
- libpcap的下载与安装(apt-get安装unable to locate package 的解决方法(Ubantu))
因为网络安全课的实验课要求,我们得下载libcap我们得做一个类似于tcpdump的一个东西.具体要求就不贴出来了. libpcap只能在官网(www.tcpdump.org)下到,我用的os是Ubu ...
- LoadRunner具体流程
创建负载测试场景场景目标:模拟10个用户同时登陆.搜索航班.购买机票.查看航班路线并退出打开Controller并创建一个新场景1.打开HP LoadRunner2.打开Controller在Load ...
- springMvc 通过url传值,实现访问
springMvc 通过url传值,实现访问 1.创建web项目,引入相关jar包,并完成相应配置,在上一篇博客已经实现 2.在WEB-INF下创建jsp文件夹,并创建hello.jsp文件 < ...
- 插入订单并且输出订单号的sql存储过程
--插入订单-- create proc InsertOrders ( @OrderNumber varchar(300), @OrderState varchar(30), @OrderType v ...
- [NLP] Adaptive Softmax
1. Overview Adaptive softmax算法在链接1中的论文中提出,该算法目的是为了提高softmax函数的运算效率,适用于一些具有非常大词汇量的神经网络. 在NLP的大部分任务中,都 ...
- JavaScript中的基本数据类型和引用数据类型
ECMAScript变量包括了两种不同的数据类型 在学习JavaScript的数据类型时,我们通常会把数据类型分成六中(官方认为)Object.String.Boolean.Number.Undefi ...
- 更好一点的:Vue 利用指令实现禁止反复发送请求
理论上可以用于任何元素,生效时会在元素上出现一个同大小的灰色蒙层(button元素会该表原生的disabled属性). /** * 当元素触发发起请求后,当发起的请求中最后一个请求的结果返回(不关心返 ...