神题啊!干了一年才AC

首先由于各个操作的时间严格上升,因此在某此操作中,还没被删除的云朵是可以是为永久存在的;这样,又由于云的运动速度大小相同,即周期都为2len,将云的左端点一个周期的往返运动画在T(ime)-P(osition)图象上,类似下图中的蓝线;而红线即为云朵右端的图像。

(图片来源@_rqy,侵删)

对于一个云朵Ci=(T,colour,L,R,d),暴力模拟求出它的宽度、在0时刻(时间摸2len意义下)左端的位置及此时的运动方向,这样就能确定对应的左右折线,称他们为折线Bi、Ri。

对于询问Qi=(T,L,R),可以看作求与线段(L,T)-(R,T)相交的不同云朵的折线数量。即sigma i [Bi或Ri与询问线段相交]的值,这可以更优美地表达为(sigma i [Ri包含点(R,T)或者在点(R,T)左边])-(sigma i [Bi在点(L,T)左边])。

所有时刻为正整数,涉及的所有点都为整点,可知式子的前后部分同质,即核心是求在包含某点或在某点左边的折线的数目。直接处理并不好做,可以考虑把坐标系旋转+平移,使得所有的折线段垂直或平行于坐标轴。例如

“在左边”变成了“在下边”,变得方便维护了,一个二维前缀和的形式。但我不清楚为什么有人单独维护R折线时,只用到了3*len的长宽,这应该是能被卡的。

#include <bits/stdc++.h>
#define pt pair<int,int>
#define mpt make_pair
using namespace std;const int N=2e5+5;
const int LEN=1e3+5;int n,len;
int L[N],R[N],D[N];
int bit[2][4*LEN][4*LEN];
int sum(int cur,pt p,int w=0) {auto bit=::bit[cur];for(int x=p.first; ; x-=x&-x) {for(int y=p.second; y>0; y-=y&-y) w+=bit[x][y];w+=bit[x][0];if(!x) break;} return w;
}
void add(int cur,pt p,int w) {auto bit=::bit[cur];for(int x=p.first; x<=4*len; x+=x&-x) {for(int y=p.second; y<=4*len; y+=y&-y) {bit[x][y]+=w; if(!y) break;} if(!x) break;}
}
#define DIRECT if(l==0) d=1; if(l==len) d=-1;
pt rotate(int x,int y) {return mpt(x-y+2*len,x+y);}int main() {scanf("%d%d",&n,&len);for(int opt,T,c,l,r,d,s; n--; ) {scanf("%d%d",&opt,&T); T%=2*len;if(opt==1) {scanf("%d%d%d%d",&c,&l,&r,&d); r-=l;DIRECT;for(; T; T%=2*len) {s=min(d>0?len-l:l,2*len-T);l+=d*s; T+=s; DIRECT;}L[c]=l,R[c]=r,D[c]=d;for(s=0; T<2*len-1;) {l+=d*s; T+=s; DIRECT;if(T==0&&d==1) {add(0,rotate(l,T),1);add(1,rotate(l+r,T),1);} else if(T==2*len-1&&((l<len&&d<0)||!l)) {add(0,rotate(l,T),1);add(1,rotate(l+r,T),1);} else if(0<T&&T<2*len-1) {add(0,rotate(l,T),d);add(1,rotate(l+r,T),d);}s=min(d>0?len-l:l,2*len-1-T);}} else if(opt==2) {scanf("%d%d",&l,&r); if(l==0) printf("%d\n",sum(0,rotate(r,T)));else printf("%d\n",sum(0,rotate(r,T))-sum(1,rotate(l-1,T)));} else if(opt==3) {scanf("%d",&c); l=L[c],r=R[c],d=D[c]; for(T=s=0; T<2*len-1;) {l+=d*s; T+=s; DIRECT;if(T==0&&d==1) {add(0,rotate(l,T),-1);add(1,rotate(l+r,T),-1);} else if(T==2*len-1&&((l<len&&d<0)||!l)) {add(0,rotate(l,T),-1);add(1,rotate(l+r,T),-1);} else if(0<T&&T<2*len-1) {add(0,rotate(l,T),-d);add(1,rotate(l+r,T),-d);}s=min(d>0?len-l:l,2*len-1-T);}}}return 0;
}

转载于:https://www.cnblogs.com/nosta/p/10933101.html

[NOI2008] 糖果雨相关推荐

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

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

  2. [NOI2008]糖果雨

    bzoj1062[Noi2008]糖果雨 首先给出的颜色没有用. 估计要用数据结构.而线段难以维护. 考虑把线段变成点 T是单增的. 所以询问的时候,存在的线段都可能贡献答案. 那些线段的位置如果可以 ...

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

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

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

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

  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. Vml+Dhtml:制作一个应用渐变颜色效果不错的进度条
  2. Oracle 表的访问方式(2)-----索引扫描
  3. .NET 6新特性试用 | TryGetNonEnumeratedCount
  4. 小议SqlMapConfig.xml配置文件
  5. php查找以xx结尾的的字符串单词,Javascript中查找不以XX字符结尾的单词示例代码_javascript技巧...
  6. 当一名程序员喝醉之后......
  7. Java虚拟机之装载(加载、连接、初始化)
  8. Quartz2-Quartz与tomcat集成
  9. 只要学会它,再多 Bug 也不怕
  10. python3 os模块_Python3 os.path() 模块
  11. python线程池和多线程
  12. plsqldev 乱码
  13. QTableview
  14. mongodb与mysql相比的优缺点
  15. Python 字符串
  16. 【视频】老外拍的阿里巴巴纪录片,讲述淘宝怎么打败eBay
  17. PHP根据键值,对二维数组重新进行分组
  18. 电信“青年一派”电话卡【沉默停机】解决方法
  19. 第29届奥运会中国代表团夺金榜
  20. 杂事记诗-- 读网文《穷鬼的上下两千年》有感

热门文章

  1. verilog语言使用注意事项
  2. Hadsky_v6.4.2轻论坛短信插件
  3. 解析G652,G657A,G655和G654光缆之间的区别
  4. usermod -a -G group1 user1
  5. CSS第六天-高级技巧(元素隐藏、精灵图、CSS用户界面样式、margi负值作用、CSS三角形)
  6. 学计算机的用双核CPU够吗,电脑cpu核数越多越好吗
  7. 工业镜头倍率及视场范围、焦距的计算方法
  8. 《工程伦理与学术道德》第二章习题
  9. C++Error2208:...尝试引用已删除的函数
  10. 那些年,我开发过的软件