线段树+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(* ...
随机推荐
- Java基础知识之常量变量(一)
1.什么是变量,什么是常量?java的基本数据类型是什么 变量: 会发生改变的数据,叫做变量,如自定义一个a,并且对a进行赋值操作为1,也可以让a等于2,此时a就是一个变量 常量: 不会发生改变的值, ...
- deepin 15.11添加应用启动图标
以postman为例(路径要按需修改) 1.建立软链接 sudo ln -s /home/lixing/software/Postman/Postman /usr/bin/postman 前面地址为安 ...
- 解决vuex的数据刷新(F5)后会被初始化的问题
介绍一个vuex的数据刷新(F5)后会被初始化的问题处理的插件:vuex-localstorage 实现的原理大概就是监听浏览器的刷新,关闭事件,把vuex的值存储到本地localstorage,刷新 ...
- ES6,import时如何正确使用花括号'{ }'
在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种.前者用于服务器,后者用于浏览器.ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取 ...
- Github相关知识
github的提交流程 mkdir 目录名 :创建一个空文件夹 mkdir webs webs代表创建的新文件名称 cd 目录名 :切换到文件夹 cd webs 切换到当前新建的目录下 ...
- SpringBoot学习(一)—— idea 快速搭建 Spring boot 框架
简介 优点 Spring Boot 可以以jar包的形式独立运行,运行一个Spring Boot 项目只需要通过 java -jar xx.jar 来运行. Spring Boot 可以选择内嵌Tom ...
- JavaWeb01-常识
软件系统体系结构 1 常见软件系统体系结构B/S.C/S 1.1 C/S l C/S结构即客户端/服务器(Client/Server),例如QQ: l 需要编写服务器端程序,以及客户 ...
- 协议分层(因特网5层模型)及7层OSI参考模型
目录 因特网5层模型及7层OSI参考模型 分层的体系结构: 应用层(软件) 运输层(软件) 网络层(硬件软件混合) 链路层(硬件) 物理层(硬件) OSI模型 表示层 会话层 封装 因特网5层模型及7 ...
- 2019-9-27:渗透测试,metasploit-framework初接触
初次利用metasploit漏洞利用框架,入侵获取win7获取权限 目标机系统:windows7,无修复补丁 目标ip地址:192.168.20.131 任务:利用ms17-010,永恒之蓝漏洞,获取 ...
- Java8 日期时间API
一.转换 1.与字符串 //LocalDateTime 转 字符串 String str = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss ...