4636: 蒟蒻的数列

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 247  Solved: 113
[Submit][Status][Discuss]

Description

蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列
题目描述
DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想知
道N次操作后数列中所有元素的和。他还要玩其他游戏,所以这个问题留给你解决。
 

Input

第一行一个整数N,然后有N行,每行三个正整数a、b、k。
N<=40000 , a、b、k<=10^9

Output

一个数,数列中所有元素的和

Sample Input

4
2 5 1
9 10 4
6 8 2
4 6 3

Sample Output

16

HINT

Source

Solution

这题似乎是IOI-Wall的弱化版

可行的做法有两种:

Part1: 动态开点线段树

动态的添加区间,标记永久化

最后遍历一遍线段树,统计一下答案

Part2:离散化普通线段树

把需要操作的区间离散化,对每个节点维护左右端点.离散化后对应长度.以及K

在打标记的时候,注意比较,实际上和标记永久化维护半平面交有点类似的思想

然后区间修改区间求和就可以了

Part1.时间较优,但空间较大 Part2.时间尚可,但空间较优

Code

最开始大家想法是Part2,但这里提供更好写的Part1

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. int read()
  8. {
  9. int x=,f=; char ch=getchar();
  10. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  11. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
  12. return x*f;
  13. }
  14. int N,a,b,K;
  15. long long ans;
  16. #define MAXN 50000
  17. struct SegmentTreeNode
  18. {
  19. int data[MAXN<<],son[MAXN<<][],root,sz;
  20. void Insert(int &rt,int l,int r,int L,int R,int x)
  21. {
  22. if (L>R) return;
  23. if (!rt) rt=++sz;
  24. if (l==L && R==r) {data[rt]=max(data[rt],x); return;}
  25. int mid=(l+r)>>;
  26. if (R<=mid) Insert(son[rt][],l,mid,L,R,x);
  27. else if (L>mid) Insert(son[rt][],mid+,r,L,R,x);
  28. else Insert(son[rt][],l,mid,L,mid,x),Insert(son[rt][],mid+,r,mid+,R,x);
  29. }
  30. void Query(int rt,int l,int r,int x)
  31. {
  32. if (!rt) return;
  33. data[rt]=max(data[rt],x);
  34. if (!son[rt][] && !son[rt][]) {ans+=(long long)((r-l+)*data[rt]); return;}
  35. int mid=(l+r)>>;
  36. Query(son[rt][],l,mid,data[rt]),Query(son[rt][],mid+,r,data[rt]);
  37. if (!son[rt][]) ans+=(long long)((mid-l+)*data[rt]);
  38. if (!son[rt][]) ans+=(long long)((r-mid)*data[rt]);
  39. }
  40. }SegTree;
  41. #define INF (int)1e9
  42. void Freopen() {freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);}
  43. void Fclose() {fclose(stdin);fclose(stdout);}
  44. int main()
  45. {
  46. //Freopen();
  47. N=read();
  48. while (N--)
  49. a=read(),b=read(),K=read(),
  50. SegTree.Insert(SegTree.root,,INF,a,b-,K);
  51. SegTree.Query(SegTree.root,,INF,);
  52. printf("%lld\n",ans);
  53. return ;
  54. }

蛋爷上传的题目,最早来源是faebdc学长放到洛谷上的

澄清一个事实: 题面里的DCrusher是神犇!是神犇!是神犇!不是蒟蒻

【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化的更多相关文章

  1. BZOJ4636: 蒟蒻的数列(动态开节点线段树)

    题意 题目链接 Sol 直接上动态开节点线段树 因为只有一次询问,所以中途不需要下传标记 #include<bits/stdc++.h> #define LL long long usin ...

  2. 【刷题】BZOJ 4636 蒟蒻的数列

    Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想 ...

  3. BZOJ 4636: 蒟蒻的数列 分块

    4636: 蒟蒻的数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4636 Description 蒟蒻DCrusher不仅喜欢玩扑克 ...

  4. BZOJ 4636 蒟蒻的数列

    二分写错了血T..... 线段树标记永久化. #include<iostream> #include<cstdio> #include<cstring> #incl ...

  5. 【BZOJ】4636: 蒟蒻的数列

    4636: 蒟蒻的数列 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 145  Solved: 71[Submit][Status][Discuss] ...

  6. BZOJ 3531 [Sdoi2014]旅行 树链剖分+动态开点线段树

    题意 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我们用 ...

  7. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  8. BZOJ 3531: [Sdoi2014]旅行 (树剖+动态开点线段树)

    对于每种信仰维护一棵动态开点线段树就行了- #include <cstdio> #include <cctype> #include <cstring> #incl ...

  9. Luogu P3960 列队(动态开点线段树)

    P3960 列队 题意 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有\(n \times m ...

随机推荐

  1. css 九宫格

    http://jsfiddle.net/webtiki/kQXkt/ http://jsfiddle.net/webtiki/MpXYr/3/embedded/ https://www.web-tin ...

  2. IE下默认TD colspan rowspan值为1

    IE下默认TD colspan rowspan值为1,即使这个TD没有合并没有rowspan,colspan属性,其值都为1,chrome下正常. 判断是否rowspan colspan为TD.get ...

  3. MPI+WIN10并行试运行

    系统:2015 win10专业版 x64 MPI安装包:mpich2-1.4.1p1-win-x86-64.man 将后缀改为.msi 以管理员身份安装 安装过程一路默认,注意<behappy为 ...

  4. 通过源码分析MyBatis的缓存

    前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ MyBatis缓存介绍 首先看一段wiki上关于MyBatis缓存的介绍 ...

  5. Theano3.4-练习之多层感知机

    来自http://deeplearning.net/tutorial/mlp.html#mlp Multilayer Perceptron note:这部分假设读者已经通读之前的一个练习 Classi ...

  6. xml入门

    1.why xml? 如果说JSON是一种轻量级的数据交换格式,那么xml就是重量级的.xml应用于web开发的许多方面,常用于简化数据的存储和共享.永远要记住,xml跟JSON一样是用来存储和传输数 ...

  7. 遇到技嘉 Gigabyte UEFI DualBIOS问题

    我的板子是技嘉H87-D3H二手板子,用了差不多三年左右,一直感觉不错,承担着高强度的开发任务. 问题描述: 无法开机,按下电源后,主板通电状态灯亮,CPU和显卡风扇转动,显示器显示下图: 2至3秒后 ...

  8. [HDOJ5445]Food Problem(优先队列优化多重背包)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:多重背包 分析:f[i][j]=max(f[i-1][j-k*w[i]]+k*v[i]) 将j ...

  9. Install Sogoupinyin in Ubuntu

    If you use Ubuntu 15.10,search 'sogou' in Software Center.If you can see sogoupinyin there.You can g ...

  10. ElasticSearch入门系列(七)搜索

    一.在之前,我们已经学会了如何使用elasticsearch作为一个简单的NoSql风格的分布式文件存储器--我们可以将一个JSON文档扔给Elasticsearch.也可以根据ID检索他们.但Ela ...