Luogu 1816忠诚
题目描述
老管家是一个聪明能干的人。他为财主工作了整整10年,财主为了让自已账目更加清楚。要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判断管家的忠诚,他把每次的账目按1,2,3…编号,然后不定时的问管家问题,问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是一次问多个问题。
输入输出格式
输入格式:
输入中第一行有两个数m,n表示有m(m<=100000)笔账,n表示有n个问题,n<=100000。
第二行为m个数,分别是账目的钱数
后面n行分别是n个问题,每行有2个数字说明开始结束的账目编号。
输出格式:
输出文件中为每个问题的答案。具体查看样例。
输入输出样例
输入样例#1:
10 3 1 2 3 4 5 6 7 8 9 10 2 7 3 9 1 10输出样例#1:
2 3 1
整体二分写搓啦。。。然后T掉。。。
1 #include <cstdio> 2 const int N = 200010; 3 struct q { 4 int l, r, k, id, type, val; 5 }q[N], q1[N], q2[N]; 6 int n, m, ans[N], tot, bit[N]; 7 8 void add(int i, int v) { 9 for( ; i <= n ; i += i & -i) 10 bit[i] += v; 11 } 12 int sum(int i, int ret = 0) { 13 for( ; i ; i -= i & -i) 14 ret += bit[i]; 15 return ret; 16 } 17 18 void solve(int head, int tail, int l, int r) { 19 if(head > tail) return; 20 if(l == r) { 21 for(int i = head ; i <= tail ; i ++) { 22 if(q[i].type == 2) { 23 ans[q[i].id] = l; 24 } 25 } 26 return; 27 } 28 int mid = (l + r) >> 1, f = 0, g = 0; 29 for(int i = head ; i <= tail ; i ++) { 30 if(q[i].type == 1) { 31 if(q[i].val <= mid) { 32 add(q[i].id, 1); 33 q1[f ++] = q[i]; 34 } else { 35 q2[g ++] = q[i]; 36 } 37 }else if(q[i].type == 2) { 38 int s = sum(q[i].r) - sum(q[i].l - 1); 39 if(s >= q[i].k) { 40 q1[f ++] = q[i]; 41 } else { 42 q[i].k -= s; 43 q2[g ++] = q[i]; 44 } 45 } 46 } 47 for(int i = 0 ; i < f ; i ++) 48 if(q1[i].type == 1) 49 add(q1[i].id, -1); 50 for(int i = 0 ; i < f ; i ++) 51 q[head + i] = q1[i]; 52 for(int i = 0 ; i < g ; i ++) 53 q[head + f + i] = q2[i]; 54 solve(head, head + f - 1, l, mid); 55 solve(head + f, tail, mid + 1, r); 56 } 57 58 int main() { 59 scanf("%d%d", &n, &m); 60 for(int i = 1 ; i <= n ; i ++) { 61 tot ++; 62 scanf("%d", &q[tot].val); 63 q[tot].id = i; 64 q[tot].type = 1; 65 } 66 for(int i = 1 ; i <= m ; i ++) { 67 tot ++; 68 scanf("%d%d", &q[tot].l, &q[tot].r); 69 q[tot].id = i; 70 q[tot].type = 2; 71 q[tot].k = 1; 72 } 73 solve(1, tot, -0x3f3f3f3f, 0x3f3f3f3f); 74 for(int i = 1 ; i <= m ; i ++) 75 printf("%d ", ans[i]); 76 }