【COGS 1534】 [NEERC 2004]K小数 &&【COGS 930】 [河南省队2012] 找第k小的数 可持久化01Trie

板子题,只是记得负数加fix最方便

#include <cstdio>
const int A=19,N=100010;
namespace FIFO
{
    char ch,B[1<<20],*S=B,*T=B;
    #define getc() (S==T&&(T=(S=B)+fread(B,1,1<<20,stdin),S==T)?0:*S++)
    #define isd(c) (c>=‘0‘&&c<=‘9‘)
    int aa,bb;int F(){
        while(ch=getc(),!isd(ch)&&ch!=‘-‘);ch==‘-‘?aa=bb=0:(aa=ch-‘0‘,bb=1);
        while(ch=getc(),isd(ch))aa=aa*10+ch-‘0‘;return bb?aa:-aa;
    }
}
#define gi FIFO::F()
struct Trie{
    Trie *ch[2];int size;
}*root[N],*null,node[(1<<22)+10];
int n,m,sz=1;
int main(){
    freopen("kth.in","r",stdin);freopen("kth.out","w",stdout);
    null=node,null->ch[0]=null->ch[1]=null,root[0]=null;
    n=gi,m=gi;for(register int i=1,x;i<=n;i++){
        root[i]=node+sz,sz++,x=gi;register Trie *p=root[i],*last=root[i-1];
        for(register int i=A;i>=0;i--)
            p->ch[(x>>i)&1]=node+sz,sz++,p->ch[((x>>i)&1)^1]=last->ch[((x>>i)&1)^1],
            p=p->ch[(x>>i)&1],last=last->ch[(x>>i)&1],p->size=last->size+1;
    }
    register int x,y,k;while(m--){
        x=gi,y=gi,k=gi;register Trie *a=root[x-1],*b=root[y];register int ret=0;
        for(register int i=A;i>=0;i--)
            if(b->ch[0]->size-a->ch[0]->size>=k)a=a->ch[0],b=b->ch[0];
            else ret|=(1<<i),k-=b->ch[0]->size-a->ch[0]->size,a=a->ch[1],b=b->ch[1];
        printf("%d\n",ret);
    }
}

【COGS 930】 [河南省队2012] 找第k小的数

#include <cstdio>
const int A=30,N=100010,fox=1000000000;
namespace FIFO
{
    char ch,B[1<<20],*S=B,*T=B;
    #define getc() (S==T&&(T=(S=B)+fread(B,1,1<<20,stdin),S==T)?0:*S++)
    #define isd(c) (c>=‘0‘&&c<=‘9‘)
    int aa,bb;int F(){
        while(ch=getc(),!isd(ch)&&ch!=‘-‘);ch==‘-‘?aa=bb=0:(aa=ch-‘0‘,bb=1);
        while(ch=getc(),isd(ch))aa=aa*10+ch-‘0‘;return bb?aa:-aa;
    }
}
#define gi FIFO::F()
struct Trie{
    Trie *ch[2];int size;
}*root[N],*null,node[(1<<22)+10];
int n,m,sz=1;
int main(){
    freopen("kthnumber.in","r",stdin);freopen("kthnumber.out","w",stdout);
    null=node,null->ch[0]=null->ch[1]=null,root[0]=null;
    n=gi,m=gi;for(register int i=1,x;i<=n;i++){
        root[i]=node+sz,sz++,x=gi+fox;register Trie *p=root[i],*last=root[i-1];
        for(register int i=A;i>=0;i--)
            p->ch[(x>>i)&1]=node+sz,sz++,p->ch[((x>>i)&1)^1]=last->ch[((x>>i)&1)^1],
            p=p->ch[(x>>i)&1],last=last->ch[(x>>i)&1],p->size=last->size+1;
    }
    register int x,y,k;while(m--){
        x=gi,y=gi,k=gi;register Trie *a=root[x-1],*b=root[y];register int ret=0;
        for(register int i=A;i>=0;i--)
            if(b->ch[0]->size-a->ch[0]->size>=k)a=a->ch[0],b=b->ch[0];
            else ret|=(1<<i),k-=b->ch[0]->size-a->ch[0]->size,a=a->ch[1],b=b->ch[1];
        printf("%d\n",ret-fox);
    }
}

【COGS 1534】 [NEERC 2004]K小数

时间: 2024-10-13 02:40:31

【COGS 1534】 [NEERC 2004]K小数 &&【COGS 930】 [河南省队2012] 找第k小的数 可持久化01Trie的相关文章

COGS 930. [河南省队2012] 找第k小的数

题目描述 看到很短的题目会让人心情愉悦,所以给出一个长度为N的序列A1,A2,A3,...,AN, 现在有M个询问,每个询问都是Ai...Aj中第k小的数等于多少. 输入格式 第一行两个正整数N,M. 第二行N个数,表示序列A1,A2,...,AN. 紧着的M行,每行三个正整数i,j,k(k≤j-i+1),表示 询问Ai...Aj中第k小的数等于多少. 输出格式 共输出M行,第i行输出第i个询问的答案. 样例输入1: 4 3 4 1 2 3 1 3 1 2 4 3 1 4 4 样例输出1: 1

COGS 930. [河南省队2012] 找第k小的数 主席树

主席树裸板子 #include<cstdio> #include<iostream> #include<algorithm> #define MAXN 100005 #define MAX 2000005 using namespace std; int sum[MAX],l[MAX],mid[MAX],r[MAX],a[MAXN],b[MAXN],n,m,sz,size,root[MAXN],cnt; void build(int &x,int z,int y

cogs930.[河南省队2012] 找第k小的数

930. [河南省队2012] 找第k小的数 ★★★   输入文件:kth.in   输出文件:kth.out   简单对比 时间限制:1 s   内存限制:128 MB 题目描述 看到很短的题目会让人心情愉悦,所以给出一个长度为N的序列A1,A2,A3,...,AN, 现在有M个询问,每个询问都是Ai...Aj中第k小的数等于多少. 输入格式 第一行两个正整数N,M.第二行N个数,表示序列A1,A2,...,AN.紧着的M行,每行三个正整数i,j,k(k≤j-i+1),表示 询问Ai...Aj

[河南省队2012] 找第k小的数

★★☆   输入文件:kth.in   输出文件:kth.out   简单对比时间限制:1 s   内存限制:128 MB 题目描述 看到很短的题目会让人心情愉悦,所以给出一个长度为N的序列A1,A2,A3,...,AN, 现在有M个询问,每个询问都是Ai...Aj中第k小的数等于多少. 输入格式 第一行两个正整数N,M. 第二行N个数,表示序列A1,A2,...,AN. 紧着的M行,每行三个正整数i,j,k(k≤j-i+1),表示 询问Ai...Aj中第k小的数等于多少. 输出格式 共输出M行

无序数组求第K大/第K小的数

方法一:quicksort 根据快排思想,从后往前找比基准数小的,交换位置. 从前往后找比基准数大的,交换位置. 最后安放基准数. 保证 l到p 是大数,若 p-l+1==k 那么p就是第K大 若 p-l+1<k 那么从 p+1 到 r 中 找 k-(p-l+1)大的数 若 p-l+1>k 那么从 l 到 p-1中 找第k大的数. 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #in

关于利用快排思想求第K小数的分析

最近复习快排算法,记得当时最有意思的是可以用快排的partition函数求出第K小数 于是上网搜索一番,发现都只是贴出了代码.无奈只好自己研究了下 利用快排partition求第k小数不得不从partition函数开始说: 快速排序的思想是在一组待排序的数中,找出一个数作为分界,使得它前面的数都比它小,后面的数都比它大.这个数叫做枢轴 当求出一组数的枢轴以后,一组数就可以以枢轴为界限分成两组,我们可以递归的找出这两个组的枢轴,只到每组只有一个数 这里我们应该注意的是,partition函数返回的

Bsoj 1322 第K小数

第K小数 Description 现在已有N个整数,你有以下三种操作: 1 A:表示加入一个值为A的整数: 2 B:表示删除其中值为B的整数: 3 K:表示输出这些整数中第K小的数: Input 第一行,两个整数N,M,表示最开始有N个整数,总共有M个操作 第二行用空格隔开的N个整数 接下来M行,每行表示一个操作 Output 若干行,一行一个整数,表示所求的第K小的数字 Sample Input 5 5 6 2 7 4 9 1 8 1 6 3 10 2 4 3 3 Sample Output

hiho week 37 P1 : 二分&#183;二分查找之k小数

P1 : 二分·二分查找之k小数 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的 船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了.所以Nettle不得不把其中一艘船拆掉来让位给新的船.Nettle思考了很久, 决定随机选择一个k,然后拆掉稀有度第k小的船. 已知

【Luogu】P3384主席树模板(主席树查询K小数)

YEAH!我也是一个AC主席树模板的人了! 其实是个半吊子 我将尽量详细的讲出我的想法. 主席树太难,我们先搞普通线段树好了 普通线段树怎么做?我的想法是查询K次最小值,每次查完把查的数改成INF,查完再改回来... MDZZ 于是就有了主席树. 先不考虑主席树,我们来考虑一个奇特的线段树. 一般的线段树,数列位置是下标,而把数列维护值作为线段树中存的元素. 那我们如果反过来,把数列元素当做线段树的下标...??? 比如说数列[4 2 3 1] 如果线段树的下标是1.2.3.4......? 那