Codeforces Round #615 (Div. 3)

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;	
}
发布了64 篇原创文章 · 获赞 29 · 访问量 663

猜你喜欢

转载自blog.csdn.net/Dove_xyh/article/details/104073805