测试地址:糖果雨
做法:本题需要用到数形结合+二维树状数组。
这题看上去非常没有思路,因此我们来一步一步整理一下思路。
首先,我们要发现线段的颜色互不相同,并且移动的速度相等,这就说明它们的运动是周期性的,并且周期都是2len2len2len。原先我们要用一个三元组(t,l,r)(t,l,r)(t,l,r)来表示一条线段,而发现了上面的共性之后,我们就可以用一个二元组(time,length)(time,length)(time,length)来表示一条线段,具体来说,timetimetime是指在一个周期内,线段的左端点到达000的时刻,而length" role="presentation" style="position: relative;">lengthlengthlength则是线段的长度。这样我们就可以将一条线段用一个二维平面上的点表示出来了。
接下来,考虑询问(t,l,r)(t,l,r)(t,l,r),首先将ttt对2len" role="presentation" style="position: relative;">2len2len2len取模,然后观察一条线段(time,length)(time,length)(time,length)与该询问相交的条件:t−r≤time≤t+rt−r≤time≤t+rt-r\le time\le t+r,并且length≥l−|time−t|length≥l−|time−t|length\ge l-|time-t|。我们可以在二维平面上画出一个奇怪的图形,而我们要求的就是这个图形内的点数。
然而这个奇怪的图形非常难算,我们可以把这个图形补成一些平行四边形,然而还是很难算,因此我们分两种情况,一种是往右下斜的平行四边形,一种是往右上斜的平行四边形,我们用两个扭曲的坐标系来把平行四边形扭成矩形计算,对于第一种平行四边形,进行变换(x,y)−>(x,y+x)(x,y)−>(x,y+x)(x,y)->(x,y+x)即可,而对于第二种平行四边形,进行变换(x,y)−>(x,y−x+2len)(x,y)−>(x,y−x+2len)(x,y)->(x,y-x+2len)(为了保证坐标非负所以加了2len2len2len)即可。那么我们就可以用二维树状数组来维护单点修改,子矩阵查询了,时间复杂度为O(nlog2len)O(nlog2⁡len)O(n\log^2len)。具体的求子矩阵端点的式子可以看代码。
有一点小细节要注意,当r=lenr=lenr=len时,有一条直线上的点会被重复计算,要注意去重。还有,树状数组不能处理坐标为000的情况,将所有坐标+1" role="presentation" style="position: relative;">+1+1+1即可。
以下是本人代码:

#include <bits/stdc++.h>
using namespace std;
int n,len,len2,len4;
int sum[2][4010][4010],x[1000010],y[1000010];int lowbit(int x)
{return x&(-x);
}int add(int type,int x,int y,int d)
{x++,y++;for(int i=x;i<=len2;i+=lowbit(i))for(int j=y;j<=len4;j+=lowbit(j))sum[type][i][j]+=d;
}int Sum(int type,int x,int y)
{x++,y++;if (x<=0||y<=0) return 0;if (x>len2) x=len2;if (y>len4) y=len4;int ans=0;for(int i=x;i;i-=lowbit(i))for(int j=y;j;j-=lowbit(j))ans+=sum[type][i][j];return ans;
}int calc(int type,int x1,int y1,int x2,int y2)
{return Sum(type,x2,y2)-Sum(type,x2,y1-1)-Sum(type,x1-1,y2)+Sum(type,x1-1,y1-1);
}int main()
{scanf("%d%d",&n,&len);len2=(len<<1),len4=(len<<2);for(int i=1;i<=n;i++){int op,t,c,l,r,d,ans;scanf("%d",&op);if (op==1){scanf("%d%d%d%d%d",&t,&c,&l,&r,&d);x[c]=(t-d*l+len2)%len2;y[c]=r-l;add(0,x[c],y[c]+x[c],1);add(1,x[c],y[c]-x[c]+len2,1);}if (op==2){scanf("%d%d%d",&t,&l,&r);t%=len2;ans=0;int flag=(r==len);ans+=calc(0,t,l+t,t+r,len4);ans+=calc(0,0,l+t-len2,t+r-len2-flag,len4);ans+=calc(1,t-r+len2+flag,l-t,len2,len4);ans+=calc(1,t-r,l-t+len2,t-1,len4);printf("%d\n",ans);}if (op==3){scanf("%d%d",&t,&c);add(0,x[c],y[c]+x[c],-1);add(1,x[c],y[c]-x[c]+len2,-1);}}return 0;
}

彩蛋:如果你看到了这里,告诉你一个小秘密——这是我在BZOJ上AC的第233道题目!真是个喜庆的数字……

【BZOJ1062】糖果雨(NOI2008)-数形结合+二维树状数组相关推荐

  1. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

  2. 【二维树状数组】See you~

    https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A ...

  3. HDU-4456 Crowd 二维树状数组+坐标转换

    题意:给定一个N*N的网格,现在M组操作,一种操作时改变网格上的某个单点的权值,另外一种操作是求到一点曼哈顿距离为小于等于k的所有的权值和,初始化网格所有点的权值为0. 解法:这题如果没有那些特定的条 ...

  4. hdu 1892二维树状数组

    这题我知道是用树状数组,可是好久没打树状数组了,就想用普通方法水过去~~结果--结果--水了好多方法都水不过,出题人真狠呐--我的水方法是对于每一次查询,初始化ans=(x2-x1+1)*(y2-y1 ...

  5. 海啸(二维前缀和/二维树状数组)

    链接:https://ac.nowcoder.com/acm/problem/21862 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  6. 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]

    题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...

  7. POJ2155 - Matrix(二维树状数组)

    POJ2155 - Matrix 文章目录 题目 题解: 代码 题目 给你一个二维矩阵,初始化为0,然后可以进行两次操作: C:x,y,x1,y2 对该小矩阵内的数进行取反 Q:查询某个点是0还是1 ...

  8. Hihocoer 1336 - Matrix Sum 二维树状数组

    题意 给我们个n*n的矩阵 有m个操作让我们 操作有两种 Add x y v对(x,y)上的元素加v Sum x1 y1 x2 y2 对(x1,y1)为左上角(x2,y2)为右下角的矩阵求和并mod ...

  9. 2018山东冬令营:UPC 计数问题 (二维树状数组)

    计数问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 185  解决: 51 [提交][状态][讨论版][命题人:admin] 题目描述  一个n*m的方格,初始时每个格子有一个整数权 ...

最新文章

  1. python json数据的文件读写操作
  2. 京东软件测试工程师招聘,京东商城软件测试面试经验
  3. dubbo-go v1.5.6来喽!
  4. codeforces Labyrinth
  5. 搭建springboot环境
  6. 有哪些必看的前端 JS 库?
  7. 教你在CentOS 8上安装和配置Redmine项目管理系统
  8. vue路由传参丢失问题
  9. 模因(meme)收集
  10. 计算机房用还原保护软件,“小哨兵”还原卡v9.1在机房的巧妙应用
  11. 图像处理: AlphaBlend
  12. win7局域网共享教程
  13. 清空SQL数据库日志|数据库开发|SQL|web开发|快速开发|中间件平台|方正飞鸿|ES2007|
  14. 手把手教你写网络爬虫:Web应用的漏洞检测实战篇!
  15. 《软件工程(C编码实践篇)》学习总结
  16. iapp将音量调至最大
  17. 频点换算计算器android,LTE频率频点计算器
  18. 最新电脑版微信可以刷朋友圈啦
  19. QQ 2006 正式版协议变动情况分析
  20. 基于激光雷达点云的3D目标检测算法论文总结

热门文章

  1. python智能机器人原理_人工智能和Python是什么关系?详细分析!
  2. 【Python】官方文档中文版
  3. 智能驾驶软件测试,智能驾驶实车测试系统-VDAS
  4. oracle enlisttransaction,WAS运行时抛出的两种异常,经过google找到解决方案,记录以备案...
  5. 会议oa之排座和送审
  6. R语言学习笔记之str函数
  7. Java jdt 编辑_java – 如何使用JDT以编程方式重命名方法
  8. 解决各种中文乱码问题
  9. 联想开机启动项按哪个_联想台式电脑设置第一启动的快捷键是什么
  10. 真的,你不了解石家庄。