POJ 2528 Mayor's posters(线段树)

题目大意:

每次往墙上li - ri的范围涂色,每次涂得颜色不一样,后涂的会覆盖前面的,求最终墙上有几种颜色

思路:

将所有端点离散化建立一课线段树,树上每个节点代表这个节点覆盖的范围以及是否被涂色,逆序将所有序列覆盖线段树上的节点,若有节点是空的,则代表最终有这个颜色,标记覆盖后的节点,若没有可以覆盖的节点,则此颜色最终不会出现

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

#define Clr(x) memset(x,0,sizeof(x))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define INF 0x33333333
#define LP(x,y) for(int i = x; i < y; i++)
#define LP2(x,y) for(int j = x; j >= y; j--) 

using namespace std;
typedef long long LL;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxn = 100000;
int t,n,ans;
struct node{
	int l,r;
	bool covered;
}p[maxn<<1];
bool lazy[maxn<<1];
int l[maxn],r[maxn];
vector<int> v;
void pushup(int rt)
{
	p[rt].l = p[rt<<1].l;
	p[rt].r = p[rt<<1|1].r;
	p[rt].covered = p[rt<<1].covered && p[rt<<1|1].covered;
}
void pushdown(int rt) 
{
	if(lazy[rt])
	{
		lazy[rt<<1] = true;
		lazy[rt<<1|1] = true;
		p[rt<<1].covered = true;
		p[rt<<1|1].covered = true;
	}
}
void build(int l,int r,int rt)
{
	if(l == r)
	{
		p[rt].l = v[l-1];
		p[rt].r = v[l-1];
		p[rt].covered = false;
		return;
	}
	int m = (l + r) >> 1;
	build(lson);
	build(rson);
	pushup(rt);
}
int post(int L,int R,int rt)
{
	if(p[rt].l >= L && p[rt].r <= R)
	{
		if(p[rt].covered) return 0;		//已被覆盖 
		else							//可覆盖节点 
		{
			p[rt].covered = true;
			lazy[rt] = true;
			return 1;
		}		
	}
	pushdown(rt);
	int res = 0;
	if(L <= p[rt<<1].r && !p[rt<<1].covered) res = max(res,post(L,R,rt<<1));
	if(R >= p[rt<<1|1].l && !p[rt<<1|1].covered) res = max(res,post(L,R,rt<<1|1));
	pushup(rt);
	return res;
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		v.clear();
		Clr(lazy);
		Clr(l);
		Clr(r);
		scanf("%d",&n);
		LP(0,n)
		{
			scanf("%d%d",&l[i],&r[i]);
			v.push_back(l[i]);
			v.push_back(r[i]);
		}
		sort(v.begin(),v.end());
		int num = unique(v.begin(),v.end()) - v.begin();	//所有端点数量 
		build(1,num,1);					//建树 
		int ans = 0;
		LP2(n-1,0) ans += post(l[j],r[j],1);
			
		printf("%d\n",ans);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值