BZOJ_4636_蒟蒻的数列_线段树+动态开点

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

把操作离线并从小到大排序,相当于线段树维护区间赋值操作。
本题可以离散化也可以动态开点,我这里处理不好线段树维护离散后的区间因此写了动态开点。
注意pushdown操作时如果没有这个儿子也要开出来。
 
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
#define N 40050
#define maxn 1000000000
typedef long long ll;
struct A {
int l,r,k;
}a[N];
bool cmp(const A &x,const A &y) {return x.k<y.k;}
int tag[N*80],cnt,n,ls[N*80],rs[N*80];
ll t[N*80];
/*int make(int x) {
return lower_bound(v+1,v+cnt+1,x)-v;
}*/
void pushdown(int l,int r,int &p,int w) {
if(!p) p=++cnt;
t[p]=1ll*w*(r-l+1); tag[p]=w;
}
void update(int l,int r,int x,int y,int w,int &p) {
if(p==0) p=++cnt;
if(x<=l&&y>=r) {
t[p]=1ll*w*(r-l+1);
tag[p]=w;
return ;
}
int mid=(l+r)>>1;
if(tag[p]) {
pushdown(l,mid,ls[p],tag[p]);
pushdown(mid+1,r,rs[p],tag[p]);
tag[p]=0;
}
if(x<=mid) update(l,mid,x,y,w,ls[p]);
if(y>mid) update(mid+1,r,x,y,w,rs[p]);
t[p]=t[ls[p]]+t[rs[p]];
}
int main() {
scanf("%d",&n);
int i;
for(i=1;i<=n;i++) {
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].k);
a[i].r--;
/*v[++cnt]=a[i].l;
v[++cnt]=a[i].r;*/
}
/*sort(v+1,v+cnt+1);
cnt=unique(v+1,v+cnt+1)-v-1;
printf("%d\n",cnt);
for(i=1;i<=cnt;i++) printf("%d\n",v[i]); */
sort(a+1,a+n+1,cmp);
int root=0;
for(i=1;i<=n;i++) {
if(a[i].k==0) continue;
/*printf("%d %d\n",make(a[i].l),make(a[i].r));
update(1,cnt,make(a[i].l),make(a[i].r),a[i].k,1);
printf("sum=%lld\n",t[1]);*/
update(1,maxn,a[i].l,a[i].r,a[i].k,root);
}
printf("%lld\n",t[1]);
}

BZOJ_4636_蒟蒻的数列_线段树+动态开点的更多相关文章

  1. [bzoj4636]蒟蒻的数列_线段树

    蒟蒻的数列 bzoj-4636 题目大意:给定一个序列,初始均为0.n次操作:每次讲一段区间中小于k的数都变成k.操作的最后询问全局和. 注释:$1\le n\le 4\cdot 10^4$. 想法: ...

  2. 【bzoj4636】蒟蒻的数列 离散化+线段树

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html 题目描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个 ...

  3. hdu6183 Color it 线段树动态开点+查询减枝

    题目传送门 题目大意: 有多次操作.操作0是清空二维平面的点,操作1是往二维平面(x,y)上放一个颜色为c的点,操作2是查询一个贴着y轴的矩形内有几种颜色的点,操作3退出程序. 思路: 由于查询的矩形 ...

  4. P3939 数颜色 线段树动态开点

    P3939 数颜色 线段树动态开点 luogu P3939 水.直接对每种颜色开个权值线段树即可,注意动态开点. #include <cstdio> #include <algori ...

  5. HDU - 6183 暴力,线段树动态开点,cdq分治

    B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一 ...

  6. 洛谷P3313 [SDOI2014]旅行 题解 树链剖分+线段树动态开点

    题目链接:https://www.luogu.org/problem/P3313 这道题目就是树链剖分+线段树动态开点. 然后做这道题目之前我们先来看一道不考虑树链剖分之后完全相同的线段树动态开点的题 ...

  7. codedecision P1113 同颜色询问 题解 线段树动态开点

    题目描述:https://www.cnblogs.com/problems/p/11789930.html 题目链接:http://codedecision.com/problem/1113 这道题目 ...

  8. 2019.03.09 bzoj4999: This Problem Is Too Simple!(树链剖分+线段树动态开点)

    传送门 题意:给一颗树,每个节点有个初始值,要求支持将i节点的值改为x或询问i节点到j节点的路径上有多少个值为x的节点. 思路: 考虑对每种颜色动态开点,然后用树剖+线段树维护就完了. 代码: #in ...

  9. Gym - 101848C Object-Oriented Programming (树链剖分+线段树+动态开点)

    C. Object-Oriented Programming time limit per test 3.0 s memory limit per test 1024 MB input standar ...

随机推荐

  1. Integer 和int 比较

    在jdk1.5的环境下,有如下4条语句: 1 2 3 4 Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integ ...

  2. Git快速入门进阶篇

    本文接着Git快速入门篇,继续探讨Git在管理项目中的一些应用. 远程仓库的使用 查看远程仓库 查看你已经配置的远程仓库服务器,可以运行 git remote 命令.指定选项 -v,会显示需要读写远程 ...

  3. unity零基础开始学习做游戏(一)为了实现你的游戏,你需要提前做的准备工作

    -------小基原创,转载请给我一个面子 正所谓,工欲善其事,必现准备好电脑.接下来跟着小基一步一步来搭建你的开发环境吧 1.下载安装unity 上面的那个是破解软件,下面是unity5.5.6的安 ...

  4. R实战 第七篇:网格(grid)

    grid包是R底层的图形系统,可以绘制几乎所有的图形.除了绘制图形之外,grid包还能对图形进行布局.在绘图时,有时候会遇到这样一种情景,客户想把多个代表不同KPI的图形分布到同一个画布(Page)上 ...

  5. 竞品调研时发现的Android新设计特性

    先share两篇技术层面的文章: Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用:http://blog ...

  6. 通知:QQ互联网回调地址校验加强

    今天公司网站第三方qq快捷登录突然登录不了了,之前明明是ok的. 可以看到有一个错误信息提示 在qq互联的官网看到了这个通知 然后解决办法是: 1.打开http://open.qq.com/tools ...

  7. Spark---架构原理

    Spark核心组件 1.Driver 我们编写的Spark程序就在Driver上 Spark集群节点之一,就是你提交的Spark程序的机器 2.Master Master是个进程 Master其实主要 ...

  8. add two nums

    问题描述: 给定两个链表,计算出链表对应位置相加的和,如果和大于10要往后进位.用链表返回结果.其实上是一种大数加法.可以把一个大数倒着写存入链表,然后两个链表相加就是所需要的大数相加的和 输入 2 ...

  9. Bootstrap在线引用css和js

    百度在线调用 <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></ ...

  10. 简明4步,让Python的好朋友Pycharm变得更加雅观!

    跟着人工智能/机械学习的兴起,Python再次取得广泛程序员的关注.而JetBrains出品的PyCharm无疑是最好用的Python IDE之一. 把本身的IDE装备安排得既有逼格又雅观,这是每个P ...