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 ...
随机推荐
- W与V模型的联系与区别
很多小白一定要注意: 看准那个是开发的工作哪个是测试的工作,不要弄混了!!! 软件测试的V模型 以“编码”为黄金分割线,将整个过程分为开发和测试,并且开发和测试之间是串行的关系 ...
- VS安装
1. 只更改工作负载和单个组件 工作负载:我只勾选3个需要的 单个组件: 勾选 .NET 下Framework 别的不用改 2.点击安装,安装完成重启
- ESP 8266 引脚图
ESP 8266 引脚图
- 五分钟学会HTML5的WebSocket协议
1.背景 很多网站为了实现推送技术,所用的技术都是Ajax轮询.轮询是在特定的的时间间隔由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器.这种传统的模式带来很明显的缺点 ...
- opencv 2 Opencv数据结构与基本绘图
基础图像容器Mat Mat 是一个类,又两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针.矩阵头的尺 ...
- 用例建模Use Case Modeling
我的工程实践选题为ESP32低功耗的实现,本项目基于ESP32嵌入式开发平台. 以此题为例,在理解项目需求的基础上进行用例建模,抽取Abstract use case,画出用例图,并确定每一个用例的范 ...
- vue响应式的注意事项
在html中出现无法显示对象属性的情况,可能是需要在初始化对象时,先定义好属性. <template> <div> <div v-else class="req ...
- Filebeat自定义索引 && 多output过滤
一.目标 1)实现自定义索引 2)不同的input输出到各自对应的索引,nginx的日志输出到index-nginx的索引,zabbix的日志输出到index-zabbix,app的日志输出到inde ...
- ASP使用ajax来传递中文参数的编码处理
背景 asp的第一版是0.9测试版,自从1996年ASP1.0诞生,迄今20余载.虽然asp在Windows2000 IIS服务5.0所附带的ASP 3.0发布后好像再没有更新过了,但是由于其入手简单 ...
- python--debug神器pysnooper
使用它你可以获得什么优势: (1)无需用print就可以获得变量的值: (2)以日志地形式进行保存,方便随时查看: (3)可以根据需要,设置调用函数的深度: (4)多个函数的日志,可以设置前缀进行标识 ...