bzoj1062【Noi2008】糖果雨

首先给出的颜色没有用。

估计要用数据结构。而线段难以维护。

考虑把线段变成点

T是单增的。

所以询问的时候,存在的线段都可能贡献答案。

那些线段的位置如果可以统一一下就好了。

发现线段2*len一个循环

思路:把所有的线段移动到l=0

或者说,考虑l=0的时候,时间是多少

横坐标:x=(ti-d*l)%(2*len)(这个时间仅仅为了相对关系表示方便,实际上,这个线段可能根本不会在这个时间出现,不过没有关系)

纵坐标:y=r-l

这样的好处是,线段都是从l=0向右移动了

实际上坐标是多少,就意味着距离0还有多远

(看上面博客有图)

然后对于询问的t

分成一个图形,计算点的个数

转化为平行四边形

转化为矩形

二维树状数组维护

为了避免讨论

可以直接分成四块。不合法的直接面积返回0

注意时间轴的下标是从[0,2*len-1]的

所以树状数组还要集体平移1

细节较多。边界有些恶心

r==len的时候还要特别防止一个点统计两遍。

代码:

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=200000+5;
const int M=2020;
int n,len;
int mod;
struct node{int x,y1,y2;
}p[N];
int cnt;
int co[1000000+5];
struct at{int f[2*M][4*M];void add(int x,int y,int c){//swap(x,y);while(x<2010){int tmp=y;while(tmp<4010){f[x][tmp]+=c;tmp+=tmp&(-tmp);}x+=x&(-x);}}int query(int x,int y){//swap(x,y);if(x<0||y<0) return 0;++x,++y;if(x>=2*len) x=2*len;if(y>=4*len) y=4*len;int ret=0;//    cout<<" x y "<<x<<" "<<y<<endl;while(x){int tmp=y;while(tmp){ret+=f[x][tmp];tmp-=tmp&(-tmp);}x-=x&(-x);}return ret;}
}t1,t2;
int get(int x1,int y1,int x2,int y2,int c){
//    cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<" "<<c-1<<endl;if(c==1){int ret=t1.query(x2,y2)+t1.query(x1-1,y1-1)-t1.query(x1-1,y2)-t1.query(x2,y1-1);//    cout<<" ret "<<ret<<endl;return ret;}else{int ret=t2.query(x2,y2)+t2.query(x1-1,y1-1)-t2.query(x1-1,y2)-t2.query(x2,y1-1);//    cout<<" ret "<<ret<<endl;return ret;}
}
int sol(int t,int l,int r){int d=(r==len);return get(t,t+l,t+r,4*len,1)+get(0,t+l-mod,t+r-mod-d,4*len,1)+get(t-r,l-t+mod,t-1,4*len,2)+get(t-r+mod+d,l-t,mod-1,4*len,2);
}
int main(){rd(n);rd(len);int op,t,c,l,r,d;mod=2*len;while(n--){rd(op);if(op==1){rd(t);rd(c);rd(l);rd(r);rd(d);++cnt;p[cnt].x=(t-d*l+mod)%mod;p[cnt].y1=(r-l+p[cnt].x);p[cnt].y2=(r-l-p[cnt].x+mod);//    cout<<" point "<<p[cnt].x<<" "<<p[cnt].y1<<" || "<<p[cnt].y2<<endl;co[c]=cnt;t1.add(p[cnt].x+1,p[cnt].y1+1,1);t2.add(p[cnt].x+1,p[cnt].y2+1,1);}else if(op==2){rd(t);rd(l);rd(r);t%=mod;printf("%d\n",sol(t,l,r));}else{rd(t);rd(c);t1.add(p[co[c]].x+1,p[co[c]].y1+1,-1);t2.add(p[co[c]].x+1,p[co[c]].y2+1,-1);co[c]=0;}}return 0;
}}
signed main(){Miracle::main();return 0;
}/*Author: *Miracle*Date: 2019/1/8 14:12:04
*/

转化还是鬼斧神工

方向就是抓住时间单增,统一出发位置考虑,mod意义下处理,线段变成点,方便维护。

不规则图形转化,坐标翻转。

同时避免讨论的小trick也不错。(这还是对水平要求比较高的)

转载于:https://www.cnblogs.com/Miracevin/p/10240282.html

[NOI2008]糖果雨相关推荐

  1. 【BZOJ 1062】 1062: [NOI2008]糖果雨 (二维树状数组)**

    1062: [NOI2008]糖果雨 Description 有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成 的.更加神奇的是 ...

  2. [NOI2008]糖果雨——数形结合的思想

    题目描述: 维护一个线段集合支持以下操作: 1. add T L R D :在T秒时加入一条L至R的线段,运动方向为D(每秒向右移动D个单位),D为1或-1. 2. ask t L R: 询问t时刻有 ...

  3. 【BZOJ1062】[NOI2008]糖果雨【二维树状数组】

    [题目链接] 神题. [别人的题解] /* Pigonometry */ #include <cstdio> #include <algorithm>using namespa ...

  4. [NOI2008] 糖果雨

    神题啊!干了一年才AC 首先由于各个操作的时间严格上升,因此在某此操作中,还没被删除的云朵是可以是为永久存在的:这样,又由于云的运动速度大小相同,即周期都为2len,将云的左端点一个周期的往返运动画在 ...

  5. bzoj 1062: [NOI2008]糖果雨

    高手 /**************************************************************Problem: 1062User: lxy8584099Langu ...

  6. 1062: [NOI2008]糖果雨 - BZOJ

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1062 神题一个,直接讲思路了(全都是看别人的) 首先我们把一个云用一个平面上的点( ...

  7. bzoj1062: [NOI2008]糖果雨

    又是一道神题 题解传送门:http://blog.sina.com.cn/s/blog_86942b1401015yln.html 代码完全抄袭某神,请无视掉 const int N = 1010, ...

  8. BZOJ 1062: [NOI2008]糖果雨(二维树状数组)

    首先嘛,这道题是非同一般的恶心= = 然后首先膜拜一下CDQ大神ORZ在考场上A了这道题ORZ 这道题看到的话,我是先想把云朵化成在0s时的位置,但很容易发现这样只能单点查询而不能查询整段 结果只能膜 ...

  9. 【NOI2008】 糖果雨

    题目描述 糖果雨 [问题描述] 有一个美丽的童话:在天空的尽头有一个"糖果国",这里大到摩天大厦,小 到小花小草都是用糖果建造而成的.更加神奇的是,天空中飘满了五颜六色的糖 果云, ...

最新文章

  1. #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案
  2. 基于AcrGIS平台实现三维场景下的积水效果动态模拟
  3. OpenGL Shader基本概念
  4. java list 循环赋值_Java List集合的坑(add方法报空指针,循环赋值时list已保存的值会改变)...
  5. Node.js webpack babel
  6. 【数字图像处理系列三】图像增强:线性、 分段线性、 对数、 反对数、 幂律(伽马)变换、直方图均衡
  7. [线筛五连]线筛约数个数
  8. 制衣软件测试自学,服装检验作业指导书.doc
  9. msdev.exe 应用程序错误的解决方法
  10. 通达OA 2011-2013 通杀GETSHELL
  11. 计算机硬盘大小一般都是整数,电脑硬盘怎么精准整数分区
  12. visio2013里画带箭头的折线连接线
  13. pdf怎么提取图片?职场达人都在用的两个方法分享给你。
  14. ORACLE11gR2安装XDB
  15. Pearson相关分析
  16. 打开组策略 计算机配置,组策略命令,小编告诉你电脑组策略怎么打开
  17. wx.chooseImage上传本地PC端和移动端区别
  18. 阳光下可读显示技术的工作原理
  19. CentOS 7 开机自启汇总
  20. 怎么关闭计算机桌面的弹窗,电脑桌面弹出的广告怎么设置关闭

热门文章

  1. office 2019 安装教程(图解版)
  2. 一季度出货量暴跌22%,小米手机已“师老兵疲”
  3. php rm-rf,rm-rf误操作的恢复过程
  4. win10关机后自动重启_电脑自动关机或重启的解决办法
  5. 使用set集合去除重复元素
  6. cmake的-G 参数
  7. 路由器+虚拟服务器+ssh,如何实现用SSH方式登陆路由器管理
  8. 了解mybatis源码手写mybatis
  9. 华为交换机如何批量清除接口配置信息
  10. Mysql 错误 1273 Unknown collation