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=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
const int M=;
int n,len;
int mod;
struct node{
int x,y1,y2;
}p[N];
int cnt;
int co[+];
struct at{
int f[*M][*M];
void add(int x,int y,int c){
//swap(x,y);
while(x<){
int tmp=y;
while(tmp<){
f[x][tmp]+=c;
tmp+=tmp&(-tmp);
}
x+=x&(-x);
}
}
int query(int x,int y){
//swap(x,y);
if(x<||y<) return ;
++x,++y;
if(x>=*len) x=*len;
if(y>=*len) y=*len;
int ret=;
// 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==){
int ret=t1.query(x2,y2)+t1.query(x1-,y1-)-t1.query(x1-,y2)-t1.query(x2,y1-);
// cout<<" ret "<<ret<<endl;
return ret;
}else{
int ret=t2.query(x2,y2)+t2.query(x1-,y1-)-t2.query(x1-,y2)-t2.query(x2,y1-);
// 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,*len,)+get(,t+l-mod,t+r-mod-d,*len,)
+get(t-r,l-t+mod,t-,*len,)+get(t-r+mod+d,l-t,mod-,*len,);
}
int main(){
rd(n);rd(len);
int op,t,c,l,r,d;
mod=*len;
while(n--){
rd(op);
if(op==){
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+,p[cnt].y1+,);
t2.add(p[cnt].x+,p[cnt].y2+,);
}else if(op==){
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+,p[co[c]].y1+,-);
t2.add(p[co[c]].x+,p[co[c]].y2+,-);
co[c]=;
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/1/8 14:12:04
*/

转化还是鬼斧神工

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

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

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

[NOI2008]糖果雨的更多相关文章

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

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

  2. [bzoj1062] [NOI2008]糖果雨

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

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

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

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

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

  5. bzoj1062【Noi2008】糖果雨

    orz.....神tm数形结合题 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1062 插入线段,删除线段,查询区间内线段个数,线段随时间往复 ...

  6. BZOJ 1062 糖果雨

    http://www.lydsy.com/JudgeOnline/problem.php?id=1062 思路:找到平行四边形以后,变换坐标:y->y-kx,k为斜率,这样变成了矩形,然后只要二 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. bzoj 1061~1065【Noi2008】解题报告

    这次Noi好像格外喜欢树形DpQAQ P.S.好像这次的题都与图有关QAQ bzoj1061[Noi2008]志愿者招募:上下界可行最小费用流 bzoj1062[Noi2008]糖果雨:数形结合&am ...

  9. 【FINAL】NOI

    我就是复习一下..根本就不是什么题解...谁也看不懂的... NOI2007 社交网络         最短路 货币兑换         斜率优化动态规划 项链工厂         线段树 生成树计数 ...

随机推荐

  1. nexus实现从windows迁移至Linux平台

    说明: 由于老环境是在本地windows 2008 R2里面搭建的nexus,前面搭建了jenkins,需要将maven私库迁移至云服务器的CentOS 7系统下,之前没做过nexus的迁移,在网上看 ...

  2. Unity编辑器扩展chapter1

    Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...

  3. HIVE中的数据怎么导出到hdfs或本地呢

    思路一:重定向 在我不知道工具 ,也不熟悉HIQL语法的情况下,没办法了,只有选择一个最简单粗暴的方法,重定向. 在shell中使用 hive -e 可以在shell中执行hive命令,hive -f ...

  4. Vue 项目在其他电脑 npm run dev 运行报错的解决方法

    一个 Vue 项目从一台电脑上传到 github 上之后,再另外一台电脑上 git clone .并使用 npm run dev 或 npm run start 发生以下报错的解决方法.   报错原因 ...

  5. Linux内核学习笔记(6)-- 进程优先级详解(prio、static_prio、normal_prio、rt_priority)

    Linux 中采用了两种不同的优先级范围,一种是 nice 值,一种是实时优先级.在上一篇粗略的说了一下 nice 值和实时优先级,仍有不少疑问,本文来详细说明一下进程优先级.linux 内核版本为 ...

  6. 最大公共子串:DP

    标题:最大公共子串 最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc",可以找 ...

  7. mysql查看锁表与解锁

    查看锁表语句 show OPEN TABLES where In_use > 0; 找到锁表的进程 show processlist;  删除锁表进程 kill 51045123;

  8. mysql优化建议21条

    转自: http://blog.csdn.net/waferleo/article/details/7179009 今 天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于 ...

  9. 关于css文字的扩展

    1.不换行: .title{ white-space:nowrap; text-overflow:ellipsis; } 2.超出变三点 .title{ white-space:nowrap; tex ...

  10. 谈谈javascript中的变量提升还有函数提升

    在很多面试题中,经常会看到关于变量提升,还有函数提升的题目,所以我就写一篇自己理解之后的随笔,方便之后的查阅和复习. 首先举个例子 foo();//undefined function foo(){ ...