HDU 4747 Mex

4747

思路:

线段树

先求出mex(1,1), mex(1, 2) , mex(1,3),...,mex(1,n)(单调上升),先将这些mex放进线段树里求和

然后再求出next[i]表示下一次出现a[i] 的位置

然后从前往后不停的删数,对于一个数a[i],我们删掉他的影响是:l为mex大于a[i]的位置,r 为next[i],l 到 r-1 之间的 mex都变为 a[i]

然后这个线段树只需要维护区间最大值(方便查找第一个大于a[i]的位置)和区间和就可以了

代码:

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pii pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//headconst int N = 2e5 + 5;
int a[N], nxt[N], mx[N<<2], lazy[N<<2], mex[N];
LL sum[N<<2];
map<int, int>mp;
void push_up(int rt) {sum[rt] = sum[rt<<1] + sum[rt<<1|1];mx[rt] = max(mx[rt<<1], mx[rt<<1|1]);
}
void push_down(int rt, int len) {sum[rt<<1] = 1LL * lazy[rt] * (len - (len >> 1));mx[rt<<1] = lazy[rt];lazy[rt<<1] = lazy[rt];sum[rt<<1|1] = 1LL * lazy[rt] * (len >> 1);mx[rt<<1|1] = lazy[rt];lazy[rt<<1|1] = lazy[rt];lazy[rt] = 0;
}
void build(int rt, int l, int r) {if(l == r) {mx[rt] = sum[rt] = mex[l];return ;}int m = (l+r) >> 1;build(ls);build(rs);push_up(rt);
}
void update(int x, int L, int R, int rt, int l, int r) {if(L <= l && r <= R) {mx[rt] = x;sum[rt] = 1LL * (r-l+1) * x;lazy[rt] = x;return ;}if(lazy[rt]) push_down(rt, r-l+1);int m = (l+r) >> 1;if(L <= m) update(x, L, R, ls);if(R > m) update(x, L, R, rs);push_up(rt);
}
LL query(int L, int R, int rt, int l, int r) {if(L <= l && r <= R) return sum[rt];if(lazy[rt]) push_down(rt, r-l+1);int m = (l+r) >> 1;LL ans = 0;if(L <= m) ans += query(L, R, ls);if(R > m) ans += query(L, R, rs);push_up(rt);return ans;
}
int Find(int x, int rt, int l, int r) {if(l == r) return l;int m = (l+r) >> 1;if(lazy[rt]) push_down(rt, r-l+1);if(mx[rt<<1] > x) return Find(x, ls);else return Find(x, rs);
}
int main() {int n;while(~scanf("%d", &n) && n) {mem(lazy, 0);build(1, 1, n);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);mp.clear();int tmp = 0;for (int i = 1; i <= n; i++) {mp[a[i]]++;while(mp.find(tmp) != mp.end()) tmp++;mex[i] = tmp;}build(1, 1, n);mp.clear();for (int i = n; i >= 1; i--) {if(mp.find(a[i]) == mp.end()) nxt[i] = n+1;else nxt[i] = mp[a[i]];mp[a[i]] = i;}LL ans = 0;for (int i = 1; i <= n; i++) {ans += query(1, n, 1, 1, n);if(mx[1] <= a[i]) continue;int l = Find(a[i], 1, 1, n);int r = nxt[i];if(l < r) update(a[i], l, r-1, 1, 1, n);}printf("%lld\n", ans);}return 0;
}

 

转载于:https://www.cnblogs.com/widsom/p/9118494.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Teams数据统计 - 通话记录

上篇文章介绍了如何获取用户的在线状态&#xff0c;这篇文章我们记录介绍如何统计用户通话记录。 首先&#xff0c;Teams为了安全&#xff0c;它要求 app 要有 CallRecords.Read.All 权限。然后就可以通过这个api来获取 call record。 GET /communications/callRecords/{id}这…

linux下mysql的数据库简单备份脚本

应用于整个库的备份。 #!/bin/bash PATH$PATH:/usr/local/mysql/bin:/usr/local/mysql/sbin # 数据库名称 databases(myname) # 备份目录 basepath/home/databak/ cd $basepath if [ ! -d "$basepath" ]; thenmkdir -p "$basepath" fi#遍历数据库名称 for …

解决JS浮点数(小数)计算加减乘除的BUG

2019独角兽企业重金招聘Python工程师标准>>> //浮点数减法运算function FloatSub(arg1,arg2){var r1,r2,m,n;try{r1arg1.toString().split(".")[1].length}catch(e){r10}try{r2arg2.toString().split(".")[1].length}catch(e){r20}mMath.pow(10…

Teams数据统计 - 聊天消息

前两篇文章介绍了如何对用户的在线状态和通话记录进行数据统计。这篇文章我们来看看如何统计用户的聊天消息。 在介绍具体 api 如何调用前&#xff0c;我们可以先看一下 Teams 里对于 Message 的层级结构&#xff0c;在 Teams 里&#xff0c;message有两种&#xff0c;一种是 …

vis.js

1、官网&#xff1a;http://visjs.org/docs/network/ 2、示例&#xff1a; <!doctype html>  <html>     <head>     <title>vis.js</title>     <script type"text/javascript" src"vis.js"></scri…

暑期实习面试——艾锝科技,Python实习生

远程笔试过&#xff0c;拒绝现场面转载于:https://www.cnblogs.com/qinziang/p/9123339.html

Teams App 如何使用设备的能力

我们以前讲到过&#xff0c;Teams有很多中可以扩展的方面&#xff0c;其中有一种是Tab&#xff0c;开发者可以开发一个web page/app&#xff0c;然后以tab的方式嵌入到teams里面。 除了基本的功能&#xff0c;这种tab也可以使用teams客户端设备所带的一些能力&#xff0c;比如…

实验室3

实验3.1 1 #include<stdio.h>2 int main()3 { long int sum,i;4 sum0;5 for(i22;i<1003;i20){6 sumsumi;7 }8 printf("sum%ld",sum);9 return 0; 10 } 11 1 #include<stdio.h>2 int main()3 { 4 long int…

写出整洁的高效的js代码

Variables:变量 使用有意义的可发音的变量名 Bad: var yyyymmdstr moment().format(YYYY/MM/DD);Good: var yearMonthDay moment().format(YYYY/MM/DD);使用可搜索的命名 在开发过程中&#xff0c;我们阅读代码的时间会远远超过编写代码的时间&#xff0c;因此保证代码的可读…

Teams App自定义

当我们开发的 app 被企业安装后&#xff0c;有些企业挺希望能做一些自定义&#xff0c;如果把app的图标改的更加符合企业风格一点&#xff0c;或者把app的名字改成让本企业员工更容易理解一些&#xff0c;或者把app界面的主题色改成个企业风格更加搭配一些&#xff0c;或者对于…

实验四:xl命令的常见子命令以及操作

实验名称&#xff1a; xl命令的常见子命令以及操作 实验环境&#xff1a; 这里我们需要正常安装一台虚拟机&#xff0c;如下图&#xff1a; 我们这里以一台busybox为例&#xff0c;来进行这些简单的常见的操作&#xff1b; 实验要求&#xff1a; 这里我们准备了5个常见操作&…

Teams App 扫描二维码

上篇文章我们讲了如何在app的manifest里设置设备的权限&#xff0c;这篇文章我们来实际操作开发一个可以扫描二维码的teams app。 首先&#xff0c;我们先到app studio里&#xff0c;创建一个teams app&#xff0c;然后创建tab&#xff0c;重要的一点是&#xff0c;我们确保ma…

关于我的知识星球服务

2019独角兽企业重金招聘Python工程师标准>>> 今天刚开通了我的知识星球-攻城师在路上&#xff0c;欢迎大家加入&#xff0c;目前前50名按最低费用收费50元一年&#xff0c;后面会根据人数情况调整。 希望通过这么一个圈子&#xff0c;让大家信息资源共享&#xff0c…

mysql8用户管理

查看当前登录用户&#xff1a; 创建用户&#xff1a; create user 用户名主机地址 identified with mysql_native_password by 密码; 修改密码&#xff1a; alter user 用户名主机地址 identified with mysql_native_password by 新密码; 原因是&#xff1a;在mysql 5.7.9版本以…

Teams App设备的地理位置能力

我们上一篇文章讲了如何在Teams app里扫描二维码&#xff0c;这篇文章我们来看一下如何获取当前设备的地理位置&#xff0c;并且在地图上显示地理位置。 首先&#xff0c;我们先到app studio里&#xff0c;创建一个teams app&#xff0c;然后创建tab&#xff0c;并且确保我们勾…

第4章 变量、作用域和内存问题

JavaScript高级程序设计第四章知识点梳理 1、基本类型值和引用类型值 基本类型值包括&#xff1a;Boolean、String、undefined、Number、Null 引用类型值&#xff1a;Object 注意&#xff1a;ECMAScript中所有函数的参数都是按值传递的。 2、延长作用域链 当执行流进入下列任何…

Teams App如何选择用户

当我们在开发app的时候&#xff0c;很多时候需要选择一个用户&#xff0c;比如我们开发一个审批的app&#xff0c;就要选择审批人&#xff0c;所以这个app就需要实现选择人的界面&#xff0c;而且需要获取完整的用户列表&#xff0c;但是要获取完整的用户列表又需要app拥有较高…

Python终端如何输出彩色字体

Python终端如何输出彩色字体 Python终端如何输出彩色字体 实现过程&#xff1a;终端的字符颜色是用转义序列控制的&#xff0c;是文本模式下的系统显示功能&#xff0c;和具体的语言无关。转义序列是以ESC开头,即用\033来完成&#xff08;ESC的ASCII码用十进制表示是27&#xf…

ID4收藏

IdentityServer4.Admin https://github.com/skoruba/IdentityServer4.Admin转载于:https://www.cnblogs.com/superstar/p/10757886.html