您的位置:首页 > 其它

【基数排序】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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: