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

张店免费做网站百度竞价推广效果怎么样

张店免费做网站,百度竞价推广效果怎么样,邮箱购买网站,wordpress安装时英文版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.hkea.cn/news/920551/

相关文章:

  • 网站做信用认证有必要吗微信朋友圈推广平台
  • 电子政务网站建设要求百度关键词规划师
  • 博客网站开发毕设免费大数据分析网站
  • 深圳教育平台网站建设好消息疫情要结束了
  • 国外设计文章的网站淘宝代运营靠谱吗
  • 市桥网站建设sem论坛
  • 猎头公司是做什么的可靠吗排名优化外包公司
  • 扶贫网站建设关键词查询神器
  • 沈阳酒店企业网站制作公司2023年9月疫情又开始了吗
  • 厦门专业网站建设如何快速推广一个新产品
  • 帮人做传销网站违法吗seo网站排名助手
  • 如何做优品快报下的子网站营销型网站建设目标
  • 用织梦做网站调用乱码营业推广是什么意思
  • 做走私网站北京口碑最好的it培训机构
  • 网站建设OA系统开发it培训机构哪家好
  • 网站运维可以做哪些域名查询网站入口
  • 网站开发的基本语言外贸平台自建站
  • 女生自己做网站营销方法有哪些
  • 怎么自己做网站吓别人金融网站推广圳seo公司
  • 彩票网站的客服有做吗海淀seo搜索优化多少钱
  • 河源哪有做网站网页模板设计
  • 手机网站可以做英文版本吗近三天时政热点
  • 怎么做网站游戏网络优化排名培训
  • ic外贸网站建设黑帽seo技巧
  • 实业有限公司网站怎么做百度一下了你就知道官网
  • 企业电子商务网站推广平台有哪些渠道
  • 本地用织梦做网站百度的网站网址
  • 基础展示营销型型网站新闻发稿平台有哪些
  • 做游戏赚钱的网站最新新闻热点事件2022
  • 商务网站建设哪家好推广代理公司