当前位置: 首页 > news >正文

中国网站有哪些公司在线查看qq空间网站

中国网站有哪些公司,在线查看qq空间网站,餐饮商城网站制作多少钱,网络培训视频如何快速完成1.XOR的艺术 题意 给定一个长度为 n n n的、只含有数字 0 , 1 0,1 0,1的字符串和两种操作。 对于每种操作,给定 o p , l , r op,l,r op,l,r: o p 0 op0 op0表示将字符串的 [ l , r ] [l, r] [l,r]区间内的 0 0 0变成 1 1 1, 1 1 1变成 0 …

1.XOR的艺术

题意

给定一个长度为 n n n的、只含有数字 0 , 1 0,1 0,1的字符串和两种操作。

对于每种操作,给定 o p , l , r op,l,r op,l,r

o p = 0 op=0 op=0表示将字符串的 [ l , r ] [l, r] [l,r]区间内的 0 0 0变成 1 1 1 1 1 1变成 0 0 0

o p = 1 op=1 op=1表示询问字符串的 [ l , r ] [l, r] [l,r]区间内有多少个字符 1 1 1

思路

一段区间中非 0 0 0 1 1 1,那么该区间中 1 1 1的个数,其实就是区间求和,考虑使用线段树解决这个问题。

对于 o p = 0 op=0 op=0这个取反操作,设区间左右端点分别为 l , r l,r l,r,原来的 1 1 1个数为 s u m sum sum;取反一次,原来 1 1 1的位置有 s u m sum sum处变成 0 0 0,而原来为 0 0 0的位置有 ( r − l + 1 ) − s u m (r-l+1)-sum (rl+1)sum处变成 1 1 1,相当于现在 1 1 1的个数 s u m ′ = ( r − l + 1 ) − s u m sum'=(r-l+1)-sum sum=(rl+1)sum

知道了怎么更新区间了就好办了,但是为了节省时间就要引入懒标记 t a g tag tag

可以令其表示区间要被处理的次数,在下次修改或查询时当次数为奇数时才 p u s h d o w n pushdown pushdown下放(因为翻转两次就相当于没反转)

也可以直接让 t a g = 0 tag=0 tag=0 1 1 1,来表示需不需要执行翻转操作,每次更新就异或一次 1 1 1

线段树就只需要维护区间和 s u m sum sum即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls u<<1
#define rs u<<1|1
const ll N=2e5+9;
ll n,m,a[N];
char c[N];
struct SegT
{struct node{ll sum,tag;}T[N<<4];void pushup(ll u){T[u].sum=T[ls].sum+T[rs].sum;}void pushdown(ll u,ll l,ll r){if(T[u].tag){ll mid=(l+r)>>1;T[ls].sum=(mid-l+1)-T[ls].sum;T[rs].sum=(r-mid)-T[rs].sum;}T[ls].tag^=T[u].tag;T[rs].tag^=T[u].tag;T[u].tag=0;}void build(ll u,ll l,ll r){if(l==r){T[u].sum=a[l];return;}ll mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);pushup(u);}void modify(ll u,ll l,ll r,ll ql,ll qr){if(qr<l||r<ql)return;if(ql<=l&&r<=qr){T[u].sum=(r-l+1)-T[u].sum;T[u].tag^=1;return;}pushdown(u,l,r);ll mid=(l+r)>>1;if(ql<=mid)modify(ls,l,mid,ql,qr);if(qr>mid)modify(rs,mid+1,r,ql,qr);pushup(u);}ll query(ll u,ll l,ll r,ll ql,ll qr){if(qr<l||r<ql)return 0;if(ql<=l&&r<=qr)return T[u].sum;pushdown(u,l,r);ll mid=(l+r)>>1,ret=0;if(ql<=mid)ret+=query(ls,l,mid,ql,qr);if(qr>mid)ret+=query(rs,mid+1,r,ql,qr);return ret;}
}A;
int main()
{scanf("%lld%lld%s",&n,&m,c+1);for(int i=1;i<=n;i++)a[i]=c[i]-'0';A.build(1,1,n);while(m--){ll op,l,r;scanf("%lld%lld%lld",&op,&l,&r);if(op==0)A.modify(1,1,n,l,r);if(op==1)printf("%lld\n",A.query(1,1,n,l,r));}return 0;
}

2.XOR on Segment

题意

给定 n n n个数的序列 a a a m m m次操作,操作有两种:

对于每种操作,给定 o p , l , r op,l,r op,l,r

o p = 1 op=1 op=1表示要求区间 [ l , r ] [l,r] [l,r]内所有数的和

o p = 2 op=2 op=2时,给定 x x x,并将区间 [ l , r ] [l,r] [l,r]所有数异或上 x x x

1 ≤ n ≤ 1 0 5 , 1 ≤ m ≤ 5 × 1 0 4 , 1 ≤ x , a i ≤ 1 0 6 1\le n\le 10^5,\ 1\le m\le 5\times10^4,\ 1\le x,a_i\le 10^6 1n105, 1m5×104, 1x,ai106

思路

对比上一题,本题将 0 0 0 1 1 1的序列推广到 [ 1 , 1 0 6 ] [1,10^6] [1,106],大了不少。

但能否和上一题产生关联呢?

当然是可以的!可以考虑用 0 , 1 0,1 0,1表示序列中每个数的二进制,因为 1 ≤ a i ≤ 1 0 6 1\le a_i\le 10^6 1ai106,所以二进制最多有 ⌈ log ⁡ 2 1 0 6 ⌉ = 20 \left \lceil \log_2{10^6} \right \rceil =20 log2106=20位。可以开 20 20 20棵线段树来维护 20 20 20个进制位,做法和上一题大差不差了。

修改的时候如果 x x x与当前第 i i i位的“基底” 2 i 2^i 2i作且操作,即 x a n d 2 i = 0 x\ and\ 2^i =0 x and 2i=0时,那就无需对这一位更新,因为异或 0 0 0相当于不用异或。

最后预处理 2 2 2的幂,然后逐位相加就能得到查询的答案。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls u<<1
#define rs u<<1|1
const int N=1e5+9,M=20;
int n,m,a[N];
int _2[M];
void init()
{_2[0]=1;for(int i=1;i<M;i++)_2[i]=_2[i-1]*2;
}
struct SegT
{struct node{ll sum;int tag;}T[N<<2];void pushup(int u){T[u].sum=T[ls].sum+T[rs].sum;}void pushdown(int u,int l,int r){if(T[u].tag){int mid=(l+r)>>1;T[ls].sum=(mid-l+1)-T[ls].sum;T[rs].sum=(r-mid)-T[rs].sum;T[ls].tag^=T[u].tag;T[rs].tag^=T[u].tag;T[u].tag=0;}}void build(int u,int l,int r,int ws){if(l==r){T[u].sum=(ll)(a[l]&_2[ws]?1:0);return;}int mid=(l+r)>>1;build(ls,l,mid,ws);build(rs,mid+1,r,ws);pushup(u);}void modify(int u,int l,int r,int ql,int qr){if(qr<l||r<ql)return;if(ql<=l&&r<=qr){T[u].sum=(ll)(r-l+1)-T[u].sum;T[u].tag^=1;return;}pushdown(u,l,r);int mid=(l+r)>>1;if(ql<=mid)modify(ls,l,mid,ql,qr);if(qr>mid)modify(rs,mid+1,r,ql,qr);pushup(u);}ll query(int u,int l,int r,int ql,int qr){if(qr<l||r<ql)return 0;if(ql<=l&&r<=qr)return T[u].sum;pushdown(u,l,r);int mid=(l+r)>>1;ll ret=0;if(ql<=mid)ret+=(ll)query(ls,l,mid,ql,qr);if(qr>mid)ret+=(ll)query(rs,mid+1,r,ql,qr);return ret;}
}A[M];
int main()
{init();scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=0;i<M;i++)A[i].build(1,1,n,i);scanf("%d",&m);while(m--){int op,l,r;scanf("%d%d%d",&op,&l,&r);if(op==1){ll ans=0;for(int i=0;i<M;i++)ans+=1ll*_2[i]*A[i].query(1,1,n,l,r);printf("%lld\n",ans);}else {int x;scanf("%d",&x);for(int i=0;i<M;i++)if(x&_2[i])A[i].modify(1,1,n,l,r);}}return 0;
}
http://www.yayakq.cn/news/80344/

相关文章:

  • 烟台网站建设方案报价婚庆5个坑
  • 企业自建网站的优势wordpress网址
  • 为企业规划网站注意什么深圳it外包服务公司
  • 一个网站可以有几个关键词建设公司网站需要多少天
  • 安徽六安瓜片是什么茶seo优化有哪些
  • 做中国最专业的健康门户网站网站建设公司网站建设公司
  • 兰州网站建设 冰雨wordpress登陆可见
  • 扁平式的网站淄博周村网站建设方案
  • 怎么买网站淄博网站建设乐达
  • 自己做网站上传视频长沙现在可以自由进出吗
  • pc蛋蛋网站怎么做网站建设工具的实验心得
  • 保定网站制作计划地方网站怎么做挣钱
  • 唐山公司做网站各大网站查重率比较
  • 网上平面设计泰安seo网络公司
  • 网站备案要注意什么专业客户管理系统
  • asp.net 4.0网站开发潍坊网站外包
  • 云南省建设厅一级建造师网站湘潭网站定制
  • 汕头网站建设套餐试玩网站开发
  • 自主建站网站平台wordpress页面标题居中
  • 区域推广网站男科医院哪家好一些
  • 电视台网站模版百度seo权重
  • 口碑好的网站建设雅淇wordpress
  • 网站制作方案怎么做域名如何绑定网站
  • 网站学什么有谁帮做网站
  • 北京门户网站有哪些网站开发 卡片
  • wordpress 注销泉州做网站优化公司
  • 建站平台一键申请三方支付通道企业内部网站开发
  • 专业网站优化电话贵州省建设厅门户网站
  • 自己制作手机网站公司起名字推荐
  • 徐州模板自助建站wordpress伪静态化