首页 > 其他分享 >abc347E Set Add Query

abc347E Set Add Query

时间:2024-10-08 21:44:01浏览次数:1  
标签:std Set int Add abc347E vector 集合 Query 时刻

有数组A[N],初始时元素都为0,另外还有初始为空的集合S。依次处理以下Q组查询:给出整数x[i],如果S包含x[i],则从S中移除x[i],否则将x[i]加入S,记此时S的大小为|S|,把|S|加到集合中的每个元素i对应的A[i]中。求最终A[i]是多少。
1<=N,Q<=2E5; 1<=x[i]<=N

分析:记录每个时刻集合S的大小,设元素u在t1时刻加入集合,在t2时刻移出集合,那么[t1,t2)区间各个时刻集合的大小都要加到u对应的答案中,因此用前缀和维护集合大小。

#include <bits/stdc++.h>
using i64 = long long;

void solve() {
	int N, Q;
	std::cin >> N >> Q;
	std::vector<i64> A(Q + 1);
	for (int i = 1; i <= Q; i++) {
		std::cin >> A[i];
	}

	std::set<i64> st;
	std::vector<i64> cnt(Q + 1);
	for (int i = 1; i <= Q; i++) {
		if (st.count(A[i])) {
			st.erase(A[i]);
		} else {
			st.insert(A[i]);
		}
		cnt[i] = st.size();
	}
	std::partial_sum(cnt.begin(), cnt.end(), cnt.begin());

	auto sum = [&](int l, int r) {
		return l <= r ? cnt[r] - cnt[l - 1] : 0;
	};

	std::set<int> st1;
	std::vector<int> lst(Q + 1);
	std::vector<i64> ans(Q + 1);
	for (int i = 1; i <= Q; i++) {
		if (st1.count(A[i])) {
			ans[A[i]] += sum(lst[A[i]], i - 1);
			st1.erase(A[i]);
		} else {
			st1.insert(A[i]);
			lst[A[i]] = i;
		}
	}

	for (auto i : st1) {
		ans[i] += sum(lst[i], Q);
	}

	for (int i = 1; i <= N; i++) {
		std::cout << ans[i] << " \n"[i == N];
	}
}

int main() {
	std::cin.tie(0)->sync_with_stdio(0);
	std::cout << std::fixed << std::setprecision(10);
	int t = 1;
	while (t--) solve();
	return 0;
}

标签:std,Set,int,Add,abc347E,vector,集合,Query,时刻
From: https://www.cnblogs.com/chenfy27/p/18453126

相关文章

  • 练习题 - Scrapy爬虫框架 Settings 项目配置
    在使用Scrapy构建网络爬虫时,Settings框架配置是至关重要的部分。Settings是Scrapy框架的配置核心,它决定了爬虫的行为、请求的频率、用户代理的使用、数据存储等一系列关键功能。掌握Scrapy的配置设置,能够让你的爬虫更加高效、稳定和智能。通过合理配置,可以更好地模......
  • STL-set
    STLset头文件set主要包括set和multiset两个容器,分别是“有序集合”和“有序多重集合”即前者的元素不能重复,而后者可以包含若干个相等的元素set和multiset的内部实现是一棵红黑树,它们支持的函数基本相同include声明#include<set>函数声明set<int>s;structrec{…};......
  • jQuery 放大镜效果
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>放大镜效果</title><styletype="text/css">*{margin:0;padding:0;}.small{margin-left:40px;margin-top:50px;width:150px;height:......
  • ​解密 Go runtime.SetFinalizer 的使用
    解密Goruntime.SetFinalizer的使用原创 GoOfficialBlog GoOfficialBlog  2024年10月05日18:45 中国香港 听全文如果我们想在对象GC之前释放一些资源,可以使用returns.SetFinalizer。这就像在函数返回前执行 defer 来释放资源一样。例如:1:使用runtime.......
  • ES6中扩展运算符...与Set结合使用
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • [论文阅读报告] All pairs shortest paths using bridging sets and rectangular matr
    本篇文章介绍整数边权下\((\min,+)\)矩阵乘、APSP等问题的一些做法。若每个元素的权值在\([-M,M]\cap\mathbbZ\)中,\(n\timesn^r\)和\(n^r\timesn\)的\((\min,+)\)矩阵乘可做到\(\tildeO(Mn^{\omega(r)})\);有向图APSP可做到\(\tildeO(n^{2+\mu(t)})\),......
  • netsh winsock reset catalog 和 netsh int ip reset reset.log 是两个常用的 Windows
    netshwinsockresetcatalog和netshintipresetreset.log是两个常用的Windows命令,用于网络故障排除和恢复网络设置。下面是对这两个命令的详细解释:1. netshwinsockresetcatalog功能:重置Winsock目录,以修复与网络相关的问题。Winsock的作用:Winsock(WindowsSocke......
  • [lnsyoj2378/luoguAT_arc107_d]Number of Multisets
    题意给出两个正整数\(N,K\),求有多少有理数集满足以下所有条件集合有且只有\(N\)个元素,并且元素和为\(K\);每个元素须可表示为\( \frac{1}{2^{i}}\) $(i\inN)$.sol考虑dp,容易想到记\(f_{i,j}\)表示选\(i\)个数恰好和为\(j\)考虑到会出现诸如\(\dfrac{1}......
  • Centos7 停止维护之后 升级gcc||找不到devtoolset-8-gcc* 问题解决方案
    为了去小米澎湃互联组,感觉必须得拿下linux网络编程,今天第一步这个centos就给我拉了坨大的问题实质SCL源没换,相信你也在别的教程上看到要安装centos-release-scl吧?有坑!安装完成后在/etc/yum.repos.d目录下会出现CentOS-SCLo-scl.repo和CentOS-SCLo-scl-rh.repo两个文件,......
  • const和readonly修饰的成员,静态构造函数以及对于变量的访问{get;set}
    第一,const修饰的数据类型定义:按照publicconstinttest=20;的格式进行声明,const修饰的数据类型叫做常量。注意:1访问时只能通过类名加变量名访问。      2必须在声明的时候就赋值。      3常量是不可修改的值。代码如下:usingSystem.Collection......