【线段树】二进制

题目大意

有一个二进制数,让你进行以下操作:

  1. 将一个区间的数字按升/降序排列
  2. 查询一个区间的数字构成的数

解题思路

可以用线段树来维护每一位,预处理出2的整次幂,上传时把左儿子乘上右儿子长度次幂即可


code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 200210
#define wyc 1000000007
using namespace std;
ll n,m,x,y,z,a[N],v[N];
char s[N];
struct node
{node(ll lenn=0,ll numm=0,ll summ=0){len=lenn;num=numm;sum=summ;}ll len,num,sum;
};
node merge(node a,node b)
{node c;c.len=a.len+b.len;c.num=(a.num*v[b.len]%wyc+b.num)%wyc;c.sum=a.sum+b.sum;return c;
}
struct Tree
{#define ls x*2#define rs x*2+1node s[N<<2];ll lazy[N<<2];void push_up(ll x){s[x]=merge(s[ls],s[rs]);return;}void get(ll x,ll y){lazy[x]=y;s[x].num=(v[s[x].len]+wyc-1)%wyc*y;s[x].sum=s[x].len*y;return;}void push_down(ll x){if(lazy[x]!=-1){get(ls,lazy[x]);get(rs,lazy[x]);lazy[x]=-1;}return;}void build(ll x,ll l,ll r){lazy[x]=-1;if(l==r){s[x]=node(1,a[l],a[l]);return;}ll mid=l+r>>1;build(ls,l,mid);build(rs,mid+1,r);push_up(x);return;}void change(ll x,ll L,ll R,ll l,ll r,ll y){if(L==l&&R==r){get(x,y);return;}ll mid=L+R>>1;push_down(x);if(r<=mid)change(ls,L,mid,l,r,y);else if(l>mid)change(rs,mid+1,R,l,r,y);else change(ls,L,mid,l,mid,y),change(rs,mid+1,R,mid+1,r,y);push_up(x);return;}node ask(ll x,ll L,ll R,ll l,ll r){if (L==l&&R==r)return s[x];ll mid=L+R>>1;push_down(x);if(r<=mid)return ask(ls,L,mid,l,r);else if(l>mid)return ask(rs,mid+1,R,l,r);else return merge(ask(ls,L,mid,l,mid),ask(rs,mid+1,R,mid+1,r));}
}T;
int main()
{scanf("%s",s+1);n=strlen(s+1);v[0]=1;for(ll i=1;i<=n;++i){a[i]=s[i]-48;v[i]=v[i-1]*2%wyc;}T.build(1,1,n);scanf("%lld",&m);while(m--){scanf("%lld",&x);if(x==1){scanf("%lld%lld",&x,&y);z=T.ask(1,1,n,x,y).sum;if(!z||z==y-x+1)continue;T.change(1,1,n,x,y,0);T.change(1,1,n,x,x+z-1,1);}else if(x==2){scanf("%lld%lld",&x,&y);z=T.ask(1,1,n,x,y).sum;if(!z||z==y-x+1)continue;T.change(1,1,n,x,y,0);T.change(1,1,n,y-z+1,y,1);}else{scanf("%lld%lld",&x,&y);printf("%lld\n",T.ask(1,1,n,x,y).num%wyc);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #676 (Div. 2) E待补

“楼下一个男人病得要死&#xff0c;那间隔壁的一家唱着留声机&#xff0c;对面是弄孩子。楼上有两人狂笑&#xff1b;还有打牌声。河中的船上有女人哭着她死去的母亲。人类的悲欢并不相通&#xff0c;我只觉得他们吵闹。” A - XORwice 把a和b看成二进制数处理&#xff0c;不…

YbtOJ#883-最大的割【带修线性基】

正题 题目链接:http://www.ybtoj.com.cn/contest/118/problem/3 解题思路 给出nnn个点&#xff0c;mmm次动态插入一条无向边询问&#xff1a;割掉一些边使得图中至少两点不连通&#xff0c;并且割掉的边异或和最大。 询问之间相互独立 1≤n≤500,1≤m≤10001\leq n\leq 500,…

.NETCore 简单且高级的库 csredis v3.0.0

前言.NETCore 从1.0发布历经坎坷&#xff0c;一开始各种库缺失到现在的部分完善&#xff0c;走到今天实属不易。比如 redis-cli SDK 简直是坑出不穷。过去 .net 最有名望的 ServiceStack.Redis 早已沦为商业用途&#xff0c;在 .NETCore 中使用只能充值&#xff1b;后来居上的 …

1003 Express Mail Taking

题意&#xff1a; 有m个快递&#xff0c;放在n个快递柜里&#xff08;成顺序排布&#xff09;&#xff0c;从1号快递柜出发&#xff0c;每次要先到k号快递柜输入密码&#xff0c;然后才可以取指定的快递柜取货品&#xff0c;都取完后再回起点&#xff0c;问最短距离是多少 题…

序列区间

题目大意 给你n个数&#xff0c;问你有多少个区间满足∏ilrai∑ilraik\frac{\prod_{il}^r a_i}{\sum_{il}^r a_i}k∑ilr​ai​∏ilr​ai​​k 解题思路 原始等同于∏ilraik⋅∑ilrai\prod_{il}^r a_ik\cdot\sum_{il}^r a_i∏ilr​ai​k⋅∑ilr​ai​ 先枚举起点&#xff0c;…

github开源项目免费使用Azure PipeLine

微软收购Github后,很多人猜想微软可能会砍掉VSTS,然而事实VSTS并没有砍掉,关于Azure Devops的详细信息可以查看 这篇博客,如果想查看原文也可以从链接里提供的原始地址里查看.今天要介绍的是做Azure devops的ci部分:Azure Pipeline. VSTS升级到Azure Devops之后对开源开发者带来…

YbtOJ#752-最优分组【笛卡尔树,线段树】

正题 题目链接:http://www.ybtoj.com.cn/problem/752 题目大意 nnn个人&#xff0c;每个人有cic_ici​和did_idi​分别表示这个人所在的队伍的最少/最多人数。 然后要求将这些人分成编号连续的若干队使得队伍最多&#xff0c;并且求分队方案数。 1≤n≤1061\leq n\leq 10^61≤…

牛客小白月赛 27部分题解

已做BCDEFGJ B.乐团派对 刚开始想了个贪心&#xff0c;结果不对然后直接转头想dp了。 将能力值排序。 首先我们先分出来一组&#xff0c;能力值最大的分出来一组人数是ana_nan​即下标是n−an1→nn-a_n1\to nn−an​1→n分出来一组&#xff0c;目前还剩n−ann-a_nn−an​个人…

如何向微软 Docs 和本地化社区提交翻译贡献

Docs &#xff08;docs.microsoft.com&#xff09;是微软新版的文档网站&#xff0c;重新规划了各项技术栈的文档结构&#xff0c;看起来比 MSDN 可读性更好。虽然 Docs 提供了各种语言的版本&#xff0c;但大多是机器翻译&#xff0c;某些中文文档基本读不下去。因此微软鼓励社…

【线段树】生日

题目大意 给你一个序列&#xff0c;让你进行以下操作&#xff1a; 修改一个区间的数查询区间不同数字个数 解题思路 因为数字个数很少&#xff0c;可以直接用bitset存&#xff0c;然后套线段树 code #include<bitset> #include<cstdio> #include<cstring>…

ICPC 2019-2020 North-Western Russia Regional Contest 补题部分

已做A、M&#xff0c;E和H思路已经有了没调AC 已补BEJH 最终已完成ABEJHM B - Bad Treap 大佬题解 感觉这题就很玄学。。。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<c…

【dfs】数字

题目大意 给出x&#xff0c;问你不小于x&#xff0c;且由相同个数的4和7组成的最小的数 解题思路 对于奇数位和大于当前位数最大数的直接特判掉 对于其他的dfs枚举&#xff0c;因为如果一个位置放得比原数大&#xff0c;那么后面的都确定了&#xff0c;所以是O(n)的 code #…

【dfs】飞行棋

题目大意 给你一个n*m的网格&#xff0c;现在让你往里面填1~k&#xff08;有的位置已经填了&#xff09;&#xff0c;使其满足所有从(1,1)到(n,m)的路径不会经过相同的数字&#xff08;只能往下或往右&#xff09;&#xff0c;求方案数 解题思路 对于k<nm-1的&#xff0c;…

API测试工具SoapUI Postman对比分析

最近公司要引入API测试工具&#xff0c;经过调查和了解&#xff0c;最终决定在SoapUI 和 Postman两种工具之间做一个选择&#xff0c;两种工具在业界都很有名&#xff0c;相信很多人两种工具也都曾使用过。SoapUISoapUI是一个开源测试工具&#xff0c;通过soap/http来检查、调用…

[POI2008]STA-Station

之前都看过有换根dp&#xff0c;一直不知道是啥意思&#xff0c;本来弱弱树形dp都不太熟悉&#xff0c;不过今天工数课的时候突然想看一下&#xff0c;写个板子题练练吧。 对于我的理解&#xff0c;换根的题目一般是根不确定&#xff0c;而求得答案与根是谁有关&#xff0c;而…

Reports

试题hduoj 题意&#xff1a; 如果相邻的任意两个数相同的话&#xff0c;则输出NO&#xff0c;反之输出YES。 题解&#xff1a; 水题 我队友做的 代码&#xff1a; #include<bits/stdc.h> #define inf 1<<30 #define maxn 200000 using namespace std; int k…

【结论】分肉

题目大意 有两个数x,y&#xff0c;一轮中&#xff0c;如果x≤yx\leq yx≤y&#xff0c;那么xx,y-x&#xff0c;否则x-y,yy&#xff0c;回答经过k轮后较小的数 解题思路 可以发现xy是保持不变的&#xff0c;且x−yx2−x−y,x2>xy(x>y)x-yx\times 2-x-y,x\times 2>xy(…

在 Windows 上可以用 Docker 吗?| 洞见

简介Docker&#xff0c;或者准确一点说&#xff0c;容器技术&#xff0c;在近几年里几乎成为了应用分发和集群部署的默认技术了。背景部分&#xff0c;如果感兴趣&#xff0c;请参考闲谈集群管理模式一文。Docker 生态的成熟还有赖于其周边工具和实践模式的兴起。比如&#xff…

泰勒及洛朗展开学习笔记

2020-1024996 最近太忙了&#xff0c;今天好像没有写题&#xff0c;不过研究了一下数学hh。 2020.10.24今天又有工数课&#xff0c;我又没听&#xff0c;我记得上节工数课我看了换根dp&#xff0c;哦&#xff1f;好吧我没听过工数&#xff0c;那没事了&#xff0c;不过这次不敢…

【结论】串串串(nowcoder 20107-A)

正题 nowcoder 20107-A 题目大意 给你两个01串&#xff0c;有若干询问&#xff0c;每次询问两段长度相等的字串不同位数的奇偶性 解题思路 因为只用判断奇偶性&#xff0c;所以同时修改两个字符是不会改变结果的&#xff0c;那么可以直接将字串修改为只有0/1个1的串&#xf…