【基数排序】bzoj1901 Zju2112 Dynamic Rankings
2014-11-20 15:28
281 查看
论NOIP级别的n²算法…… 跟分块比起来,理论上十万的数据只慢4、5倍左右的样子……
#include<cstdio> #include<algorithm> using namespace std; struct Point{int v,p;}t[20001]; bool operator < (const Point &a,const Point &b){return a.v<b.v;} struct ASK{char op[1];int x,y,k;}Ask[10001]; int n,m,a[20001],en,ma[20001],en2,b[20001]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) { scanf("%d",&t[i].v); t[i].p=i; } en=n; for(int i=1;i<=m;++i) { scanf("%s%d%d",Ask[i].op,&Ask[i].x,&Ask[i].y); if(Ask[i].op[0]=='Q') scanf("%d",&Ask[i].k); else { t[++en].v=Ask[i].y; t[en].p=en; } } sort(t+1,t+en+1); ma[a[t[1].p]=++en2]=t[1].v; for(int i=1;i<=en;++i) { if(t[i].v!=t[i-1].v) en2++; ma[a[t[i].p]=en2]=t[i].v; } en=n; for(int i=1;i<=m;++i) { if(Ask[i].op[0]=='Q') { int cnt=0; for(int j=Ask[i].x;j<=Ask[i].y;++j) ++b[a[j]]; for(int j=1;;++j) { if(b[j]) cnt+=b[j]; if(cnt>=Ask[i].k) { printf("%d\n",ma[j]); for(int k=Ask[i].x;k<=Ask[i].y;k++) --b[a[k]]; goto OUT; } } } else a[Ask[i].x]=a[++en]; OUT:; } return 0; }
相关文章推荐
- bzoj1901 [ Zju2112 ] --树状数组套主席树
- bzoj1901 Zju2112 Dynamic Rankings(可修改主席树)
- bzoj1901: Zju2112 Dynamic Rankings
- bzoj1901: Zju2112 Dynamic Rankings
- bzoj1901(Zju2112 Dynamic Rankings)
- bzoj1901: Zju2112 Dynamic Rankings
- bzoj1901: Zju2112 Dynamic Rankings
- BZOJ1901: Zju2112 Dynamic Rankings
- bzoj1901[Zju2112] Dynamic Rankings / hdu5412 CRB and Queries 整体二分基础摸板
- bzoj1901:Zju2112 Dynamic Rankings
- bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)
- BZOJ1901 Zju2112 Dynamic Rankings
- BZOJ1901:Zju2112 Dynamic Rankings——题解
- bzoj1901 Zju2112 Dynamic Rankings
- Bzoj1901 Zju2112 Dynamic Rankings
- 基数排序 radixsort(LSD)
- 基数排序
- 希尔排序,基数排序,归并排序
- 程序员面试题之基数排序
- 基数排序