题意:

计算    其中mex即为博弈中出现的mex(未出现的最小非负整数)。

分析:

有两种方法,递推有点懵(以后再来补QAQ),就写了线段树

想法是每次求以i为起点的区间的mex值的和,最后累加即为答案。

可以先预处理出1为起点的区间的mex值,用它构造一棵线段树,要有求和和求最大值的操作。

构造好线段树之后,1为起点的区间的mex和已经得到了,就是sum[1]。

接下来求2为起点的,首先第一步要删掉a[1],这里把mex[1]置为0(区间求和不再受影响)。

删掉val=a[1]这个元素对后面的有什么影响呢?易知它不会对下一个出现val(下一个出现val的位置是next[1])之后的位置产生影

响,因为后面的区间已经包含val了(不少它这一个)

然后我们需要求得大于val的最大mex的位置pos,线段树单点查询最大值即可得到。

对于pos到next[1] - 1的元素,所有的mex值都要变成a[i](不难想),成段更新线段树即可。

这样就得到了2为起点的区间的mex和,sum[1]。

#include<bits/stdc++.h>using namespace std;const int maxn=2e5+10;typedef long long ll;struct node{ll mex,sum;bool lazy;
}tree[maxn<<2];ll a[maxn],tmp[maxn];void pushdown(int p,int l,int r){if(!tree[p].lazy) return;int mid=l+r>>1;tree[p<<1].sum=tree[p].mex*1ll*(mid-l+1);tree[p<<1|1].sum=tree[p].mex*1ll*(r-mid);tree[p<<1].mex=tree[p<<1|1].mex=tree[p].mex;tree[p<<1].lazy=tree[p<<1|1].lazy=1;tree[p].lazy=0;
}void pushup(int p){tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;tree[p].mex=max(tree[p<<1].mex,tree[p<<1|1].mex);
}void build(int p,int l,int r){tree[p].lazy=0;if(l==r){tree[p].sum=tree[p].mex=tmp[l];return;}int mid=l+r>>1;build(p<<1,l,mid);build(p<<1|1,mid+1,r);pushup(p);
}void update(int tl,int tr,ll val,int l,int r,int p){if(tl>r||tr<l) return;if(tl<=l&&r<=tr){tree[p].sum=(r-l+1)*1ll*val;tree[p].mex=val;tree[p].lazy=true;return;}pushdown(p,l,r);int mid=l+r>>1;update(tl,tr,val,l,mid,p<<1);update(tl,tr,val,mid+1,r,p<<1|1);pushup(p);
}int query(ll val,int l,int r,int p){if(l==r){return l;}pushdown(p,l,r);int mid=l+r>>1;if(val<tree[p<<1].mex)return query(val,l,mid,p<<1);else return query(val,mid+1,r,p<<1|1);}int head[maxn],nex[maxn];
bool vis[maxn];int main(){int n;while(scanf("%d",&n)&&n){memset(head,0x3f,sizeof head);memset(vis,0,sizeof vis);int k=0;for(int i=1;i<=n;i++){scanf("%lld",&a[i]);if(a[i]>n) a[i]=n+1;vis[a[i]]=1;for(int j=k;j<=n;j++){if(!vis[j]){tmp[i]=j;k=j;break;}}}for(int i=n;i>0;i--){nex[i]=head[a[i]];head[a[i]]=i;}build(1,1,n);ll ans=0;ans+=tree[1].sum;for(int i=1;i<=n;i++){update(i,i,0ll,1,n,1);if(tree[1].mex>a[i]){int pos=query(a[i],1,n,1);if(pos<nex[i]){update(pos,nex[i]-1,a[i],1,n,1);}}ans+=tree[1].sum;}printf("%lld\n",ans);}return 0;
}

HDU - 4747 Mex(线段树)相关推荐

  1. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

  2. HDU 2795 Billboard (线段树+贪心)

    HDU 2795 Billboard (线段树+贪心) 手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/articl ...

  3. HDU 4747 Mex【线段树上二分+扫描线】

    [题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...

  4. HDU 4747 Mex

    4747 思路: 线段树 先求出mex(1,1), mex(1, 2) , mex(1,3),...,mex(1,n)(单调上升),先将这些mex放进线段树里求和 然后再求出next[i]表示下一次出 ...

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

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

  6. hdu 3308 LCIS 线段树 + 区间合并

    传送门 文章目录 题意: 思路: 题意: 思路: 日常水一篇题解. 带修改的求区间连续的递增序列,我们考虑用线段树维护. 直接维护mlenmlenmlen是区间最长的递增序列,lslsls是从左端点开 ...

  7. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  8. YJJ's Salesman HDU - 6447(线段树 单点更新+DP思想)

    YJJ's Salesman 题目链接:HDU - 6447 题意:一个1e9*1e9的地图,要求由(0, 0) -> (1e9, 1e9):只能向下,向右, 向右下移动:地图中有n个点,有宝藏 ...

  9. HDU 4288 Coder [线段树]

    维护一个可以插入删除的有序序列,每次询问序列中位置mod5=3的数的和. CodeForces原题,因为时限给的太宽,数据太水,STL可以暴力过. 用线段树和平衡树都可以做这题,线段树需要先离散化,然 ...

最新文章

  1. WinForm 设置初始位置在屏幕右下角
  2. Unicode,UTF-32,UTF-16,UTF-8到底是啥关系?
  3. R语言使用caret包的findCorrelation函数批量删除相关性冗余特征、实现特征筛选(feature selection)、剔除高相关的变量
  4. [转载]给IT人员支招:如何跟业务部门谈需求分析?
  5. 海报素材模板|超好看的新年素材,你真的不来看一看吗?
  6. slab 着色如何最大限度地利用 Cache Lines 或 Cache Rows?
  7. ES5实现ES6的一些方法-call,bind,is,promise
  8. Netty高可靠性设计:优化建议
  9. matlab 最优化编程,Matlab最优化编程例子
  10. 程序员梗_那些程序员才懂的梗,看到第10张笑喷了,网友:太真实了
  11. 公司英文名称及部门大全
  12. Uptime-Kuma 一个轻量的开源监控工具
  13. JAVA城市道路智能停车管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  14. Xcode真机测试(无需开发者账号)
  15. [转]抽象基类与接口,共性与个性的选择!
  16. 大数据技术之Hadoop-入门
  17. java保存cookie在本地_Java保存Cookie
  18. vue学习笔记(一)---- vue指令(浪起来~~~哦耶 的案例)
  19. Linux服务器Anaconda版本安装JupyterLab
  20. 驾照考试记录--东方时尚版本 考试后总结

热门文章

  1. 2017广东工业大学程序设计竞赛决赛 Problem H: tmk买礼物(数论)
  2. Linux内部字段分离符环境变量IFS
  3. python-opencv图片合成视频
  4. libpqxx 库安装configure: error:Linking a call to libpq failed in C++, even though it succeeded in C.
  5. 新媒体运营避开这四个雷区,你也可以策划出10万+创意素材! | 黎想
  6. 程序员笔试之猿辅导招聘2021 编程题收集整理(八)
  7. 江苏大学计算机学院复试题,本部基础A定稿-含答案(江苏大学计算机).doc
  8. C++ boost 解析 Json
  9. 网上买电信电话卡又被欺骗百元
  10. RouterOS(ros)自动更新国内外IP以及端口扫描IP