为什么不能用桶数组来标记价格
  • 板块P2073 送花
  • 楼主maichong
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/17 15:02
  • 上次更新2024/7/17 15:44:38
查看原帖
为什么不能用桶数组来标记价格
955369
maichong楼主2024/7/17 15:02

“如果此时花束中已经有了相等价格的花,那么这朵花不能加入花束”

我看到这句话后就写了个桶数组来标记花的价格,添加花时就看有没有标记,删花时取消标记。结果交上去20分。然后我换了个方法,在添加花的函数内判断花的位置有没有值,结果就AC了。

所以说用桶数组标记花的价格为什么是错的?

20分代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int n,m,opt,book[MAXN];
struct node{
	int l,r,mn,mx;
	long long w,c;
}tree[MAXN*4];
void update(int u){
	tree[u].mn=min(tree[u*2].mn,tree[u*2+1].mn);
	tree[u].mx=max(tree[u*2].mx,tree[u*2+1].mx);
	tree[u].w=tree[u*2].w+tree[u*2+1].w;
	tree[u].c=tree[u*2].c+tree[u*2+1].c;
}
void build(int u,int l,int r){
	tree[u].mn=1e6+1;
	tree[u].l=l,tree[u].r=r;
	if(l==r)return;
	int mid=tree[u].l+tree[u].r>>1;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
}
void change(int u,int w,int c){
	if(tree[u].l==tree[u].r){
		tree[u].w=w;
		tree[u].c=c;
		tree[u].mn=tree[u].mx=c;
		return;
	}
	int mid=tree[u].l+tree[u].r>>1;
	if(c<=mid)change(u*2,w,c);
	else change(u*2+1,w,c);
	update(u);
}
void shan(int u,int k){
	if(tree[u].l==tree[u].r){
		tree[u].w=0;
		tree[u].c=0;
		tree[u].mn=1e6+1;
		tree[u].mx=0;
		return;
	}
	int mid=tree[u].l+tree[u].r>>1;
	if(k<=mid)shan(u*2,k);
	else shan(u*2+1,k);
	update(u);
}
int main(){
	build(1,1,1e6);
	while(1){
		scanf("%d",&opt);
		if(opt==1){
			int w,c;
			scanf("%d%d",&w,&c);
			if(book[c])continue;//查标记
			book[c]=1;//添标记
			change(1,w,c);
		}else if(opt==2){
			if(!tree[1].mx)continue;
			shan(1,tree[1].mx);
			book[tree[1].mx]=0;//取消标记
		}else if(opt==3){
			if(tree[1].mn==1e6+1)continue;
			shan(1,tree[1].mn);
			book[tree[1].mn]=0;//取消标记
		}else{
			printf("%lld %lld",tree[1].w,tree[1].c);
			return 0;
		}
	}
	return 0;
}

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int n,m,opt;
struct node{
	int l,r,mn,mx;
	long long w,c;
}tree[MAXN*4];
void update(int u){
	tree[u].mn=min(tree[u*2].mn,tree[u*2+1].mn);
	tree[u].mx=max(tree[u*2].mx,tree[u*2+1].mx);
	tree[u].w=tree[u*2].w+tree[u*2+1].w;
	tree[u].c=tree[u*2].c+tree[u*2+1].c;
}
void build(int u,int l,int r){
	tree[u].mn=1e6+1;
	tree[u].l=l,tree[u].r=r;
	if(l==r)return;
	int mid=tree[u].l+tree[u].r>>1;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
}
void change(int u,int w,int c){
	if(tree[u].l==tree[u].r){
		if(tree[u].w>0)return;//花的位置没有值就直接返回
		tree[u].w=w;
		tree[u].c=c;
		tree[u].mn=tree[u].mx=c;
		return;
	}
	int mid=tree[u].l+tree[u].r>>1;
	if(c<=mid)change(u*2,w,c);
	else change(u*2+1,w,c);
	update(u);
}
void shan(int u,int k){
	if(tree[u].l==tree[u].r){
		tree[u].w=0;
		tree[u].c=0;
		tree[u].mn=1e6+1;
		tree[u].mx=0;
		return;
	}
	int mid=tree[u].l+tree[u].r>>1;
	if(k<=mid)shan(u*2,k);
	else shan(u*2+1,k);
	update(u);
}
int main(){
	build(1,1,1e6);
	while(1){
		scanf("%d",&opt);
		if(opt==1){
			int w,c;
			scanf("%d%d",&w,&c);
			change(1,w,c);
		}else if(opt==2){
			if(!tree[1].mx)continue;
			shan(1,tree[1].mx);
		}else if(opt==3){
			if(tree[1].mn==1e6+1)continue;
			shan(1,tree[1].mn);
		}else{
			printf("%lld %lld",tree[1].w,tree[1].c);
			return 0;
		}
	}
	return 0;
}
2024/7/17 15:02
加载中...