Edu7

Edu7

C:记录区间最值位置的线段树

给出[l,r],v,要求写出[l,r]中不等于v的数的位置,用线段树记录min和max的位置,判断一下.

int n,m,k,a[N];
struct node {
	int l,r,tmin,tmax;
	int maxi,mini;
} tr[4*N];

void pushup(int u) {
	tr[u].tmin = min(tr[u<<1].tmin,tr[u<<1|1].tmin);
	if(tr[u].tmin == tr[u<<1].tmin) {
		tr[u].mini = tr[u<<1].mini;
	} else {
		tr[u].mini = tr[u<<1|1].mini;
	}

	tr[u].tmax = max(tr[u<<1].tmax,tr[u<<1|1].tmax);
	if(tr[u].tmax == tr[u<<1].tmax) {
		tr[u].maxi = tr[u<<1].maxi;
	} else tr[u].maxi = tr[u<<1|1].maxi;
}

void build(int u,int l,int r) {
	tr[u].l = l,tr[u].r = r;
	if(l == r) {
		tr[u].tmax = a[l];
		tr[u].tmin = a[l];
		tr[u].maxi = l;
		tr[u].mini = l;
		return ;
	}
	int mid = (l + r) >> 1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}

int qmin(int u,int l,int r) {
	if(tr[u].r < l || tr[u].l > r)return INF;
	if(tr[u].l >= l && tr[u].r <= r)return tr[u].mini;
	int mid = (tr[u].l + tr[u].r) >> 1;
	int x = -1,y=-1;
	if(l <= mid) {
		x = qmin(u<<1,l,r);
	}
	if(r > mid) {
		y = qmin(u<<1|1,l,r);
	}
	if(x != -1 && y != -1){
		if(a[x] > a[y])return y;
		else return x;
	}
	else return max(x,y);
}

int qmax(int u,int l,int r) {
	if(tr[u].r < l || tr[u].l > r)return -1;
	if(tr[u].l >= l && tr[u].r <= r)return tr[u].maxi;
	int mid = (tr[u].l + tr[u].r) >> 1;
	int x=-1,y=-1;
	if(l <= mid) {
		x = qmax(u<<1,l,r);
	}
	if(r > mid) {
		y = qmax(u<<1|1,l,r);
	}
	if(x != -1 && y != -1) {
		if(a[x] > a[y])return x;
		else return y;
	} else return max(x,y);
}
void work() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	while(m--) {
		int l,r,v;
		scanf("%d%d%d",&l,&r,&v);
		int aa = qmax(1,l,r);
		int bb = qmin(1,l,r);
//		cout << "maxi : " << aa << " " << "mini:" << bb << endl; 
		if(a[aa] == v && a[bb] == v)printf("-1\n");
		else if(a[aa] != v)printf("%d\n",aa);
		else printf("%d\n",bb);
	}
}

D:数学构造题

可以发现对于两个数字i,相差n-i时答案为0,那么将奇数放在[1,n],[2,n-1]....位置,再把偶数放在[n+2,2n],[n+3,2n-1]...位置,剩余的n如果没放过,找个空位放进去.

void work() {
	scanf("%d",&n);
	int p=1;
	for(int i=1,j=n; i<j; i++,j--) {
		a[i] = a[j] = p;p += 2;
	}
	p = 2;
	for(int i=n+2,j=2*n; i<j; i++,j--) {
		a[i] = a[j] = p;p += 2;
	}
	for(int i=1; i<=2*n; i++) {
		if(a[i] == 0) a[i] = n;
	}
	for(int i=1; i<=2*n; i++) printf("%d ",a[i]);
}

posted @ 2021-07-02 15:54  LaiYiC  阅读(54)  评论(0)    收藏  举报