[NOI2008]糖果雨
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]糖果雨相关推荐
- 【BZOJ 1062】 1062: [NOI2008]糖果雨 (二维树状数组)**
1062: [NOI2008]糖果雨 Description 有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成 的.更加神奇的是 ...
- [NOI2008]糖果雨——数形结合的思想
题目描述: 维护一个线段集合支持以下操作: 1. add T L R D :在T秒时加入一条L至R的线段,运动方向为D(每秒向右移动D个单位),D为1或-1. 2. ask t L R: 询问t时刻有 ...
- 【BZOJ1062】[NOI2008]糖果雨【二维树状数组】
[题目链接] 神题. [别人的题解] /* Pigonometry */ #include <cstdio> #include <algorithm>using namespa ...
- [NOI2008] 糖果雨
神题啊!干了一年才AC 首先由于各个操作的时间严格上升,因此在某此操作中,还没被删除的云朵是可以是为永久存在的:这样,又由于云的运动速度大小相同,即周期都为2len,将云的左端点一个周期的往返运动画在 ...
- bzoj 1062: [NOI2008]糖果雨
高手 /**************************************************************Problem: 1062User: lxy8584099Langu ...
- 1062: [NOI2008]糖果雨 - BZOJ
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1062 神题一个,直接讲思路了(全都是看别人的) 首先我们把一个云用一个平面上的点( ...
- bzoj1062: [NOI2008]糖果雨
又是一道神题 题解传送门:http://blog.sina.com.cn/s/blog_86942b1401015yln.html 代码完全抄袭某神,请无视掉 const int N = 1010, ...
- BZOJ 1062: [NOI2008]糖果雨(二维树状数组)
首先嘛,这道题是非同一般的恶心= = 然后首先膜拜一下CDQ大神ORZ在考场上A了这道题ORZ 这道题看到的话,我是先想把云朵化成在0s时的位置,但很容易发现这样只能单点查询而不能查询整段 结果只能膜 ...
- 【NOI2008】 糖果雨
题目描述 糖果雨 [问题描述] 有一个美丽的童话:在天空的尽头有一个"糖果国",这里大到摩天大厦,小 到小花小草都是用糖果建造而成的.更加神奇的是,天空中飘满了五颜六色的糖 果云, ...
最新文章
- #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案
- 基于AcrGIS平台实现三维场景下的积水效果动态模拟
- OpenGL Shader基本概念
- java list 循环赋值_Java List集合的坑(add方法报空指针,循环赋值时list已保存的值会改变)...
- Node.js webpack babel
- 【数字图像处理系列三】图像增强:线性、 分段线性、 对数、 反对数、 幂律(伽马)变换、直方图均衡
- [线筛五连]线筛约数个数
- 制衣软件测试自学,服装检验作业指导书.doc
- msdev.exe 应用程序错误的解决方法
- 通达OA 2011-2013 通杀GETSHELL
- 计算机硬盘大小一般都是整数,电脑硬盘怎么精准整数分区
- visio2013里画带箭头的折线连接线
- pdf怎么提取图片?职场达人都在用的两个方法分享给你。
- ORACLE11gR2安装XDB
- Pearson相关分析
- 打开组策略 计算机配置,组策略命令,小编告诉你电脑组策略怎么打开
- wx.chooseImage上传本地PC端和移动端区别
- 阳光下可读显示技术的工作原理
- CentOS 7 开机自启汇总
- 怎么关闭计算机桌面的弹窗,电脑桌面弹出的广告怎么设置关闭