线段树区间合并——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 ...
随机推荐
- CDN技术之--内容缓存工作原理
有CDN前的网站服务技术–硬件扩展:高成本,灵活性和可扩展性比较差–镜像技术(mirroring):镜像服务器安装有一个可以进行自动远程备份的软件,每隔一定时间,各个镜像服务器就会到网站的源服务器上去 ...
- react教程 — 开发 总结
本文章是在熟练使用 VUE 的基础上,对比VUE 功能进行的一个技术总结. 1.react项目快速搭建 https://blog.csdn.net/mapbar_front/article/deta ...
- Django基础篇(二)与mysql配合使用
需求:模拟实现学员管理系统.<*_* 从基础做起> 表结构如下: 班级/学生/老师 班级表: id title 1 xx 2 xx 学生表: id name ...
- wrtnode板
Arduino技术交流:www.openjumper.com QQ群 ArduinoCN I : 180646674,ArduinoCN II : 203870250 商品详情 产品介绍 : WRT ...
- 73、salesforce通过JAVA来Call在salesforce中已经写好的Restful处理接口
/** *使用salesforce通过REST方式作为webservice,需要以下几点 *1.类和方法需要global,方法需要静态 *2.类需要通过RestResource(UrlMapping= ...
- mybatis原理与设计模式-日志模块- 适配器模式
在讲设计模式之前,得先知道java程序设计中得六大原则,才能更好得理解我们得系统为什么需要设计模式 1 单一职责原则 一个类只负责一种职责,只有这种职责的改变会导致这个类的变更.绕口一点的正统说法:不 ...
- WebBrowser常用浏览操作
WebBrowser1.GoHome; //到浏览器默认主页 WebBrowser1.Refresh; //刷新 WebBrowser1.GoBack; //后退 WebBrowser1.GoForw ...
- Rsync 实现服务器文件的同步——服务端的安装配置
一.安装rsync 直接使用yum命令进行安装即可. yum -y install rsync 二.配置文件 网上大多教程都说安装是默认没有配置文件的,但是经过我的尝试,yum安装下默认是有配置文件的 ...
- Python常用模块系列
1.时间模块 import time,datetime # print(time.time()) #时间戳 # print(time.strftime("%Y-%m-%d %X") ...
- activiti7查询流程定义的相关信息
package com.zcc.activiti02; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proc ...