您的位置:首页 > 其它

4299: Codechef FRBSUM

2018-07-24 17:01 1151 查看

4299: Codechef FRBSUM

https://www.lydsy.com/JudgeOnline/problem.php?id=4299

 

分析:

  主席树。

  https://blog.sengxian.com/solutions/bzoj-4408

 

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
using namespace std;
typedef long long LL;

inline int read() {
int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
}

const int N = 100100;

int ls[N*31], rs[N*31], sum[N*31], Root
, CntNode;

void update(int l,int r,int &rt,int last,int p) {
rt = ++CntNode;
sum[rt] = sum[last] + p;
if (l == r) return;
int mid = (l + r) >> 1;
if (p <= mid) {
rs[rt] = rs[last];
update(l, mid, ls[rt], ls[last], p);
}
else {
ls[rt] = ls[last];
update(mid+1, r, rs[rt], rs[last], p);
}
}
int query(int l,int r,int Head,int Tail,int x) {
if (l == r) {
return sum[Tail] - sum[Head];
}
int mid = (l + r) >> 1;
if (x <= mid) return query(l, mid, ls[Head], ls[Tail], x);
else return sum[ls[Tail]] - sum[ls[Head]] + query(mid+1, r, rs[Head], rs[Tail], x);
}
int main () {

int n = read();
for (int i=1; i<=n; ++i) {
int x = read();
update(1, 1e9, Root[i], Root[i-1], x);
}
int m = read();
while (m -- ) {
int l = read(), r = read(), ans = 1, tmp;
while (true) {
tmp = query(1, 1e9, Root[l-1], Root[r], ans);
if (tmp < ans) break;
ans = tmp + 1;
}
printf("%d\n",ans);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: