博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ7259(Light Switching)
阅读量:5104 次
发布时间:2019-06-13

本文共 1369 字,大约阅读时间需要 4 分钟。

数学模型:

维持一个01序列,支持2种操作:

1、将给定区间内的数取反;

2、查询给定区间内1的个数。

这题就是“暑假集训每日一题0712”的简化版

View Code
#include 
#define N 100001int n,m,ans;int sum[4*N],rev[4*N];void update(int cur){ int ls=cur<<1,rs=cur<<1|1; sum[cur]=sum[ls]+sum[rs];}void pushdown(int cur,int x,int y){ int mid=(x+y)>>1,ls=cur<<1,rs=cur<<1|1; if(rev[cur]) { sum[ls]=mid-x+1-sum[ls]; sum[rs]=y-mid-sum[rs]; rev[ls]^=1; rev[rs]^=1; rev[cur]=0; }}void build(int cur,int x,int y){ int mid=(x+y)>>1,ls=cur<<1,rs=cur<<1|1; sum[cur]=rev[cur]=0; if(x==y) return; build(ls,x,mid); build(rs,mid+1,y);}void reverse(int cur,int x,int y,int s,int t){ int mid=(x+y)>>1,ls=cur<<1,rs=cur<<1|1; if(x>=s && y<=t) { rev[cur]^=1; sum[cur]=y-x+1-sum[cur]; return; } pushdown(cur,x,y); if(mid>=s) reverse(ls,x,mid,s,t); if(mid+1<=t) reverse(rs,mid+1,y,s,t); update(cur);}void query(int cur,int x,int y,int s,int t){ int mid=(x+y)>>1,ls=cur<<1,rs=cur<<1|1; if(x>=s && y<=t) { ans+=sum[cur]; return; } pushdown(cur,x,y); if(mid>=s) query(ls,x,mid,s,t); if(mid+1<=t) query(rs,mid+1,y,s,t);}int main(){ int i,opt,x,y; while(~scanf("%d%d",&n,&m)) { build(1,1,n); for(i=0;i

转载于:https://www.cnblogs.com/algorithms/archive/2012/07/12/2588020.html

你可能感兴趣的文章
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>
对数器的使用
查看>>
OracleOraDb11g_home1TNSListener服务启动后停止,某些服务在未由其他服务或程序使用时将自己主动停止...
查看>>
Redis用户添加、分页、登录、注册、加关注案例
查看>>
练习2
查看>>
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
MySQL表的四种分区类型
查看>>
CLR 关于强命名程序集 .
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
Loj #139
查看>>
StringBuffer是字符串缓冲区
查看>>
hihocoder1187 Divisors
查看>>
java入门
查看>>
Spring 整合 Redis
查看>>