主席树 或者 离散化+分块 BZOJ 4636
4636: 蒟蒻的数列
Time Limit: 30 Sec Memory Limit: 256 MB
Submit: 381 Solved: 177
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
2 5 1
9 10 4
6 8 2
4 6 3
Sample Output
思路一: 主席树(刚开始没想到,我好菜呀,明明这两天主席树还刚刚碰到的)
因为一共只有40000个操作,而且a和b的询问区间特别大,所以所有的更新节点不会太多,那么我们就用主席树,因为主席树每次最多就建立log个节点,所以能否符合要求。所以就用主席树打标记,然后如果lnub=0,那么就ans+=(mid-l+1)*val,如果rnub=0,那么ans+=(r-mid)*val,如果lnub=0&&rnub=0,那么ans+=(r-l+1)*val;即可完成query操作
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int inf = 1e9 + ;
const int maxn = + ;
int n, root[maxn], tot;
struct Tree{
int lnub, rnub, val;
}tree[maxn * ];
LL ans; int update(int o, int ql, int qr, int l, int r, int cost){
int k = ++tot;
tree[k] = tree[o];
if (ql <= l && qr >= r) {
tree[k].val = max(tree[k].val, cost);
return k;
}
int mid = (l + r) / ;
if (ql <= mid) tree[k].lnub = update(tree[o].lnub, ql, qr, l, mid, cost);
if (qr > mid) tree[k].rnub = update(tree[o].rnub, ql, qr, mid + , r, cost);
return k;
} void push_down(int o){
int lb = tree[o].lnub, rb = tree[o].rnub;
tree[lb].val = max(tree[lb].val, tree[o].val);
tree[rb].val = max(tree[rb].val, tree[o].val);
} void query(int o, int l, int r){
if (!tree[o].lnub && !tree[o].rnub){
ans = ans + 1LL * (r - l + ) * tree[o].val;
return ;
}
push_down(o);
int mid = (l + r) / ;
if (tree[o].lnub) query(tree[o].lnub, l, mid);
if (tree[o].rnub) query(tree[o].rnub, mid + , r);
if (!tree[o].lnub) ans = ans + 1LL * (mid - l + ) * tree[o].val;
if (!tree[o].rnub) ans = ans + 1LL * (r - mid) * tree[o].val;
} int main(){
cin >> n;
for (int i = ; i <= n; i++){
int a, b, k; scanf("%d%d%d", &a, &b, &k);
root[i] = update(root[i - ], a, b-, , inf, k);
}
query(root[n], , inf);
cout << ans << endl;
return ;
}
关键:区间的大小
思路二:分块
这道题分块不难想,对于每个区间如果某一个块是完整的,就令他maxval[当前块的id]=k。然后如果询问的是不完整的,就暴力的对这个块进行重构。所以这样的复杂度最坏应该是3*n^1.5。然后关键的麻烦的就是如果两个区间之间如何求值啊,我不会啊,感觉自己写的好麻烦啊——不过这里呢,我看了卿学姐的想法,感觉好神啊,这里就介绍一下咯。
我们把所有的区间都扔进去,因为询问的区间是[a,b),那么,我们就每次把a,b-1,b这三个元素都扔到这个区间里面去就好啦,然后每次询问的时候就是将[a,b-1),[b-1,b)这样子更新就好了。感觉超级超级方便,都不需要特判两边的区间是否相等之类的乱七八糟的东西了
卿学姐的:链接
主席树 或者 离散化+分块 BZOJ 4636的更多相关文章
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
- POJ 2104&HDU 2665 Kth number(主席树入门+离散化)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 50247 Accepted: 17101 Ca ...
- LuoguP3834 【模板】可持久化线段树 1(主席树)|| 离散化
题目:[模板]可持久化线段树 1(主席树) 不知道说啥. #include<cstdio> #include<cstring> #include<iostream> ...
- [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)
传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...
- 2019杭电多校第⑨场B Rikka with Cake (主席树,离散化)
题意: 给定一块n*m的矩形区域,在区域内有若干点,每个顶点发出一条射线,有上下左右四个方向,问矩形被分成了几个区域? 思路: 稍加观察和枚举可以发现,区域数量=射线交点数+1(可以用欧拉定理验证,但 ...
- 【dfs序】【二分】【主席树】【分块】bzoj3351 [ioi2009]Regions
http://dzy493941464.sinaapp.com/archives/96 那个SIZE貌似必须设成R*R/Q?不知为啥,自己算的不是这个的说. 本机AC,线上TLE. #include& ...
- 主席树总结(经典区间第k小问题)(主席树,线段树)
接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...
- 【BZOJ4556】字符串(后缀数组,主席树)
[BZOJ4556]字符串(后缀数组,主席树) 题面 BZOJ 题解 注意看题: 要求的是\([a,b]\)的子串和[c,d]的\(lcp\)的最大值 先来一下暴力吧 求出\(SA\)之后 暴力枚举\ ...
- 【BZOJ4408】[FJOI2016]神秘数(主席树)
[BZOJ4408][FJOI2016]神秘数(主席树) 题面 BZOJ 洛谷 题解 考虑只有一次询问. 我们把所有数排个序,假设当前可以表示出的最大数是\(x\). 起始\(x=0\). 依次考虑接 ...
随机推荐
- linshi12
#include<iostream> using namespace std; int main(){ int a[50]; a[1]=5; int i; for(i=2;;i++){ a ...
- 《剑指offer》---左旋转字符串与右旋转字符串
本文算法使用python3实现 1. 问题1 1.1 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S, ...
- 运维学习笔记(三)之T01-03TCP/IP
TCP/IP协议 简介 通信协议 信息从源传递到目的地的过程中,网络上各设备需要通信,描述网络通信“语言”的规范就是协议. 数据通信协议 决定数据的格式和传输的一组规则. TCP/IP协议简介 一组通 ...
- 【第二周】scrum站立会议
1.站立会议:敏捷软件开发方法论Scrum的相关技术之一,是scrum的最佳实践 2.具体形式:每天的同一时间让团队成员面对面站立交流工作进展 3.功能: (1)让团队所有人都相互知道彼此的进展,了解 ...
- CodeForces Round #527 (Div3) B. Teams Forming
http://codeforces.com/contest/1092/problem/B There are nn students in a university. The number of st ...
- ETL工具之Kettle的简单使用一(不同数据库之间的数据抽取-转换-加载)
ETL工具之Kettle将一个数据库中的数据提取到另外一个数据库中: 1.打开ETL文件夹,双击Spoon.bat启动Kettle 2.资源库选择,诺无则选择取消 3.选择关闭 4.新建一个转换 5. ...
- MySQL专题 1 分布式部署数据库同步问题 BinLog
什么是 Binlog MySQL Server 有四种类型的日志——Error Log.General Query Log.Binary Log 和 Slow Query Log. 第一个是错误日志, ...
- 在dbgrid中如何多行选中记录(ctl与shift均可用)
在dbgrid中如何多行选中记录(ctl与shift均可用),设置dbgrid的dgmultiselect为true,只有ctl好用而shift不好用,如何使shift也好用 Dbgrid源代码:pr ...
- 第156天:canvas(三)
一.变形 1.1 translate translate(x, y) 用来移动 canvas 的原点到指定的位置 translate方法接受两个参数.x 是左右偏移量,y 是上下偏移量,如右图 ...
- ZOJ2290_Game
题目意思是这样的,给定一个数N,第一个可以减去任意一个数(不能为N本身),然后接下来轮流减去一个数字,下一个人减去的数字必须大于0,且不大于2倍上一次被减去的数字. 把N减为0的人获胜. 看完题目后不 ...