原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html


题目描述

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

输入

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

输出

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

样例输入

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

样例输出

16


题解

离散化+线段树

很容易想到先将操作按照k值从小到大排序,然后按照这个顺序修改,就不用考虑大于等于k的数。

题目中给的是[a,b)的点,可以转化成a到b的线段,便于离散化。

离散化后线段树区间修改即可,注意这是维护线段的线段树,和维护点权的线段树略有区别。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 40010
#define lson l , mid , x << 1
#define rson mid , r , x << 1 | 1
using namespace std;
typedef long long ll;
struct pos
{
int num , p;
}a[N << 1];
struct seg
{
int lp , rp , k;
}q[N];
int v[N << 1] , top , tag[N << 3];
ll sum[N << 3];
bool cmp1(pos a , pos b)
{
return a.num < b.num;
}
bool cmp2(seg a , seg b)
{
return a.k < b.k;
}
void pushup(int x)
{
sum[x] = sum[x << 1] + sum[x << 1 | 1];
}
void pushdown(int l , int r , int x)
{
int mid = (l + r) >> 1;
if(tag[x])
{
sum[x << 1] = (ll)(v[mid] - v[l]) * tag[x];
sum[x << 1 | 1] = (ll)(v[r] - v[mid]) * tag[x];
tag[x << 1] = tag[x << 1 | 1] = tag[x];
tag[x] = 0;
}
}
void update(int b , int e , int k , int l , int r , int x)
{
if(b <= l && r <= e)
{
sum[x] = (ll)(v[r] - v[l]) * k;
tag[x] = k;
return;
}
pushdown(l , r , x);
int mid = (l + r) >> 1;
if(b < mid) update(b , e , k , lson);
if(e > mid) update(b , e , k , rson);
pushup(x);
}
int main()
{
int n , i;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ )
scanf("%d%d%d" , &a[i].num , &a[i + n].num , &q[i].k) , a[i].p = i , a[i + n].p = i + n;
sort(a + 1 , a + 2 * n + 1 , cmp1);
for(i = 1 ; i <= 2 * n ; i ++ )
{
if(a[i].num != v[top]) v[++top] = a[i].num;
if(a[i].p <= n) q[a[i].p].lp = top;
else q[a[i].p - n].rp = top;
}
sort(q + 1 , q + n + 1 , cmp2);
for(i = 1 ; i <= n ; i ++ ) update(q[i].lp , q[i].rp , q[i].k , 1 , top , 1);
printf("%lld\n" , sum[1]);
return 0;
}

【bzoj4636】蒟蒻的数列 离散化+线段树的更多相关文章

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

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

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

    BZOJ_4636_蒟蒻的数列_线段树+动态开点 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将 ...

  3. [BZOJ4636]蒟蒻的数列

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

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

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

  5. 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化

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

  6. 【BZOJ4636】蒟蒻的数列 STL

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

  7. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

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

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

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

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

随机推荐

  1. Spring详解篇之IoC控制反转

    ###一.Spring概况 spring是一个开源框架 是一个轻量的控制反转和面向切面的容器框架 大小和开销都是轻量的. 通过控制反转技术可以达到松耦合的目的 切面编程,允许通过分离应用的业务逻辑. ...

  2. SpringBoot学习11:springboot异常处理方式1(自定义异常页面)

    SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制.一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求.在 sprin ...

  3. Redhat 6.4 linux系统不重启识别热添加的硬盘方法

    1.1    选择虚拟机添加一块硬盘 1.2    查看系统当前磁盘信息 [root@zhongyi-test ~]# ls -l /dev/sd* brw-rw----. 1 root disk 8 ...

  4. html5中的progress兼容ie,制作进度条样式

    html5新增的progress标签用处很大,它可以制作进度条,不用像以前那样用css来制作进度条! 一.progress使用方法 progress标签很好使用,他有两个属性,value和max,va ...

  5. strak组件(5):为列表定制预留钩子方法

    效果图:  新增函数 def get_list_display(self): 获取页面上应该显示的列,预留的自定义扩展,例如:以后根据用户的不同显示不同的 一.stark组件 stark/servic ...

  6. 手动完全卸载Office

    1 当然出现安装错误,或是无法安装先考虑官方卸载工具卸载,运行后要是解决了问题是最好的.毕竟手动删除比较麻烦. 开始我们先停止 Office Source Engine 服务.以windows7为例子 ...

  7. Fragment Touch事件泄露

    当Fragment的栈里面有几个fragment的时候,这个时候如果是几个fragment状态是hide,当你触摸当前fragment的时候,下层的fragment的事件被触发,这是由于Touch事件 ...

  8. linux 检测进程是否存在

    1. 直接遍历/proc目录 int find_pid_by_name( char* pidname, pid_t *pidlist) { #define READ_BUF_SIZE 256 DIR ...

  9. 【转】android makefile文件分析

    Makefile的规则如下: target ... : prerequisites ... command ... ... target可以是一个目标文件,也可以是Object File(例如hell ...

  10. <<程序猿健康指南>> 笔记

    序言: 长时间对着电脑工 作.一天下来基本不怎么走动的人,患高血压及 2 型糖尿病的风险远高于其他人群, 这两种疾病会对人体的健康产生长久的严重影响,还会增加心脏病及中风的几率. 前言: 阿米什人(A ...