Codeforces 라운드 # 615 (사업부. 3)

디.
실제 음식은 너무 무엇입니까? ? ?
세그먼트 트리 상수 큰 포인트는 다음 붙어 ... 나는 질문의 구조체 음 ... 어떻게 ... 밖으로 사람 한한을 사용하는 것입니다하지 않습니다 ...
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;
}
위의 코드와 간격의 최소 값의 위치를 ​​찾을 싶었다 나는 한한입니다 두려워. 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