题意:一个长度为n的序列,然后求任意左右区间l,r中没有出现过的最小的数字的和。
题解:如果固定区间的左端点得到的所有区间的解是从左到右发现是一个递增序列,用线段树维护当前固定左端点的区间的解的和和最大值,然后更新下一个左端点a[i+1]的区间,那么a[i]就要删除,发现以a[i+1]为左端点的区间所有mex值要把之前第一个mex大于a[i]的位置到下一个a[i]的位置所有值设置为a[i]。
举个例子: 3 2 1 0 2 3 1
左端点是a[1] = 3 , mex: 0 0 0 4 4 4 4
左端点是a[2] = 2 , mex: 0 0 0 3 3 4 4

可以发现当左端点是a[2] = 2时,[2,3]的mex都是0< a[1] = 3,然后mex[4] = 4 > a[1] = 3的位置4到 a[6] = a[1] = 3的位置6的解都是a[1],所以这里直接区间更新。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define ll long long
using namespace std;
const int N = 200005;
int n, a[N], f[N], pre[N], maxx[N << 2], flag[N << 2];
ll sum[N << 2];
map<int, int> mp;void pushup(int k) {sum[k] = sum[k * 2] + sum[k * 2 + 1];maxx[k] = max(maxx[k * 2], maxx[k * 2 + 1]);
}void pushdown(int k, int left, int right) {if (flag[k] >= 0) {int mid = (left + right) / 2;flag[k * 2] = flag[k * 2 + 1] = flag[k];sum[k * 2] = (mid - left + 1) * flag[k];sum[k * 2 + 1] = (right - mid) * flag[k];maxx[k * 2] = maxx[k * 2 + 1] = flag[k];flag[k] = -1;}
}void build(int k, int left, int right) {flag[k] = -1;if (left == right) {sum[k] = maxx[k] = f[left];return;}int mid = (left + right) / 2;build(k * 2, left, mid);build(k * 2 + 1, mid + 1, right);pushup(k);
}void modify(int k, int left, int right, int l, int r, ll x) {if (l <= left && right <= r) {flag[k] = x;sum[k] = (right - left + 1) * x;maxx[k] = x;return;}pushdown(k, left, right);int mid = (left + right) / 2;if (r <= mid)modify(k * 2, left, mid, l, r, x);else if (l > mid)modify(k * 2 + 1, mid + 1, right, l, r, x);else {modify(k * 2, left, mid, l, mid, x);modify(k * 2 + 1, mid + 1, right, mid + 1, r, x);}pushup(k);
}int query(int k, int left, int right, int x) {if (left == right)return left;pushdown(k, left, right);int mid = (left + right) / 2;if (maxx[k * 2] > x)return query(k * 2, left, mid, x);return query(k * 2 + 1, mid + 1, right, x);
}int main() {while (scanf("%d", &n) == 1 && n) {mp.clear();int temp = 0;for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);mp[a[i]] = 1;while (mp.find(temp) != mp.end())temp++; f[i] = temp;}mp.clear();for (int i = n; i >= 1; i--) {if (mp.find(a[i]) == mp.end())pre[i] = n + 1;else pre[i] = mp[a[i]];mp[a[i]] = i;}build(1, 1, n);ll res = 0;for (int i = 1; i <= n; i++) {res += sum[1];if (maxx[1] > a[i]) {int l = query(1, 1, n, a[i]), r = pre[i] - 1;if (l <= r)modify(1, 1, n, l, r, a[i]);}modify(1, 1, n, i, i, 0);}printf("%lld\n", res);}return 0;
}

hdu 4747(区间更新)相关推荐

  1. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  2. HDU ACM 4031 Attack (树状数组--单点查询+区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=4031 用了树状数组的区间更新 单点查找(一般为单点更新 区间查找) 例如 区间(2,4)加1 则Updata(2 ...

  3. hdu 5692 Snacks(dfs序+线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...

  4. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  5. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  6. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  7. hdu 1698 Just a Hook(线段树区间更新·经典)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1698 数据:case,n,q,q行x,y,z.在长度为n的hook上进行q次区间更新,把它们的价值改变.最 ...

  8. hdu 1698(线段树区间更新)

    解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...

  9. hdu 3577(线段树区间更新)

     题意:输入一个t,表示有t组测试数据: 接下来一行,输入两个数,k,m,其中k表示这个辆车最多可以坐这么多人,m表示有m次询问能否上车: 每一次询问,输入两个数a,b,表示该乘客能否在a站台上车 ...

  10. HDU 1566 Count the Colors 树状树组 区间更新 单点求值

    #include<bits/stdc++.h> using namespace std; const int lim = 100010; int n,c[lim];// 记录差分变化 vo ...

最新文章

  1. pcb入门之原理图的绘制
  2. twsited快速基础
  3. JavaFX的响应式设计
  4. rem和css3的相关知识点
  5. linux-用户管理
  6. usr bin java快捷方式_/ usr / bin / sudo必须由uid 0拥有并设置setuid位
  7. oracle 切割字符串加引号_oracle存储过程中单引号及字符串拼接处理
  8. ECS服务器下挂载数据盘
  9. JSP javaweb餐厅点餐系统源码(点餐系统)jsp点餐系统网上订餐
  10. 朋友,谁会Symbian S40 Symbian S60 v3/v5 Android?
  11. 求任意多边形面积(凹多边形和凸多边形)
  12. JFrame显示透明图片与动态图片
  13. 计算机wps基础知识,计算机考试WPSOffice常见知识点
  14. win10 日文输入法的安装与使用
  15. python中快速验证输入的是否为回文
  16. 售前技能——自我定位
  17. Spring Data JPA + QueryDSL
  18. 10-22- “知人者智,自知者明”(小结)
  19. 手机流量充值 php代码,流量充值异步通知示例代码
  20. ubuntu 印象笔记

热门文章

  1. Mstar的Monitor方案OSD 菜单制作(二)————主体架构
  2. 百度有啊前端框架分析(自定义事件)
  3. qt 之 qml 类型 Binding
  4. Redis中key-value对value的数据类型
  5. XShell连接远程centos监控控制台(tomcat)输出信息
  6. kettle整合kafka
  7. 对lambert diffuse(兰伯特漫反射)模型的理解
  8. 招商银行笔试题之X游戏
  9. 【沃顿商学院学习笔记】商业基础——Financing:05 名义利率和实际利率 APR EAR
  10. ewebeditor漏洞利用总结