Jimmy wants to make a special necklace for his girlfriend. He bought many beads with various sizes, and no two beads are with the same size. Jimmy can't remember all the details about the beads, for the necklace is so long. So he turns to you for help. 

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的更多相关文章

  1. hdu 3727 Jewel (可持久化线段树+bit)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3727 题意: 对一段序列进行四种操作: Insert x :在序列尾部插入一个x: Query_1 s ...

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

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

  3. HDU 3727 Jewel 主席树

    题意: 一开始有一个空序列,然后有下面四种操作: Insert x在序列尾部加入一个值为\(x\)的元素,而且保证序列中每个元素都互不相同. Query_1 s t k查询区间\([s,t]\)中第\ ...

  4. 【HDOJ】3727 Jewel

    静态区间第K大值.主席树和划分树都可解. /* 3727 */ #include <iostream> #include <sstream> #include <stri ...

  5. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  7. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  8. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  10. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

随机推荐

  1. csp-s2019游记

    11.15D0: 复习 复习 机房里弥漫着颓废的气息,不过也是最后一个下午了 11.16D1: 五点钟爬起来,一边发抖一边去楼下买早饭 虽然平时基本不吃早饭,但考前不行 搭着同学的车去了考点,在车上重 ...

  2. Tomcat开启关闭常见问题

    启动 bin/startup.bat ,双击运行该文件即可 访问:浏览器输入: http://localhost:8080 回车访问自己 http://别人的ip:8080 访问别人 可能出现的问题: ...

  3. python脚本 环境准备

    现在的公司用 Python 做 Web 开发,入职到现在为止(三个月),算是入门了 Python Web 开发 但是 Python 本身是脚本语言,我还从来没有体会到脚本语言能给日常工作带来的便利 就 ...

  4. mybatis什么时候必须指定jdbcType

    #{property,javaType=int,jdbcType=NUMERIC}如果一个列允许 null 值,并且会传递值 null 的参数,就必须要指定 JDBC Type

  5. 腾讯Techo开发者大会PPT分享

    腾讯云年度的开发者大会已经落幕,大会包括1场前沿技术主峰会,18个技术专场,150位海内外技术专家,28个互动展区,8场动手实验室,23小时小程序云开发极限编程,1场数据库诊断大赛. 内容上涵盖了最新 ...

  6. java property 配置文件管理工具框架,避免写入 property 乱序

    property property 是 java 实现的 property 框架. 特点 优雅地进行属性文件的读取和更新 写入属性文件后属性不乱序 灵活定义编码信息 使用 OO 的方式操作 prope ...

  7. nyoj 83-迷宫寻宝(二) (计算几何, 叉积)

    83-迷宫寻宝(二) 内存限制:10MB 时间限制:1000ms 特判: No 通过数:2 提交数:6 难度:5 题目描述: 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个 ...

  8. python学习基础—day01

    一. python是什么? 优势:简单, 可以跨平台 劣势:执行效率没有C语言那么高 python是解释型语言,逐行编译解释,在不同的系统windows与Linux,需要不同的解释器来编译. 而编译型 ...

  9. 用 GitBook 创建一本书

    用 GitBook 创建一本书 Gitbook 首先是一个软件,它使用 Git 和 Markdown 来编排书本,如果你没有听过 Git 和 Markdown,那么 gitbook 可能不适合你直接入 ...

  10. 编写自定义cmake配置文件FindXXX.cmake或者xxx-config.cmake | cmake with user defined entry

    本文首发于个人博客https://kezunlin.me/post/12ab5707/,欢迎阅读! cmake with user defined entry Guide FindXXX.cmake ...