线段树区间合并——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 ...
随机推荐
- shell脚本编程测试类型下
一bash的数值测试 -v VAR变量VAR是否设置 数值测试:-gt 是否大于greater-ge 是否大于等于-eq 是否等于-ne 是否不等于 not equal-lt 是否小于-le 是否小 ...
- shell脚本编程运算
一算术运算 bash中的算术运算:help let+, -, *, /, %取模(取余), **(乘方)实现算术运算:(1) let var=算术表达式(2) var=$[算术表达式](3) var= ...
- apue 第4章 文件和目录
获取文件属性 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(c ...
- 洛谷P1122 最大子树和 (树状dp)
题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...
- NetHogs——Linux下按进程实时统计网络带宽利用率
Debian/Ubuntu下安装很简单,执行:apt-get install nethogs 就可以安装. CentOS/RHEL下建议先安装上EPEL,再执行:yum install libpcap ...
- NIO模型学习笔记
NIO模型学习笔记 简介 Non-blocking I/O 或New I/O 自JDK1.4开始使用 应用场景:高并发网络服务器支持 概念理解 模型:对事物共性的抽象 编程模型:对编程共性的抽象 BI ...
- Idea JAVA項目的导入JAR包和导出jar包
一.IDea项目中导入jar包 打开菜单project structure,然后选择modules/dependencies下选择右侧的+,选择jar包目录中的jar文件,导入 二.导出jar包 菜单 ...
- Eclipes 配置src.zip(查看源代码)
接着将这些改变应用,重启eclipes即可.
- Linux下安装JDK(小白教程)
一. 选择与下载jdk 1. 官网上按照自己的系统版本下载相应jdk,因为我的LINUX(testbest)是32位的,所以我下载32位的jdk. 2. 官网下载地址:http://www. ...
- HTTP 请求及响应 (转)
HTTP请求 4.1.HTTP请求包括的内容 客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求. 一个完整的HTTP请求包括如下内容:一个请求行.若干消息头. ...