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,rint 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;
}

小结:线段树使用起来是极其灵活的哦。

转载于:https://www.cnblogs.com/ShuraK/p/9675240.html

[bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树相关推荐

  1. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  2. 小奇画画(线段树+map)(水题)

    5725: 小奇画画 时间限制: 1 Sec  内存限制: 128 MB 提交: 632  解决: 140 [提交] [状态] [讨论版] [命题人:admin] 题目描述 红莲清泪两行欲吐半点却无 ...

  3. bzoj 4372: 烁烁的游戏 动态点分治_树链剖分_线段树

    [Submit][Status][Discuss] Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳 ...

  4. java 区间树_线段树(区间树)之区间染色和4n推导过程

    前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...

  5. BZOJ_1798__Codevs_2216_[AHOI_2009]_行星序列_(线段树)

    描述 BZOJ: http://www.lydsy.com/JudgeOnline/problem.php?id=1798 Codevs: http://codevs.cn/problem/2216/ ...

  6. 如何在vs中创建r树索引代码_线段树详解与实现

    此篇文章用于记录<玩转数据结构>课程的学习笔记 什么是线段树 线段树也被称为区间树,英文名为Segment Tree或者Interval tree,是一种高级的数据结构.这种数据结构更多出 ...

  7. 数据结构_线段树 详解+模板

  8. [计蒜客T2238]礼物_线段树_归并排序_概率期望

    礼物 题目大意: 数据范围: 题解: 这题有意思啊($md$卡常 直接做怎么做? 随便上个什么东西,维护一下矩阵乘和插入,比如说常数还算小的$KD-Tree$(反正我是没见人过过 我们漏掉了一个条件, ...

  9. c++中stringstream_文史哲与艺术中的数学_智慧树章节答案

    文史哲与艺术中的数学_智慧树章节答案更多相关问题 His mother told me that he ______ read quite well at the age of five. A) sh ...

最新文章

  1. python核心编程第三版_Python之父:自学python,这3本书能节约你一大半时间编程...
  2. python3.x获取windows自启动程序列表
  3. Process Hacker 一个系统监视工具
  4. linux malloc 线程,Linux上的侧线程的malloc/calloc崩溃
  5. cli2弃用了吗 vue_vue cli - 2 升级到 3的问题汇总
  6. java基本特性_Java面试总结之Java基础
  7. Linux下xargs命令的使用
  8. oracle延迟约束不起作用,Oracle可延迟约束Deferable的使用
  9. sap事务代码_SAP成本模块常用事务代码清单
  10. freeswitch 录音录像模块和内核
  11. listview的使用一例
  12. (转)CRC校验算法详解
  13. DirectX修复工具 4.0 标准版
  14. 计算机研究生期末汇报,研究生学期总结ppt.doc
  15. RFID固定资产管理系统是如何盘点固定资产的?
  16. 简易搭建ftp服务器
  17. 全文搜索引擎----ElasticSearch和Solr
  18. IT职场法则七条——献给正在努力奋斗的你们
  19. VVC代码学习之自定义数据结构阅读4
  20. Sentinel系列之热点限流

热门文章

  1. Oracle type (自定义类型的使用)
  2. windows安装MongoDB环境以及在pycharm中配置可视化插件
  3. Docker配置远程连接端口
  4. HBM显存技术与市场前景
  5. Camera系列规格参数
  6. Xilinx FPGA全局介绍
  7. 使用Keil语言的嵌入式C编程教程(下)
  8. 高精地图中导航标识识别
  9. Android报错:java.lang.NoClassDefFoundError: Failed resolution of: Ljava/util/Base64;如何解决
  10. 客快物流大数据项目(五十四):初始化Spark流式计算程序