悬关,求调
  • 板块灌水区
  • 楼主C137_Rain
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/8 11:49
  • 上次更新2024/8/8 12:59:31
查看原帖
悬关,求调
748918
C137_Rain楼主2024/8/8 11:49

气死我了弄了一个上午, 主要是add函数有问题,但是不知道怎么解决

题目

#include<bits/stdc++.h>

using namespace std;

const int N=100005;

int n,m,k,x;
int kk[50];
int ans;
char op;
int l1,r1;

struct node{
	int l;
	int r;
	int sum;
}t[N*4]; 

void build(int i,int l,int r){
	t[i].l = l;
	t[i].r = r;
	t[i].sum = 1;
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
}

void add(int i,int x,int l,int r){
//	cout << "t[i].l:" << t[i].l << "\n";
//	cout << "t[i].r:" << t[i].r << "\n";
	if(t[i].l>=l&&t[i].r<=r){
		kk[t[i].sum]--; // 原来的蛋糕数种类减一
		t[i].sum = x;
		kk[t[i].sum]++; // 新的蛋糕数种类加一
//		cout << "a!!!\n";
		return ;
	}
	if(t[i*2].r>=l) add(i*2,x,l,r);
	if(t[i*2+1].l<=r) add(i*2+1,x,l,r);
}

int find(int i,int l,int r){
	int cnt=0;
	for(int i=1;i<=k;i++){
		if(kk[i]>0) cnt++;
	}
	return cnt;
}

int main(){
	
	cin >> n >> m >> k;
	build(1,1,n);
	kk[1] = n;
	for(int i=1;i<=m;i++){
		cin >> op >> l1 >> r1;
		if(op=='C'){
			cin >> x;
			add(1,x,l1,r1);
//			for(int j=1;j<=k;j++){
//				cout << "kk:" << kk[j] << " ";
//			}
//			cout << "\n";
		}else if(op=='P'){
			ans = find(1,l1,r1);
			cout << ans << "\n";
		}
	}
	
	return 0;
}
2024/8/8 11:49
加载中...