Codeforces 940F Machine Learning (带修改莫队)

题目链接  Codeforces Round #466 (Div. 2) Problem F

题意  给定一列数和若干个询问,每一次询问要求集合$\left\{c_{0}, c_{1}, c_{2}, c_{3}, ...,c_{10^{9}}\right\}$的$mex$

    同时伴有单点修改的操作。

 

根据题目询问的这个集合的性质可以知道答案不会超过$\sqrt{n}$,那么每次询问的时候直接暴力找就可以了。

剩下的都是可修改莫队的基本操作。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)

const int N = 1e5 + 10;

int c[N], f[N << 1], vis[N], ans[N];
int a[N], b[N], d[N << 1];
int n, m, bs, et;
int cnt = 0, tot = 0;
int op, x, y;
int l, r;
int net, ret;


struct node{
	int l, r, lb, rb, id, x;
	friend bool operator < (const node &a, const node &b){
		if (a.lb != b.lb) return a.lb < b.lb;
		if (a.rb != b.rb) return a.rb < b.rb;
		return a.x < b.x;
	}
} q[N];

struct upd{
	int pos, x, y;
} e[N];

void update(int x){
	if (vis[x]){
		--c[f[a[x]]];
		--f[a[x]];
		++c[f[a[x]]];
	}

	else{
		--c[f[a[x]]];
		++f[a[x]];
		++c[f[a[x]]];
	}

	vis[x] ^= 1;
}

void change(int pos, int x){
	if (vis[pos]){
		update(pos);
		a[pos] = x;
		update(pos);
	}

	else a[pos] = x;
}
		

int main(){

	scanf("%d%d", &n, &m);
	bs = pow(n, 2. / 3.);
	bs = max(bs, 1);
	rep(i, 1, n) scanf("%d", a + i), d[++et] = a[i];

	
	rep(i, 1, m){
		scanf("%d%d%d", &op, &x, &y);
		if (op == 1){
			++cnt;
			q[cnt].l = x;
			q[cnt].r = y;
			q[cnt].lb = (x - 1) / bs + 1;
			q[cnt].rb = (y - 1) / bs + 1;
			q[cnt].id = cnt;
			q[cnt].x  = tot;
		}

		else{
			++tot;
			e[tot].pos = x;
			e[tot].y   = y;
			d[++et] = y;
		}
	}

	sort(d + 1, d + et + 1);
	net = unique(d + 1, d + et + 1) - d - 1;
	rep(i, 1, n) a[i] = lower_bound(d + 1, d + net + 1, a[i]) - d;
	rep(i, 1, tot) e[i].y = lower_bound(d + 1, d + net + 1, e[i].y) - d;


	rep(i, 1, n) b[i] = a[i];

	rep(i, 1, tot){
		e[i].x = b[e[i].pos];
		b[e[i].pos] = e[i].y;
	}

	sort(q + 1, q + cnt + 1);

	l = 1, r = 0, x = 0;


	rep(i, 1, cnt){
		while (x < q[i].x){
			++x;
			change(e[x].pos, e[x].y);
		}

		while (x > q[i].x){
			change(e[x].pos, e[x].x);
			--x;
		}

		while (r < q[i].r) update(++r);
		while (r > q[i].r) update(r--);
		while (l > q[i].l) update(--l);
		while (l < q[i].l) update(l++);


		rep(j, 1, 1e5) if (!c[j]){ ret = j; break;}

		ans[q[i].id] = ret;
	}

	rep(i, 1, cnt) printf("%d\n", ans[i]);
	return 0;
}

  

转载于:https://www.cnblogs.com/cxhscst2/p/8484646.html

  • 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、付费专栏及课程。

余额充值