[bzoj4636]蒟蒻的数列_线段树
2024-10-01 03:50:30
蒟蒻的数列 bzoj-4636
题目大意:给定一个序列,初始均为0。n次操作:每次讲一段区间中小于k的数都变成k。操作的最后询问全局和。
注释:$1\le n\le 4\cdot 10^4$。
想法:那个操作就是一个不好好说话的操作,说白了就是对区间的每一个数取max
然后我们对于那个序列建立分治线段树。每个操作我都把它挂在对应的log的点上。
n个操作都执行完了之后我们从1号节点深搜,更新答案即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 1e9
#define N 40010
using namespace std;
typedef long long ll;
ll maxn[N*40],ans=0;
int ls[N*40],rs[N*40],cnt;
int root;
inline char nc()
{
static char *p1,*p2,buf[100000];
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
ll read()
{
ll x=0; char c=nc();
while(!isdigit(c)) c=nc();
while(isdigit(c)) x=(x<<3)+(x<<1)+c-'0',c=nc();
return x;
}
void update(int x,int y,ll val,int l,int r,int &pos)
{
if(!pos) pos=++cnt;
if(x==l&&r==y)
{
maxn[pos]=max(maxn[pos],val);
return;
}
int mid=(l+r)>>1;
if(y<=mid) update(x,y,val,l,mid,ls[pos]);
else if(mid<x) update(x,y,val,mid+1,r,rs[pos]);
else
{
update(x,mid,val,l,mid,ls[pos]);
update(mid+1,y,val,mid+1,r,rs[pos]);
}
// if(x<=mid) update(x,y,val,l,mid,ls[pos]);
// if(mid<y) update(x,y,val,mid+1,r,rs[pos]);
}
void query(ll val,int l,int r,int pos)
{
if(!pos) return;
maxn[pos]=max(maxn[pos],val);
if(!ls[pos]&&!rs[pos])
{
ans+=maxn[pos]*(r-l+1);
return;
}
int mid=(l+r)>>1;
query(maxn[pos],l,mid,ls[pos]);
query(maxn[pos],mid+1,r,rs[pos]);
if(!ls[pos]) ans+=maxn[pos]*(mid-l+1);
if(!rs[pos]) ans+=maxn[pos]*(r-mid);
}
int main()
{
int n=read();
int x,y; ll val;
for(int i=1;i<=n;++i)
{
x=read(),y=read(),val=read();
if(x==y) continue;
update(x,y-1,val,1,inf,root);
}
query(0,1,inf,root);
printf("%lld\n",ans);
return 0;
}
小结:get新技能:分治线段树。
最新文章
- PHP之readdir()函数
- Android只能动态注册的广播Action
- java16
- php返回数据库查询时出现Resource id #2
- Java中Timer的用法
- Mac终端常见命令
- 四色定理+dfs(poj 1129)
- 1029c语言文法
- __stdcall 与 __cdecl
- Disruptor 源码阅读笔记--转
- 1048: [HAOI2007]分割矩阵 - BZOJ
- sql获取第n条数据
- iOS 开发之 Xcode installation failed invalid argument!
- Gazebo機器人仿真學習探索筆記(三)機器人模型
- python 包下载地址
- C语言排序算法学习笔记——插入类排序
- MacBook上使用ssh localhost被拒绝
- 利用binlogserver恢复单表实验【转】
- Innodb页面存储结构-2
- Scala--映射和元组
热门文章
- compileSdkVersion, minSdkVersion 和 targetSdkVersion的选择(copy)
- Spring实例化bean之后的处理, 关于BeanPostProcessor接口的使用
- easyui- comobo 详细讲解
- 关于二分查找 使用 lower_bound
- JS——动态添加事件和移除事件(有待补充...)
- Caffe2:添加CUDA路径
- 解决springmvc返回json中文乱码
- AjaxDemo
- Python元类(metaclass)以及元类实现单例模式
- 关于Python中的classmethod