[bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树
Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol
题目大意:给定两个n*m的01网格图。q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两个网格图有多少个格子不一样。
注释:$1\le n\le 5\cdot 10^4$,$1\le m\le 15$,$1\le q\le 10^4$。
想法:由于网格图的列比较少,很容易想到对每行建立一棵线段树。
然后就是线段树上维护的东西:我们考虑直接维护成对应区间中有多少不一样的格子数。
这个属性显然满足可加性。修改怎么办?
修改的时候就是再处理出第一个网格图的区间0的个数。如果赋成0信息就变成区间长度减去0的个数,如果是1信息就是区间0的个数。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 50001
#define root 1,1,n
#define ls now<<1,l,mid
#define rs now<<1|1,mid+1,r int n,m,q,res;
int ans[16][N<<2],sum[16][N][2],add[16][N<<2];
char s[N];
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
void build(int id,int now,int l,int r)
{
if(l==r)
{
ans[id][now]=sum[id][l][0]-sum[id][l-1][0];
return;
}
int mid=(l+r)>>1;
build(id,ls);
build(id,rs);
ans[id][now]=ans[id][now<<1]+ans[id][now<<1|1];
} inline void pushdown(int id,int now,int l,int r)
{
if(add[id][now]^-1)
{
int mid=(l+r)>>1;
add[id][now<<1]=add[id][now];
add[id][now<<1|1]=add[id][now];
ans[id][now<<1]=sum[id][mid][add[id][now]]-sum[id][l-1][add[id][now]];
ans[id][now<<1|1]=sum[id][r][add[id][now]]-sum[id][mid][add[id][now]];
add[id][now]=-1;
}
}
inline void update(int id,int now,int l,int r,int x,int y,int c)
{
if(x<=l&&r<=y)
{
add[id][now]=c;
ans[id][now]=sum[id][r][c]-sum[id][l-1][c];
return;
}
pushdown(id,now,l,r);
int mid=(l+r)>>1;
if(x<=mid) update(id,ls,x,y,c);
if(mid<y) update(id,rs,x,y,c);
ans[id][now]=ans[id][now<<1]+ans[id][now<<1|1];
}
int main()
{
int i,j,r1,r2,c1,c2,x;
n=rd(),m=rd(),q=rd();
for(i=1;i<=n;i++)
{
scanf("%s",s+1);
for(j=1;j<=m;j++)
{
sum[j][i][0]=sum[j][i-1][0]+(s[j]=='0');
sum[j][i][1]=sum[j][i-1][1]+(s[j]=='1');
}
}
for(i=1;i<=m;i++)build(i,root);
memset(add,-1,sizeof(add));
while(q--)
{
r1=rd(),r2=rd(),c1=rd(),c2=rd();
x=rd();
res=0;
for(i=c1;i<=c2;i++)
update(i,root,r1,r2,x);
for(i=1;i<=m;i++)res+=ans[i][1];
printf("%d\n",res);
}
return 0;
}
小结:线段树使用起来是极其灵活的哦。
[bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树的更多相关文章
- [BZOJ1582] [Usaco2009 Hol]Holiday Painting 节日画画(线段树)
传送门 线段树区间修改傻题 #include <cstdio> #include <cstring> #include <iostream> #define N 5 ...
- BZOJ_4636_蒟蒻的数列_线段树+动态开点
BZOJ_4636_蒟蒻的数列_线段树+动态开点 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将 ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
- BZOJ_2124_等差子序列_线段树+Hash
BZOJ_2124_等差子序列_线段树+Hash Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pL ...
- BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心
BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心 Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数 ...
- BZOJ_1828_[Usaco2010 Mar]balloc 农场分配_线段树
BZOJ_1828_[Usaco2010 Mar]balloc 农场分配_线段树 Description Input 第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数 ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- BZOJ_3307_雨天的尾巴_线段树合并+树上差分
BZOJ_3307_雨天的尾巴_线段树合并 Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成 所有发放后 ...
随机推荐
- 235 Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最近公共祖先
给定一棵二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 详见:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-s ...
- iOS浏览器不能打开手机QQ客服与指定用户聊天界面
这个问题是我在公司需求的时候遇到的,QQ推广工具网站获取的链接在苹果自带浏览器没法打开到聊天界面,是因为safair在打开到app store的时候把参数给丢了,app store再打开到QQ的时候就 ...
- RecylerView为item添加点击事件
RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件. 1 原理: 为Recy ...
- 如何让不同浏览器调用不同的CSS样式
如何让不同浏览器调用不同的CSS样式 由 于对W3C标准支持程度的不同,往往导致同一个CSS样式表在各种Web浏览器中的呈现大相径庭.以目前市场占有率最高的两个浏览器Microsoft Interne ...
- 个人作业Alpha项目测试
这个作业属于哪个课程 软件工程原理 这个作业要求在哪里 作业要求 团队名称 TEAMPANTHER 这个作业的目标 每个同学必须选取非自己所在团队的3个项目进行测试. 在你所测试的项目的Alpha发布 ...
- SpringBoot中如何使用jpa和jpa的相关知识总结
jpa常用的注解: 注解 解释 @Entity 声明类为实体或表. @Table 声明表名. @Basic 指定非约束明确的各个字段. @Embedded 指定类或它的值是一个可嵌入的类的实例的实体的 ...
- 浅谈java浅拷贝和深拷贝
前言:深拷贝和浅拷贝的区别是什么? 浅拷贝:被复制的对象的所有变量都含有原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之, 浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.深拷 ...
- 服务器的部署与Web项目的发布
今天给老师的服务器部署项目,这次是第二次,基于第一次的经验,这次可以说是驾轻就熟. 服务器的系统是Windows Server 2008 R2 (64位) 需要安装的软件是:jdk7.TomCat7. ...
- 折线分割平面(hdoj 2050,动态规划递推)
Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面 ...
- (C/C++学习)21.C++中返回引用和返回对象以及传引用和传对象问题
说明:在学习和编写C++代码时,经常会遇到这样的问题:一个带返回值的函数,到底应该返回值呢,还是应该返回引用呢:在传递参数的时候,是应该传递参数的引用呢,还是应该传值呢?请看下面代码: void my ...