题解 CF1354D 【Multiset】
考试拿到题,一看,这不是权值线段树吗?
思路
使用线段树每个节点维护该区间内元素出现次数。
根据题目,对于加入、删除元素,我们可以单点修改(\(+1\)、\(-1\)),对于输出,我们可 随便 遍历找一个出现次数为 \(1\) 的元素即可。
代码
具体解释见注释
#include<bits/stdc++.h>
#define re read()
using namespace std;
const int MAXN=1e6+10;
int n,q,A[MAXN];
struct SEGTREE{
	int sum;//sum 最大为10^6 无需long long(我第一次手残开了,然后爆了空间)
}tr[MAXN<<2];
int read(){//快读
	#define gt getchar()
	#define isdi(a) (a>='0'&&a<='9')
	int x=0,sgn=1;char ch=gt;
	for(;!isdi(ch);ch=gt)if(ch=='-')sgn=-1;
	for(;isdi(ch);ch=gt)x=(x<<1)+(x<<3)+(ch^48);
	return x*sgn;
}
void build(int k,int l,int r){ //建树
	if(l==r){
		tr[k].sum=A[l];
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid); build(k<<1|1,mid+1,r);
	tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
	return;
}
void add(int k,int l,int r,int num){//加入元素
	if(l==r){
		if(l==num)tr[k].sum++;
		return;
	}
	int mid=(l+r)>>1;
	if(num>mid)add(k<<1|1,mid+1,r,num);
	else add(k<<1,l,mid,num);
	tr[k].sum++;
	return;
}
void del(int k,int l,int r,int num){
//删除该区间内第num大的元素
	if(l==r){
		if(tr[k].sum)tr[k].sum--;
		return;
	}
	if(num>tr[k].sum)return;
	int mid=(l+r)>>1;
	if(num>tr[k<<1].sum)del(k<<1|1,mid+1,r,num-tr[k<<1].sum);
//如果num大于左子树元素出现的总次数,则去右子树删第(num-左子树元素出现总次数)大的数
	else if(num<=tr[k<<1].sum)del(k<<1,l,mid,num);
//否则去左子树删除第num大的数
	else return;
	tr[k].sum--;
//该区间内的次数减一
	return;
}
int find(int k,int l,int r){//递归查找
	if(l==r){
		if(tr[k].sum)return l;
		return 0;
	}
	int mid=(l+r)>>1;
	if(tr[k<<1].sum)return find(k<<1,l,mid);
	else return find(k<<1|1,mid+1,r);
	return 0;
//根据题目,随便找一个就行了,找不到就输出0
}
int main (){
	n=re;q=re;
	for(int i=1;i<=n;i++){
		int temp=re;
		A[temp]++;
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		int k=re;
		if(k<0)del(1,1,n,-k);
		else add(1,1,n,k);
	}
	printf("%d",find(1,1,n));
	return 0;
}
												
											题解 CF1354D 【Multiset】的更多相关文章
- ZOJ 3963 Heap Partition(multiset + stl自带二分 + 贪心)题解
		
题意:给你n个数字s1~sn,要你把它们组成一棵棵二叉树,对这棵二叉树来说,所有节点来自S,并且父节点si<=子节点sj,并且i<j,问你树最少几棵二叉数.树 思路:贪心.我们往multi ...
 - SPOJ ADAFIELD Ada and Field(STL的使用:set,multiset,map的迭代器)题解
		
题意:n*m的方格,“0 x”表示x轴在x位置切一刀,“0 y”表示y轴在y位置切一刀,每次操作后输出当前面积最大矩形. 思路:用set分别储存x轴y轴分割的点,用multiset(可重复)储存x轴y ...
 - Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset (0/1-Trie树)
		
Vasiliy's Multiset 题目链接: http://codeforces.com/contest/706/problem/D Description Author has gone out ...
 - Codeforces Round #136 (Div. 1)C. Little Elephant and Shifts multiset
		
C. Little Elephant and Shifts Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/pro ...
 - Codeforces Round #311 (Div. 2) C. Arthur and Table Multiset
		
C. Arthur and Table Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/557/p ...
 - Codeforces Beta Round #6 (Div. 2 Only) E. Exposition multiset
		
E. Exposition Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/ ...
 - noip2007提高组题解
		
题外话:这一年的noip应该是最受大众关心的,以至于在百度上输入noip第三个关键字就是noip2007.主要是由于这篇文章:http://www.zhihu.com/question/2110727 ...
 - QTREE系列题解
		
打了快一星期的qtree终于打完了- - (其实还有两题改不出来弃疗了QAQ) orz神AK一星期前就虐完QTREE 避免忘记还是简单写下题解吧0 0 QTREE1 题意: 给出一颗带边权树 一个操作 ...
 - Codeforces Round #278 (Div. 1) B. Strip multiset维护DP
		
B. Strip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/487/problem/B De ...
 
随机推荐
- 人声提取工具Spleeter安装教程(linux)
			
在安装之前,要确保运行Spleeter的计算机系统是64位,Spleeter不支持32位的系统.如何查看? 因为在linux环境下安装spleeter相对要简单很多,这篇教程先以Ubuntu20.04 ...
 - 解决github打不开问题
			
2020.06.22 使用以下方式: 在https://github.com.ipaddress.com/找到: 在https://fastly.net.ipaddress.com/github.gl ...
 - 尚学堂 217 java中的字节码操作2
			
package com.bjsxt.test; @Author(name="gaoqi", year=2014) public class Emp { private int em ...
 - CentOS 7 Nacos 集群搭建
			
环境 CentOS 7.4 MySQL 5.7 nacos-server-1.1.2 本次安装的软件全部在 /home/javateam 目录下. MySQL 安装 首先下载 rpm 安装包,地址:h ...
 - 入门大数据---Kafka生产者详解
			
一.生产者发送消息的过程 首先介绍一下 Kafka 生产者发送消息的过程: Kafka 会将发送消息包装为 ProducerRecord 对象, ProducerRecord 对象包含了目标主题和要发 ...
 - 【转】HBase的MapReduce调用
			
参考: https://blog.csdn.net/u012848709/article/details/83744699 自己照着搭建了下,顺便把坑也踩了下,项目见云盘: 链接:https://pa ...
 - github知名企业开源项目索引
			
亚马逊:https://github.com/amzn 饿了么 https://github.com/ElemeFEhttp://lrd.ele.me/腾讯 https://github.com/Te ...
 - 基于jQuery的打字机函数
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - vue全家桶(2.5)
			
3.8.动态路由匹配和路由组件传参 3.8.1.动态路由匹配 动态路由意味着不固定,具有某种模式,我们希望通过某种匹配方式,把这种不固定的路由形势映射到同一个组件,例如:一个User组件,不同的ID表 ...
 - js事件入门(6)
			
7.事件冒泡机制 7.1.什么是事件冒泡 当一个元素接收到一个事件以后,会将事件传播给它的父级元素,它的负级元素会一层一层往上传播,直到最顶层window,这种事件传播机制叫作事件冒泡. <!D ...