玲珑杯#20 造物主的戒律
来源:互联网 发布:网络传输器 编辑:程序博客网 时间:2024/06/05 00:59
题目链接
题意给一个序列每次询问给l,r,x,k1,k2,每次查询区间中小于等于x的所有数字里面第k1小的值以及大于x的所有数字里面第k2小的值,如果不存在,输出-1
每次输出两个数,对于每个数如果不存在,则单独输出-1
主席树模板题,找出≤x的个数P,然后查询区间第k1 , k2+P小的数字。
#include<cmath>#include<algorithm>#include<cstring>#include<string>#include<set>#include<map>#include<time.h>#include<cstdio>#include<vector>#include<list>#include<stack>#include<queue>#include<iostream>#include<stdlib.h>using namespace std;#define LONG long longconst int INF=0x3f3f3f3f;const LONG MOD=1e9+ 7;const double PI=acos(-1.0);#define clrI(x) memset(x,-1,sizeof(x))#define clr0(x) memset(x,0,sizeof x)#define clr1(x) memset(x,INF,sizeof x)#define clr2(x) memset(x,-INF,sizeof x)#define EPS 1e-10#define lson l , mid , rt<< 1#define rson mid + 1 ,r , (rt<<1)+1#define root 1, n , 1const int MAXN = 4e5 ;struct Tree{ int l, r ; int val ;}tree[MAXN *30+ 30];int N , n ;int a[400100] ;int Root[400100] ;int tot = 0;int num[400100] ;void Push_up(int rt ){ tree[rt].val = tree[tree[rt].l].val + tree[tree[rt].r].val ;}int Build(int l, int r){ int rt = tot ++ ; if(l == r) { tree[rt].val = 0 ; return rt ; } int mid = (l + r) / 2; tree[rt].l = Build(l , mid ) ; tree[rt].r = Build(mid + 1, r) ; Push_up(rt) ; return rt ;}int Hash(){ sort(a + 1, a +N+1 ) ; return unique(a +1 , a + N +1 ) - a - 1;}int Update(int l ,int r , int rt , int x){ tot ++ ; int now = tot ; tree[now] = tree[rt] ; if(l ==r ) { tree[now].val ++ ; return now; } int mid = ( l + r ) / 2; if( x <= a[mid]) tree[now].l = Update(l , mid , tree[now].l ,x) ; else tree[now].r = Update(mid + 1, r , tree[now].r , x) ; Push_up( now ) ; return now ;}int Que1( int l , int r , int R_rt ,int L_rt , int k ){ if( ( l == r) ) return a[l]; int mid = (l +r ) / 2; if(k > tree[tree[R_rt].l].val - tree[tree[L_rt].l].val ) return Que1(mid+1 ,r , tree[R_rt].r,tree[L_rt].r , k - tree[tree[R_rt].l].val + tree[tree[L_rt].l].val ) ; else return Que1(l , mid ,tree[R_rt].l, tree[L_rt].l , k ) ;}int Que2(int l ,int r ,int R_rt , int L_rt , int x){ if(l == r) { if(a[l] <= x) return tree[R_rt].val - tree[L_rt].val ; return 0 ; } int mid = (l + r) / 2; if(a[mid] >= x) return Que2(l , mid , tree[R_rt].l , tree[L_rt].l , x) ; else return tree[tree[R_rt].l].val - tree[tree[L_rt].l].val + Que2(mid + 1 , r , tree[R_rt].r , tree[L_rt].r , x ) ;}int main(){ int m ; scanf("%d%d",&N ,&m) ; tot = 0 ; for(int i =1 ; i <= N ;++ i) scanf("%d",&a[i]),num[i] = a[i] ; n = Hash() ; int now = 0 ; Root[0] = Build(1 , n ); int p ; for(int i = 1;i<= N ; ++ i) Root[i] = Update(1 , n , Root[i-1] , num[i] ) ; int K1,K2 ; int l , r ; int x ; int len ; int res1 , res2 ; while(m --) { scanf("%d%d%d%d%d",&l,&r,&x,&K1, &K2) ; int P = Que2(1 , n ,Root[r] , Root[l-1] , x) ; len = r - l + 1; res1 = -1 , res2 = -1 ; if(P >= K1 && K1 != 0) res1 = Que1(1,n,Root[r],Root[l-1] , K1) ; if( len - P >= K2&& K2 != 0) res2 = Que1(1 , n ,Root[r] , Root[l-1] , K2 + P ) ; printf("%d %d\n",res1,res2) ; } return 0 ;}
阅读全文
1 0
- 玲珑杯#20 造物主的戒律
- “玲珑杯”ACM比赛 Round #20 E -- 造物主的戒律(主席树)
- 玲珑杯Round#20-E 1157 造物主的戒律 动态主席树算法
- 造物主的存在与人工智能
- 玲珑杯 Round #20
- 3D农场:神秘的造物主
- 玲珑杯
- 【玲珑杯】A--萌萌哒的第一题
- 玲珑杯1096 萌萌哒的第一题
- 玲珑杯 1099萌萌哒的第四题
- 玲珑杯-萌萌哒的第六题
- 一种不堪忍受的戒律
- Java开发者的十戒律
- 编程的十条戒律
- 人生的八大戒律(转载)
- 造物主鬼斧神工
- 【玲珑杯 1010 Alarm】
- 玲珑杯 1010 - Alarm
- 数据结构与算法——2.1线性表的概念
- 数据库表的连接 join on
- LoadRunner问题处理
- 12种排序算法详解
- 看过Django后回头来看Flask(1)
- 玲珑杯#20 造物主的戒律
- CSS Border属性solid(实线)使用介绍
- 第一次博客
- android OpenGL开发使用JPCT-AE引擎显示3D立方体
- bootstrap弹出框被模态框遮挡
- sublime text一些基本操作
- 隐式/显式反馈
- 计算机网络常见面试题
- Codeforces Round #359 (Div. 1) B. Kay and Snowflake dfs