动态区间第k小 分块 O(nlogn*sqrt(nlogn))
来源:互联网 发布:vip视频解析源码heml 编辑:程序博客网 时间:2024/05/16 17:43
代码:
#include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>#include<cmath>using namespace std;int n,q;struct node{ int x,y;}a[100005];int b[100008];int L[8005],R[8005];int id[1000008];int k;int cmp(node xx,node yy){ return xx.x<yy.x; }void pa(int x){ //cout<<x<<endl; sort(a+L[x],a+R[x]+1,cmp); }void add(int l,int r,int v){ int k=id[l]; for(int i=L[k];i<=R[k];i++) if(a[i].y<=r&&a[i].y>=l) a[i].x+=v; pa(k);}int suan(int l,int r,int x){ int ret=0; int k=id[l]; for(int i=L[k];i<=R[k];i++) if(a[i].y<=r&&a[i].y>=l&&a[i].x<=x) ret++; return ret; }int qu(int k,int x){ int ll=L[k],rr=R[k]; // cout<<a[714].x<<endl; while(ll<rr) { // cout<<ll<<" "<<rr<<endl; int mid=(ll+rr+1)>>1; if(a[mid].x+b[k]<=x) ll=mid; else rr=mid-1; } if(a[ll].x+b[k]>x) ll--; return ll-L[k]+1;}int C(int l,int r,int x){ int ret=0; //cout<<id[l]<<" "<<id[r]<<endl; if(id[l]==id[r]) return suan(l,r,x); ret+=suan(l,R[id[l]],x); ret+=suan(L[id[r]],r,x);// cout<<ret<<endl; for(int i=id[l]+1;i<id[r];i++) ret+=qu(i,x); return ret;}int main(){ int aa,bb,cc,dd; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i].x); a[i].y=i; } scanf("%d",&q); int m=sqrt(n) ; k=n/m; if(k*m<n) k++; for(int i=1;i<=n;i++) id[i]=(i-1)/m+1; for(int i=1;i<=k;i++) { L[i]=m*(i-1)+1; R[i]=min(n,m*i); pa(i); } for(int i=1;i<=q;i++) { scanf("%d%d%d%d",&dd,&aa,&bb,&cc); if(dd==1) { //cout<<"Sb"<<endl; if(id[aa]==id[bb]) add(aa,bb,cc); else { add(aa,R[id[aa]],cc); add(L[id[bb]],bb,cc); for(int j=id[aa]+1;j<id[bb];j++) b[j]+=cc; } } else { int ll=-5000000,rr=5000000; while(ll<rr) { int mid=(ll+rr)>>1;//cout<<ll<<" "<<rr<<" "<<mid<<endl; if(C(aa,bb,mid)>=cc) rr=mid; else ll=mid+1; } printf("%d\n",ll); } }}
0 0
- 动态区间第k小 分块 O(nlogn*sqrt(nlogn))
- 分块 区间第k小
- 区间第k小 分块
- 希尔排序(O(nlogn)-O(n2))
- 最长递增子序列O(NlogN)
- O(nlogn)最长递增子序列
- 最长递增子序列O(Nlogn)
- 关于O(nlogn)复杂度的体验
- 快速排序(分治法O(nlogn))
- O(nlogn)实现LCS与LIS
- LIS的O(nlogn)算法(二分)
- 动态区间第K小数 分块/树套树
- 动态规划--最长上升子序列问题(LIS) O(n^2) ,O(nlogn)
- 最长递增子序列的求解(O(n*n),O(nlogn))——动态规划
- 动态规划---最长上升子序列问题(O(nlogn),O(n^2))
- 第2周项目3-体验复杂度(1) O(n 2 )和O(nlogn)
- 求数组的第K小数,O(nlogn) 和 O(N)的算法
- dijkstra算法O(n²) 堆优化O(nlogn)
- Python基础(一)(基于Python2.7)
- WPF中设置TextBox为空,背景为文字提示
- 关于通过注解反射实现findViewById(int x);的原理
- 【mybatis】mybatis产生过程和执行流程
- uuid in python
- 动态区间第k小 分块 O(nlogn*sqrt(nlogn))
- Xutils工具的使用
- openfire的启动流程
- dwa_planner解读
- 杨辉三角队列方式
- 深度学习相关资料
- ACM的那些故事
- 第十六周实践项目-阅读程序(2)
- HDOJ_Humble Numbers