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. AI的真实感

    目录 1.让AI"不完美"--估算和假设 2 AI感知 全能感知 特定感觉无知 3 AI的个性 4 AI的预判 5 AI的智能等级 ​ AI的真实感一直是游戏AI程序员追求的目标, ...

  2. mysql中int、bigint、smallint、tinyint 长度

    mysql中int.bigint.smallint.tinyint 长度 bigint -2^63 (-9223372036854775808) 到 2^63-1 (92233720368547758 ...

  3. A Lot of Games(Trie树 + 博弈)

    题目链接:http://codeforces.com/contest/455/problem/B 题意:n, k 分别表示 字符串组数 和 比赛次数.  从一个空单词开始, a,b二人分别轮流往单词后 ...

  4. Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制

    前言 在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security.Apache Shiro 等.本文主要简单介绍一下 Spring Security,再通过 ...

  5. C++学习第一天(打卡)

    C++和C最大的区别可能就是添加了面向对象的编程. using namespace std 是其中oop的一个特性. using namespace std 可以使程序使用std名称空间里面的定义. ...

  6. CentOS7中安装MariaDB

    什么是mariaDB? 在线安装(慢的要命) RPM离线安装(CentOS7.X) 在线安装 打开官方网站 https://mariadb.org/ 点击Download,跳转到下一页面 继续点击Do ...

  7. (二)OpenStack---M版---双节点搭建---数据库安装和配置

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 本章节只在Controller节点执行 1.安装Mariadb数据库来存储信息 2.NoSQL数 ...

  8. JavaScript笔记十二

    1.DOM对CSS的操作 - 读取和修改内联样式 - 使用style属性来操作元素的内联样式 - 读取内联样式: 语法:元素.style.样式名 - 例子: 元素.style.width 元素.sty ...

  9. nginx一:安装和基本应用

    Nginx: 目录 Nginx:... 1 NGINX简介和安装... 1 网站... 1 全称... 2 二次开发版... 2 Nginx的特性... 2 基本功能... 2 web服务相关的功能. ...

  10. Python编译升级

    [root@localhost python]# tar xvf Python-3.6.9.tgz [root@localhost python]# cd Python-3.6.9/ [root@lo ...