D.
什么叫做菜得真实???
线段树常数大了点,然后被卡…我不就是用了一个struct嘛…怎么了…出题人个憨憨…
node query(int k,int l,int r)
{
if (l==r)
{
node u;
u.x=minn[k]; u.pos=l;
return u;
}
int mid=l+r>>1;
node u,v;
u=query(k<<1,l,mid);
v=query(k<<1|1,mid+1,r);
if (u.x<=v.x) return u;
else return v;
}
本来想用以上代码寻找区间最小值的位置的,我怕是个憨憨吧。然后struct返回太慢了555…
int query(int k,int l,int r)
{
if (l==r) return l;
int mid=l+r>>1;
int u,v;
if (minn[k<<1]<=minn[k<<1|1]) return query(k<<1,l,mid);
else return query(k<<1|1,mid+1,r);
}
直接这样不就好了嘛…
哎,然后看了一下排名,从rk400变成rk1200。
打个div3都能变成rk1200的除了我还有谁…
#include <bits/stdc++.h>
using namespace std;
const int N=4e5+5;
int n,x;
int a[N],sum[N];
int minn[N<<2];
void change(int k,int l,int r,int pos)
{
if (l==pos && pos==r)
{
minn[k]++;
return;
}
int mid=l+r>>1;
if (pos<=mid) change(k<<1,l,mid,pos);
else change(k<<1|1,mid+1,r,pos);
minn[k]=min(minn[k<<1],minn[k<<1|1]);
}
int query(int k,int l,int r)
{
if (l==r) return l;
int mid=l+r>>1;
int u,v;
if (minn[k<<1]<=minn[k<<1|1]) return query(k<<1,l,mid);
else return query(k<<1|1,mid+1,r);
}
int main(){
scanf("%d%d",&n,&x);
for (register int i=1; i<=n; ++i) scanf("%d",&a[i]);
int maxn=0;
for (register int i=1; i<=n; ++i)
{
change(1,0,x-1,a[i]%x);
int mul=minn[1];
int pos;
if (mul*x<i) pos=query(1,0,x-1);
else pos=0;
int now=mul*x+pos;
printf("%d\n",now);
}
return 0;
}