玲珑杯 1157 造物主的戒律

传送门:http://www.ifrog.cc/acm/problem/1157

题意:

  给一个数组,n多次询问,每次询问区间[l,r]中小于等于x的第k1小的数,大于x的第k2小的数。

题解:

  比较裸的主席树了,多了个限制,对于每个询问的前一部分直接求区间第k1小的数和x比较一下就行了,对于后一部分查询先判断x为第几小的数然后加上k2就行了。。。

题解说是可持续化字典树(不还是主席树吗)。。。还没想太明白。。。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=400000+100;
 4 int a[maxn],tot=0,r,l,x,k1,k2,n,m;
 5 int root[maxn];
 6 struct node {
 7     int l, r , sum;
 8 }t[maxn*40];
 9 vector<int> g;
10 int getid(int x) {
11     return lower_bound(g.begin(),g.end(),x)-g.begin()+1;
12 }
13
14 void update(int l, int r, int &x, int y,int pos) {
15     t[++tot]=t[y]; t[tot].sum++; x=tot;
16     if(l==r) return;
17     int mid=l+r>>1;
18     if(mid>=pos)update(l,mid,t[x].l,t[y].l,pos);
19     else update(mid+1,r,t[x].r,t[y].r,pos);
20 }
21
22 int newupdate(int l, int r, int pos, int x, int y) {
23     if(t[x].sum-t[y].sum==0) return 0;
24     if(l==r) return t[x].sum-t[y].sum;
25     int ans=0;
26     int mid=l+r>>1;
27     if(mid>=pos) ans+=newupdate(l,mid,pos,t[x].l,t[y].l);
28     else {
29         ans+=t[t[x].l].sum-t[t[y].l].sum;
30         ans+=newupdate(mid+1,r,pos,t[x].r,t[y].r);
31     }
32     return ans;
33 }
34 int query(int l, int r, int x, int y, int k) {
35     if(l==r) return l;
36     int mid=l+r>>1;
37     int sum=t[t[y].l].sum-t[t[x].l].sum;
38     if(sum>=k)return query(l,mid,t[x].l,t[y].l,k);
39     else return query(mid+1,r,t[x].r,t[y].r,k-sum);
40 }
41 int main() {
42 #ifdef ac
43     freopen("in.txt","r",stdin);
44 #endif
45     scanf("%d%d",&n,&m);
46     for(int i=1;i<=n;++i){
47         scanf("%d",&a[i]);
48         g.push_back(a[i]);
49     }
50     sort(g.begin(),g.end());
51     g.erase(unique(g.begin(),g.end()),g.end());
52     for(int i=1;i<=n;++i) update(1,n,root[i],root[i-1],getid(a[i]));
53     for(int i=1;i<=m;++i) {
54         scanf("%d%d%d%d%d",&l,&r,&x,&k1,&k2);
55         int tans1=-1,tans2=-1,tmp;
56         if(r-l+1>=k1) tans1=query(1,n,root[l-1],root[r],k1)-1;
57         if(tans1==-1||g[tans1]>x) tans1=-1; else tans1=g[tans1];
58         tmp=newupdate(1,n,upper_bound(g.begin(),g.end(),x)-g.begin(),root[r],root[l-1]);
59         if(r-l+1>=tmp+k2)tans2=query(1,n,root[l-1],root[r],k2+tmp)-1;
60         if(tans2!=-1) tans2=g[tans2];
61         printf("%d %d\n",tans1,tans2);
62     }
63     return 0;
64 }

时间: 2024-10-26 21:48:32

玲珑杯 1157 造物主的戒律的相关文章

&lt;swustoj&gt;?id=1157 n个数的最小公倍数

链接http://acm.swust.edu.cn/problem/1157/ #include<stdio.h> int main() { int n,a[12],i,j; while(~scanf("%d",&n)) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=a[0];;i++) { for(j=0;j<n;j++) { if(i%a[j]==0) { continue

ACdream 1157 Segments(CDQ分治)

题目链接:http://acdream.info/problem?pid=1157 Problem Description 由3钟类型操作:1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]2)C i (1-base) 删除第i条增加的线段,保证每条插入线段最多插入一次,且这次删除操作一定合法3) Q L R(1 <= L <= R <= 1000000000) 查询目前存在的线段中有多少条线段完全包含[L,R]这个线段,线段X

“玲珑杯”ACM比赛 Round #19题解&amp;源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】

A -- simple math problem Time Limit:2s Memory Limit:128MByte Submissions:1599Solved:270 SAMPLE INPUT 5 20 1314 SAMPLE OUTPUT 5 21 1317 SOLUTION “玲珑杯”ACM比赛 Round #19 题目链接:http://www.ifrog.cc/acm/problem/1145 分析: 这个题解是官方写法,官方代码如下: 1 #include <iostream>

codevs 1157 2k进制数

1157 2k进制数 2006年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 设r是个2k进制数,并满足以下条件: (1)r至少是个2位的2k进制数. (2)作为2k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w. 在这里,正整数k(1≤k≤9)和w(k<W< span>≤30000)是事先给定的. 问:满足上述条件的不同的r共有

FZOJ 1157 Crazy Tea Party

OJ题目:click here~~ 题目分析:1--n按顺序围成一个圈,1与n相邻.交换相邻两个数算1步.至少需要多少步,得到一个逆方向的1--n的圈. 分两半,使用冒泡排序,排成逆序的交换次数之和即为结果. AC_CODE int f(int n){ return n*(n - 1)/2; } int main(){ int n , t; cin >> t; while(t--){ cin >> n; int ans = 0; if(n&1) ans = f(n/2) +

玲珑杯 1153 - 无影的神之右手 莫队

题目链接:http://www.ifrog.cc/acm/problem/1153 1153 - 无影的神之右手 Time Limit:4s Memory Limit:512MByte Submissions:183Solved:14 DESCRIPTION 觉不觉得这几个图很有毒啊?其实这几个不算很有毒吧~由乃懒得写题面了,反正写了也没人看,所以直接说题意吧~给你一个序列a,每次查询一个区间[l,r]的乘积的约数个数mod 19260817 INPUT 第一行两个数n,m 第二行n个数表示序列

“玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)

“玲珑杯”ACM比赛 Round #19 Start Time:2017-07-29 14:00:00 End Time:2017-07-29 16:30:00 Refresh Time:2017-07-29 16:42:55 Private B -- Buildings Time Limit:2s Memory Limit:128MByte Submissions:590Solved:151 DESCRIPTION There are nn buildings lined up, and th

玲珑杯#7 1/5

1.玲珑杯#7 2. A   题意:两个数组a[],b[],操作(ai-1, ai, ai+1)->(ai-1 + ai, -ai, ai+1 + ai),看是否相等. 总结:(ai-1, ai, ai+1)->(ai-1 + ai, -ai, ai+1 + ai)如果考虑前缀和,那么一次操作等效(si-1, si, si+1)->(si, si-1, si+1).   注意:前缀和. B 题意:王国攻占游戏,从编号1城市开始,+v表示编号v的城市再连接一个新的城市,编号为当前最大编号加

FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)

FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术) Time Limit: 1000MS   Memory Limit: 257792K [Description] [题目描述] Fat Brother is a powerful magician. Both he and his enemy has N soldiers and each soldier has IQ. When two soldier is in PK, the one whose IQ