码迷,mamicode.com
首页 > 其他好文 > 详细

今日头条(3-30)第四题(离线)

时间:2017-03-31 13:17:21      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:return   ons   cin   span   pen   freopen   lowbit   复杂度   排序   

题意:n对(a,b),q次查询(x,y) a>=x&&b>=y的对数

对于100%数据,1<=所有的数<=1e5

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+5;
 4 int a[maxn],b[maxn],c[maxn];
 5 int x[maxn],y[maxn],z[maxn];
 6 int ans[maxn],sum[maxn];
 7 /*
 8     求ai>=x&&bi>=y的个数,有q组询问
 9     如果保证ai>=x,那么只要保证查询bi>=y的有多少个就可以了
10     把a b按照a从大到小排序
11     把x y按照x从大到小排序
12     这样,对于一个(xi,yi)只要把所有a>=xi的,b加入树状数组或者线段数
13     就能很快的查询b>=yi的个数
14     n个数插入树状数组一次,复杂度O(nlogn)
15     总共查询q次,复杂度O(nlogn)
16     总体复杂度O(nlogn)
17 */
18 
19 bool cmp1(int i,int j){
20     if(a[i]==a[j])return b[i]>b[j];
21     return a[i]>a[j];
22 }
23 bool cmp2(int i,int j){
24     if(x[i]==x[j])return y[i]>y[j];
25     return x[i]>x[j];
26 }
27 
28 int lowbit(int x){return x&(-x);}
29 
30 int add(int x){
31     while(x<maxn){
32         c[x]++;
33         x+=lowbit(x);
34     }
35 }
36 
37 int Sum(int x){
38     int ret=0;
39     while(x>0){
40         ret+=sum[x];
41         x-=lowbit(x);
42     }
43     return ret;
44 }
45 int main(){
46     //freopen("in.txt","r",stdin);
47     for(int i=1;i<maxn;i++)c[i]=i,z[i]=i;
48     int n,q;
49     cin>>n>>q;
50     for(int i=0;i<n;i++)cin>>a[i];
51     for(int i=0;i<n;i++)cin>>b[i];
52     sort(c,c+n,cmp1);
53     
54     //离线
55     for(int i=0;i<q;i++)cin>>x[i]>>y[i];
56     sort(z,z+q,cmp2);
57     
58     int top=0;
59     
60     for(int i=0;i<q;i++){
61         while(top<n&&a[c[top]]>=x[z[i]])add(b[c[top++]]);
62         ans[z[i]]=top-Sum(y[z[i]]-1);
63     }
64     
65     for(int i=0;i<q;i++)
66         cout<<ans[i]<<endl;
67     
68     return 0;
69 }

 

今日头条(3-30)第四题(离线)

标签:return   ons   cin   span   pen   freopen   lowbit   复杂度   排序   

原文地址:http://www.cnblogs.com/jihe/p/6650640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!