线段树区间合并——cf1217E
/*
定义:多重集s的元素和是sum,对于sum的第i位为x,如果s里找不到第i位也是x的元素,那么称这个多重集为bad,
现在给定一个 序列a
两种操作
1 i x:将序列第i个元素改为x
2 l r: a[l..r]组成的多重集中,找一个和最小的bad子集,如果没有这样的子集,输出-1 如果集合中有两个数A,B在某一位都不为0,那么这个集合必定为bad,那么在区间[l..r]里找一个最小的bad集合,必定是两个数之和
我们只要找在该区间最小的两个在某一位都不为0的数即可
线段树每个结点开数组Min[10][2]维护a[l..r]里第i位不为0的最小和次小数
*/
#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define INF 0x3f3f3f3f3f
#define ll long long
ll n,a[N],m; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct Node{ll x[][];}t[N<<];
ll buf[];
void calc(ll x){
for(int i=;i<;i++)
buf[i]=x%,x/=;
}
Node merge(Node a,Node b){
Node res;
for(int i=;i<;i++)
res.x[i][]=res.x[i][]=INF;
for(int i=;i<;i++){
ll m1=a.x[i][],m2=b.x[i][];
res.x[i][]=min(m1,m2);
res.x[i][]=max(m1,m2);
res.x[i][]=min(res.x[i][],a.x[i][]);
res.x[i][]=min(res.x[i][],b.x[i][]);
}
return res;
}
void build(int l,int r,int rt){
if(l==r){
calc(a[l]);
for(int i=;i<;i++){
if(buf[i])t[rt].x[i][]=a[l];
else t[rt].x[i][]=INF;
t[rt].x[i][]=INF;
}
return;
}
int m=l+r>>;
build(lson);build(rson);
t[rt]=merge(t[rt<<],t[rt<<|]);
}
void update(ll pos,ll v,int l,int r,int rt){
if(l==r){
calc(v);
for(int i=;i<;i++){
if(buf[i])t[rt].x[i][]=v;
else t[rt].x[i][]=INF;
t[rt].x[i][]=INF;
}
return;
}
int m=l+r>>;
if(pos<=m)update(pos,v,lson);
else update(pos,v,rson);
t[rt]=merge(t[rt<<],t[rt<<|]);
}
Node query(ll L,ll R,ll l,ll r,ll rt){
if(L<=l && R>=r)return t[rt];
int m=l+r>>;
Node res;
for(int i=;i<;i++)
res.x[i][]=res.x[i][]=INF;
if(L<=m)res=merge(res,query(L,R,lson));
if(R>m)res=merge(res,query(L,R,rson));
return res;
}
int main(){
cin>>n>>m;
for(int i=;i<=n;i++)cin>>a[i];
build(,n,); while(m--){
ll op,l,r;
scanf("%lld%lld%lld",&op,&l,&r);
if(op==)
update(l,r,,n,);
else {
Node t=query(l,r,,n,);
ll ans=INF;
for(int i=;i<;i++)
ans=min(ans,t.x[i][]+t.x[i][]);
if(ans>=INF)puts("-1");
else cout<<ans<<'\n';
}
}
}
线段树区间合并——cf1217E的更多相关文章
- POJ 3667 Hotel(线段树 区间合并)
Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...
- HDU 3911 线段树区间合并、异或取反操作
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...
- HDU 3911 Black And White(线段树区间合并+lazy操作)
开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...
- HYSBZ 1858 线段树 区间合并
//Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...
- poj3667 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- hdu3911 线段树 区间合并
//Accepted 3911 750MS 9872K //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- HDU 3308 LCIS (线段树区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...
- SPOJ GSS1_Can you answer these queries I(线段树区间合并)
SPOJ GSS1_Can you answer these queries I(线段树区间合并) 标签(空格分隔): 线段树区间合并 题目链接 GSS1 - Can you answer these ...
随机推荐
- AcWing 226. 233矩阵 (矩阵快速幂+线性递推)打卡
题目:https://www.acwing.com/problem/content/228/ 题意:有一个二维矩阵,这里只给你第一行和第一列,要你求出f[n][m],关系式有 1, f[0][ ...
- 【git】如何ignore一个文件的更改又保留其初始版本
参考: https://compiledsuccessfully.dev/git-skip-worktree/ https://stackoverflow.com/questions/9794931/ ...
- win10 打开 sql sever配置管理器
!找到解决办法啦!WIN10系统 此电脑->右击->管理弹出以上界面啊哈哈哈还有一些解决办法在这个贴吧里...http://tieba.baidu.com/p/3000709047
- MyBatis原理,Spring、SpringBoot整合MyBatis
1. MyBatis概述 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...
- 前端之间的url 传值
转自:https://www.cnblogs.com/candy-Yao/p/8858166.html
- C++基础知识随记
一.什么情况必须使用初始化列表的方式声明构造函数? 1.包含常量类型的成员 2.包含引用类型的成员 3.包含没有默认构造函数的类类型成员 4.优点:对于包含有类类型成员的类来说,省去了调用一次默认构造 ...
- 制作 macOS High Sierra U盘
制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统) 随着苹果 macOS High Sierra 正式版发布,很多使用 Mac 电脑的同学都已升级到最新 ...
- python 数据压缩
zlib 压缩 import zlib import this s = this.s.encode('utf8')*10 for i in range(10): data = zlib.compres ...
- CF322F
CF322F 拉格朗日插值 #include<iostream> #include<cstdio> #include<algorithm> #include< ...
- zabbix--External checks 外部命令检测
概述zabbix server 运行脚本或者二进制文件来执行外部检测,外部检测不需要在被监控端运行任何 agentditem key 语法如下: 参数 定义 script shell 脚本或者二进制文 ...