线段树+lazy标记 2019年8月10日计蒜客联盟周赛 C.小A的题
题目链接:https://nanti.jisuanke.com/t/40852
题意:给定一个01串s,进行m次操作,|s|<=1e6,m<=5e5
操作有两种
l r 0,区间[l,r]升序排序
l r 1,区间[l,r]降序排序
输出m次操作后的串s
官方解析:
维护区间1的个数,区间0的个数=区间长度-区间1的个数,完成区间赋值操作并更新即可。
个人思路:
线段树的操作都是log(n),如果带了lazy标记,就可以小于log(n),不必查询到每个点。例如将[1,3]都置为1,只用将t[2]=3即可。
另外tag是标记升序降序的lazy标记,在update和getsum中会进行标记下放。
时间复杂度小于O(m*log(|S|))

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxl=1e6+;
const int manx=5e5+;
char s[maxl];
int t[maxl*],tag[maxl*];
inline int read()
{
int f=,x=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=(x<<)+(x<<)+s-'';s=getchar();}
return x*f;
} void build(int x,int l,int r)//t[x]记录1的个数
{
tag[x]=-;
if(l==r)
{
t[x]=s[l]-'';
return;
}
int mid=(l+r)/;
build(x*,l,mid);
build(x*+,mid+,r);
t[x]=t[x*]+t[x*+]; //x<<1|1
}
int getsum(int x,int l,int r,int L,int R) //L R是要求的sum区间
{
if(l==L&&r==R)return t[x];
int mid=(l+r)/;
if(tag[x]!=-)
{
tag[x*]=tag[x*+]=tag[x];
t[x*]=tag[x]?(mid-l+):;
t[x*+]=tag[x]?(r-mid):;
tag[x]=-;
}
if(R<=mid)return getsum(x*,l,mid,L,R);
else if(L>mid)return getsum(x*+,mid+,r,L,R);
else return getsum(x*,l,mid,L,mid)+getsum(x*+,mid+,r,mid+,R);
}
void update(int x,int l,int r,int L,int R,int v)
{
if(l==L&&r==R)
{
tag[x]=v;
t[x]=v?(r-l+):;
return;
}
int mid=(l+r)/;
if(tag[x]!=-)
{
tag[x*]=tag[x*+]=tag[x];
t[x*]=tag[x]?(mid-l+):;
t[x*+]=tag[x]?(r-mid):;
tag[x]=-;
}
if(R<=mid) update(x*,l,mid,L,R,v);
else if(L>mid) update(x*+,mid+,r,L,R,v);
else
{
update(x*,l,mid,L,mid,v);
update(x*+,mid+,r,mid+,R,v);
}
t[x]=t[x*]+t[x*+];
}
void dfs(int x,int l,int r)
{
if(l==r)
{
printf("%d",t[x]);
return;
}
int mid=(l+r)/;
if(tag[x]!=-)
{
tag[x*]=tag[x*+]=tag[x];
t[x*]=tag[x]?(mid-l+):;
t[x*+]=tag[x]?(r-mid):;
tag[x]=-;
}
dfs(x*,l,mid);
dfs(x*+,mid+,r);
}
int main()
{
scanf("%s",s+);
int n=strlen(s+);
build(,,n);
int m=read();
int u,v,w;
while(m--)
{
u=read();v=read();w=read(); //[u,v],w=0升序,w=1降序
int sum=getsum(,,n,u,v); //算出有几个1
if(sum==||sum==(v-u+))continue;
if(w==)update(,,n,u,v-sum,),update(,,n,v-sum+,v,);
else update(,,n,u,u+sum-,),update(,,n,u+sum,v,);
}
dfs(,,n);
return ;
}
另:移位符号计算比*号快,线段树要开四倍空间
线段树+lazy标记 2019年8月10日计蒜客联盟周赛 C.小A的题的更多相关文章
- 并查集 2019年8月10日计蒜客联盟周赛 K.数组
题目链接:https://nanti.jisuanke.com/t/40860 题意:给一个长度为n的数组a[],n<1e5,a[i]<1e5 三个操作: 1 x y:把所有值为x的数据改 ...
- poj3468 线段树+lazy标记
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 92921 ...
- POJ3237 Tree(树剖+线段树+lazy标记)
You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbe ...
- HDU_1698 Just a Hook(线段树+lazy标记)
pid=1698">题目请点我 题解: 接触到的第一到区间更新,须要用到lazy标记.典型的区间着色问题. lazy标记详情请參考博客:http://ju.outofmemory.cn ...
- POJ 3225 线段树+lazy标记
lazy写崩了--. 查了好久 /* U-> [l,r]–>1 I-> [1,l-1] [r+1,+无穷] –>0 D-> [l,r]–>0 C-> [1,l ...
- 线段树+Lazy标记(我的模版)
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ...
- C++-POJ2777-Count Color[线段树][lazy标记][区间修改]
分析:https://www.bilibili.com/read/cv4777102 #include <cstdio> #include <algorithm> using ...
- 线段树lazy标记??Hdu4902
Nice boat Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...
- 2019年3月10日 装饰器进阶-模拟session
ser_dic={'username':None,'login':False}#用户字典,反应登入状态,用字典做全局变量 def idf(func):#验证登入信息是否正确 def wrapper(* ...
随机推荐
- 关于mysql驱动cj与不是cj的问题
1. 带cj的是mysql驱动6.0以上的,不带的是6.0以下的. 2.6.0以上的需要注意有时区纠正
- Linux\CentOS Tomcat 配置
需要注意的是:安装 Tomcat 之前需要把 jdk 安装好. 一.下载安装包 - 安装可以在官网自行下载,下载 tar.gz 包便可. 二.解压缩: tar -zxvf apache-tomcat- ...
- CSS(6)---通俗讲解浮动(float)
CSS(6)---通俗讲解浮动(float) CSS有三模块:盒子模型.浮动 .定位.上篇博客有讲到 盒子模型地址:CSS(5)---通俗讲解盒子模型 一.理解浮动 1.概念 概念 浮动可以理解为让某 ...
- VMware安装Ubuntu 16.04.4 LTS
1.下载Ubuntu镜像 https://www.ubuntu.com/download/desktop 2.创建新的虚拟机 3. 4.这里默认即可,可以不选 5. 6. 7.这里位置可以随时改 8. ...
- pat 1041 Be Unique(20 分)
1041 Be Unique(20 分) Being unique is so important to people on Mars that even their lottery is desig ...
- nyoj 517-最小公倍数 (python range(start, end) range(length))
517-最小公倍数 内存限制:64MB 时间限制:1000ms 特判: No 通过数:2 提交数:11 难度:3 题目描述: 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并 ...
- 关键路径法(Critical Path Method, CPM)
1.活动节点描述及计算公式 通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析. 产生目的:为了解决,在庞大而复杂的项目中,如何合理而有效地组织人力.物力和财力,使之在有限资源 ...
- C语言作业|08
问题 答案 这个作业的属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/9977 我 ...
- C. Present(二分 + 扫描线)
题目链接:http://codeforces.com/contest/460/problem/C 题意: n盆花,浇k次水, 每次可使花高度 + 1, 每次可浇相邻的w盆,ai 表示 i-th盆花 的 ...
- mysql数据库E-R图
学会绘制E-R图 绘制E-R图首先要了解什么是实体,什么是属性,什么是联系. 1.首先实体是指现实世界中具有区分其他事物的特征或属性与其他实体有联系的实体,针对于数据库中的表而言实体是指表中一行一行特 ...