【bzoj4636】蒟蒻的数列 离散化+线段树
原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html
题目描述
输入
输出
样例输入
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】蒟蒻的数列 离散化+线段树的更多相关文章
- [bzoj4636]蒟蒻的数列_线段树
蒟蒻的数列 bzoj-4636 题目大意:给定一个序列,初始均为0.n次操作:每次讲一段区间中小于k的数都变成k.操作的最后询问全局和. 注释:$1\le n\le 4\cdot 10^4$. 想法: ...
- BZOJ_4636_蒟蒻的数列_线段树+动态开点
BZOJ_4636_蒟蒻的数列_线段树+动态开点 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将 ...
- [BZOJ4636]蒟蒻的数列
[BZOJ4636]蒟蒻的数列 试题描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k ...
- BZOJ4636: 蒟蒻的数列(动态开节点线段树)
题意 题目链接 Sol 直接上动态开节点线段树 因为只有一次询问,所以中途不需要下传标记 #include<bits/stdc++.h> #define LL long long usin ...
- 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化
4636: 蒟蒻的数列 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 247 Solved: 113[Submit][Status][Discuss ...
- 【BZOJ4636】蒟蒻的数列 STL
[BZOJ4636]蒟蒻的数列 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个 ...
- SGU 180 Inversions(离散化 + 线段树求逆序对)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...
- 【BZOJ】4636: 蒟蒻的数列
4636: 蒟蒻的数列 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 145 Solved: 71[Submit][Status][Discuss] ...
- BZOJ 4636: 蒟蒻的数列 分块
4636: 蒟蒻的数列 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4636 Description 蒟蒻DCrusher不仅喜欢玩扑克 ...
随机推荐
- Java分享笔记:Map集合(接口)的基本方法程序演示
package pack02; import java.util.*; public class MapDemo { public static void main(String[] args) { ...
- JS - 给数组的原型添加去掉重复元素的distinct方法
/* 调用完该方法,原数组只留下非重复的数据 返回一个数组,里面是依次出现的重复元素 */Array.prototype.distinct = function () { var removeA ...
- C#基础-hashtable,泛型和字典集合
hashtable 的存储方式 使用方法: 1.引入包含Hashtable的命名空间 using System.Collections; // 引入Hash所在的命名空间 2.往hash表里面添加数据 ...
- PHP自动生成分页链接
page.class.php <?php class Page { // 分页栏每页显示的页数 public $rollPage = 5; // 页数跳转时要带的参数 public $param ...
- InteliJ IDEA 设置eclipse快捷键
从使用eclipse切换到intellij idea开发工具常常会伴随这快捷切换的困扰,今天写到将intellij idea快捷键设置为eclipse快捷的方式 步骤如下: file -> se ...
- CLK_SWR=0xe1
STM8 时钟初始化 主时钟切换寄存器(CLK_SWR) http://www.stmcu.org/document/detail/index/id-200090 stm8寄存器数据手册链接
- B1005 继续(3n+1)猜想 (25分)
B1005 继续(3n+1)猜想 (25分) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程 ...
- PTA 7-10(图) 旅游规划 最短路问题
7-10(图) 旅游规划 (25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果 ...
- 在庫購買管理(MM)
■購買管理■ [購買依頼]ME51N: 登録ME52N: 変更ME53N: 照会 [購買発注]ME21N: 登録ME22N: 変更ME23N: 照会 [見積依頼]ME41: 登録ME42: 変更ME4 ...
- python使用网易邮箱发邮件
# -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText import email.mime.multip ...