Hdu 5857 Median(给你一个有序的序列,取出连续的两段l1,l2,r1,r2,求这两段合并之后的中位数)
来源:互联网 发布:oracle 数据字典 编辑:程序博客网 时间:2024/05/02 02:40
传送门:Hdu 5857 Median
题意:给你一个有序的序列,取出连续的两段l1,l2,r1,r2,求这两段合并之后的中位数。
思路:比赛的时候没有看到有序,用了主席树求第k大
#include<bits/stdc++.h>using namespace std;const int maxn=101000;int root[maxn],sz;long long t[2*maxn],a[maxn];struct node{ int l,r,w;}T[maxn*30];struct q{ int l1,r1,l2,r2;}Q[maxn];void update(int &i,int l,int r,int num){ T[++sz]=T[i],i=sz; T[i].w++; if(l==r) return ; int mid=(l+r)>>1; if(num<=mid) update(T[i].l,l,mid,num); else update(T[i].r,mid+1,r,num);}int query(int x,int y,int x1,int y1,int l,int r,int k){ if(l==r) return l; int mid=(l+r)>>1; if(T[T[y].l].w-T[T[x].l].w+T[T[y1].l].w-T[T[x1].l].w>=k) return query(T[x].l,T[y].l,T[x1].l,T[y1].l,l,mid,k); else return query(T[x].r,T[y].r,T[x1].r,T[y1].r,mid+1,r,k-(T[T[y].l].w-T[T[x].l].w+T[T[y1].l].w-T[T[x1].l].w));}int main(){ int _,n,q; scanf("%d",&_); while(_--){ scanf("%d%d",&n,&q); for(int i=1;i<=n;i++) scanf("%lld",&a[i]),t[i]=a[i]; root[0]=0,sz=0; for(int i=1;i<=q;i++) scanf("%d%d%d%d",&Q[i].l1,&Q[i].r1,&Q[i].l2,&Q[i].r2); sort(t+1,t+n+1); int m=unique(t+1,t+n+1)-t-1; for(int i=1;i<=n;i++){ int num=lower_bound(t+1,t+m+1,a[i])-t; root[i]=root[i-1]; update(root[i],1,m,num); } for(int i=1;i<=q;i++){ int Count=Q[i].r1-Q[i].l1+2+Q[i].r2-Q[i].l2; if(Count&1) printf("%.1f\n",1.0*t[query(root[Q[i].l1-1],root[Q[i].r1],root[Q[i].l2-1],root[Q[i].r2],1,m,Count/2+1)]); else{ long long num1=t[query(root[Q[i].l1-1],root[Q[i].r1],root[Q[i].l2-1],root[Q[i].r2],1,m,Count/2+1)]; long long num2=t[query(root[Q[i].l1-1],root[Q[i].r1],root[Q[i].l2-1],root[Q[i].r2],1,m,Count/2)]; printf("%.1f\n",1.0*(num1+num2)/2); } } } return 0;}
0 0
- Hdu 5857 Median(给你一个有序的序列,取出连续的两段l1,l2,r1,r2,求这两段合并之后的中位数)
- 寻找两个有序数组合并之后的中位数
- 2个有序数组,寻找他们合并之后的中位数
- 给定两个有序数组,找出合并之后的数组中位数
- 两个有序序列的中位数
- 两个有序序列的中位数
- 若干有序序列,合并成一个新的有序序列
- LeetCoder 4. Median of Two Sorted Arrays (有序数组合并的中位数)
- Leetcode刷题记—— 4. Median of Two Sorted Arrays(两有序数组的中位数)
- 两组有序数列的中位数
- pat 两个有序序列的中位数
- PAT 两个有序序列的中位数
- 【C】两个有序序列的中位数
- PTA5-53 两个有序序列的中位数
- 两个有序序列的中位数(详解)
- 两个有序数组的中位数 Median of Two Sorted Arrays
- poj 2479 两段连续子序列的最大和
- 在一个两段有序的数组中查找
- View转换为Bitmap
- 自己实现MVC
- Java知识点19
- 浅谈在h5中的横向滚动的标题栏iscroll的运用(webapp)
- equals()方法的重写
- Hdu 5857 Median(给你一个有序的序列,取出连续的两段l1,l2,r1,r2,求这两段合并之后的中位数)
- cdn禁止ip访问
- PV、UV、UIP、VV、CPC、CPM、RPM、CTR 到底是什么东东?
- Java知识点20
- SSH学习记录之Spring(一)
- android动画之interpolator和typeEvaluator用法详解
- Android Studio无法查看源码
- 【b602】金明的预算方案
- 华为USG5500和USG6000的一些配置命令