1062: [NOI2008]糖果雨

Description

  有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成
的。更加神奇的是,天空中飘满了五颜六色的糖果云,很快糖果雨密密麻麻从天而落,红色的是草莓糖,黄色的是
柠檬糖,绿色的是薄荷糖,黑色的是巧克力糖……这时糖果国的小朋友们便会拿出大大小小的口袋来接天空中落下
的糖果,拿回去与朋友们一起分享。对糖果情有独钟的小Z憧憬着能够来到这样一个童话的国度。所谓日有所思,
夜有所梦,这天晚上小Z梦见自己来到了" 糖果国" 。他惊喜地发现,任何时候天空中所有的云朵颜色都不相同,
不同颜色的云朵在不断地落下相应颜色的糖果。更加有趣的是所有的云朵都在做着匀速往返运动,不妨想象天空是
有边界的,而所有的云朵恰好在两个边界之间做着往返运动。每一个单位时间云朵向左或向右运动一个单位,当云
朵的左界碰到天空的左界,它会改变方向向右运动;当云朵完全移出了天空的右界,它会改变方向向左运动。我们
不妨把天空想象为一个平面直角坐标系,而云朵则抽象为线段(线段可能退化为点):

如上图,不妨设天空的左界为 0 ,右界为 len 。图中共有 5 片云朵,其中标号为 1 的云朵恰好改变方向向
右运动,标号为 2 的云朵恰好改变方向向左运动。忽略云朵的纵坐标,它们在运动过程中不会相互影响。小Z发现
天空中会不断出现一些云朵(某个时刻从某个初始位置开始朝某个方向运动),而有的云朵运动到一定时刻就会从
天空中消失,而在运动的过程中糖果在不断地下落。小Z决定拿很多口袋来接糖果,口袋容量是无限的,但袋口大
小却是有限的。例如在时刻 T小Z拿一个横坐标范围为 [L,R] 的口袋来接糖果,如果[L,R]存在一个位置 x ,该位
置有某种颜色的糖果落下,则认为该口袋可接到此种颜色的糖果。极端情况下,袋口区间可能是一个点,譬如[0,0
]、[1,1],但仍然可以接到相应位置的糖果。通常可以接到的糖果总数会很大,因而小Z想知道每一次(即拿出口
袋的一瞬间)他的口袋可以接到多少种不同颜色的糖果。糖果下落的时间忽略不计。

Input

  输入第一行有两个正整数 n,len ,分别表示事件总数以及天空的“边界”。接下来 n 行每行描述一个事件
,所有的事件按照输入顺序依次发生。每行的第一个数 k(k=1,2,3)分别表示事件的类型,分别对应三种事件:
插入事件,询问事件以及删除事件。输入格式如下:

Output

  对于每一个询问事件,输出相应的一行,为该次询问的答案,即口袋可以接到多少种不同的糖果

Sample Input

10 10
1 0 10 1 3 -1
2 1 0 0
2 11 0 10
2 11 0 9
1 11 13 4 7 1
2 13 9 9
2 13 10 10
3 100 13
3 1999999999 10
1 2000000000 10 0 1 1

Sample Output

1
1
0
2
1
【样例说明】共 10 个事件,包括 3 个插入事件,5 个询问事件以及 2 个删除事件。时刻0,天空中出现一
片颜色为 10 的云朵,初始位置为 [1,3] ,方向向左。时刻1,范围为 [0,0] 的口袋可以接到颜色为 10 的糖果
(云朵位置为[0,2])。时刻11,范围为 [0,10] 的口袋可以接到颜色为 10 的糖果(云朵位置为[10,12])。时刻
11,范围为 [0,9] 的口袋不能接到颜色为 10 的糖果(云朵位置为[10,12])。时刻11,天空中出现一片颜色为 1
3 的云朵,初始位置为 [4,7],方向向右。时刻13,范围为[9,9]的口袋可以接到颜色为 10(云朵的位置为[8,10]
)和颜色为 13(云朵的位置为[6,9])两种不同的糖果。时刻13,范围为 [10,10] 的口袋仅仅可以接到颜色为 10
的一种糖果(云朵的位置为[8,10]),而不可以接到颜色为 13 的糖果(云朵的位置为[6,9])。时刻100, 颜色
为 13 的云朵从天空中消失。时刻1999999999,颜色为 10 的云朵从天空中消失。时刻2000000000,天空中又出现
一片颜色为 10 的云朵,初始位置为 [0,1] ,方向向右

HINT

对于所有的数据,N<=200000,Pi<=Len,0<=Ti<=2000000000,1<=Ci<=1000000 。数据保证 {Ti} 为非递减序列
即 T1<=T2<=…<=Tn -1<=Tn 。对于所有的插入事件,令 Pi=Ri-Li,即 Pi 表示每片云朵的长度

Source

【分析】

  果然是神题!ORZ。。CDQ考场AC。。

  http://www.cnblogs.com/xiaoxubi/p/6264278.html

  

  看了别人的代码打的,理解思路,但是分成4个部分那里还是不是很懂。。

  留坑了。。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxc 1000010
#define Maxn 1010 int n,len;
struct node
{
int x,y1,y2;
}t[Maxc]; int c[][*Maxn][*Maxn]; void add(int x,int y)
{
for(int i=t[x].x+;i<=*len;i+=i&(-i))
{
for(int j=t[x].y1+;j<=*len;j+=j&(-j)) c[][i][j]+=y;
for(int j=t[x].y2+;j<=*len;j+=j&(-j)) c[][i][j]+=y;
}
} int query(int x,int y,int nw)
{
if(x<||y<) return ;x++;y++;
if(x>*len) x=*len+;
if(y>*len) y=*len+;
int ans=;
for(int i=x;i>=;i-=i&(-i))
for(int j=y;j>=;j-=j&(-j))
ans+=c[nw][i][j];
return ans;
} int area(int nw,int x1,int y1,int x2,int y2)
{
return query(x2,y2,nw)+query(x1-,y1-,nw)-query(x1-,y2,nw)-query(x2,y1-,nw);
} void solve(int tt,int l,int r)
{
int d=(r==len);
int ans=area(,tt,l+tt,tt+r,*len)+area(,,l+tt-*len,tt+r-*len-d,*len)+
area(,*len-r+tt+d,l-tt,*len,*len)+area(,tt-r,l-tt+*len,tt-,*len);
printf("%d\n",ans);
} int main()
{
scanf("%d%d",&n,&len);
memset(c,,sizeof(c));
for(int i=;i<=n;i++)
{
int k;
scanf("%d",&k);
int tt,cc,l,r,d;
if(k==)
{
scanf("%d%d%d%d%d",&tt,&cc,&l,&r,&d);tt%=(*len);
t[cc].x=(tt-l*d+*len)%(*len);
t[cc].y1=r-l+t[cc].x;
t[cc].y2=r-l-t[cc].x+*len;
add(cc,);
}
else if(k==)
{
scanf("%d%d%d",&tt,&l,&r);tt%=(*len);
solve(tt,l,r);
}
else
{
scanf("%d%d",&tt,&cc);tt%=(*len);
add(cc,-);
}
}
return ;
}

2017-02-27 21:34:43

【BZOJ 1062】 1062: [NOI2008]糖果雨 (二维树状数组)**的更多相关文章

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

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

  2. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  3. BZOJ 1452 Count 【模板】二维树状数组

    对每种颜色开一个二维树状数组 #include<cstdio> #include<algorithm> using namespace std; ; ][maxn][maxn] ...

  4. BZOJ 2738 子矩阵第k大 | 二维树状数组 整体二分 分治

    BZOJ 2738 "矩阵乘法"(子矩阵第k大) 题意 给出一个矩阵,多次询问子矩阵中第k大的数是多少. 题解 我做这道题之前先照着这道题出了一道题,是这道题的一维版本,在这里:h ...

  5. BZOJ 1452:[JSOI2009]Count(二维树状数组)

    [JSOI2009]Count 描述 输入 输出 1 2 分析: 裸二维bit,对每个颜色建一颗bit. program count; var bit:..,..,..]of longint; a:. ...

  6. 二维树状数组 BZOJ 1452 [JSOI2009]Count

    题目链接 裸二维树状数组 #include <bits/stdc++.h> const int N = 305; struct BIT_2D { int c[105][N][N], n, ...

  7. BZOJ 1452 Count(二维树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1452 题意:给出一个数字矩阵(矩阵中任何时候的数字均为[1,100]),两种操作:(1) ...

  8. bzoj 1452: [JSOI2009]Count (二维树状数组)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1452 思路: 对每个颜色开一个二维树状数组维护就好了 实现代码: #include<b ...

  9. BZOJ 1452 Count(二维树状数组)

    大水题. 建立100个二维树状数组,总复杂度就是O(qlognlogm). # include <cstdio> # include <cstring> # include & ...

  10. bzoj 1452: [JSOI2009]Count ——二维树状数组

    escription Input Output Sample Input Sample Output 1 2 HINT ———————————————————————————————————————— ...

随机推荐

  1. 使用 WebSockets 技术的 9 个应用场景

    没有其他技术能够像WebSocket一样提供真正的双向通信,许多web开发者仍然是依赖于ajax的长轮询来实现.对Websocket缺少热情,也许是因为多年前他的安全性的脆弱,抑或者是缺少浏览器的支持 ...

  2. 【BZOJ】2631: tree LCT

    [题意]给定n个点的树,每个点初始权值为1,m次操作:1.x到y的点加值,2.断一条边并连一条边,保证仍是树,3.x到y的点乘值,4.x到y的点权值和取模.n,m<=10^5. [算法]Link ...

  3. win10本地搭建php运行环境

    一.下载搭建环境所需软件,安装顺序也要按照列表顺序安装 1.Vc2015(根据需要安装Vc2012或者Vc2015) Vc2015:https://www.microsoft.com/zh-CN/do ...

  4. mysql-connector-python取二进制字节时报错UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 0

    在储存用户密码时,我使用了hmac算法对用户密码加密,加密出来的hash值是一个二进制字节串,我把这个字节串存到mysql的password字段,password字段的数据类型是varbinary. ...

  5. 使用wifite破解路由器密码

    使用wifite破解路由器密码 发表于 2016-02-06   |   分类于 wifite  |   暂无评论  |   10次阅读 简介 wifite是一款自动化wep.wpa破解工具,不支持w ...

  6. Sublime Text2使用规则

    Sublime Text是我发现的有一好用的编辑器,它不单单只支持 python ,几乎支持目前主流的语言,快捷键丰富,可以极大的提高代码开发效率.Sublime Text 网址:http://www ...

  7. python模块之xlrd,xlwt,读写execl(xls,xlsx)

    安装xlrd,xlwt pip install xlrd xlwt xlrd读取execl [环境ipython python2.7.5] import xlrd book = xlrd.open_w ...

  8. UTF-8和GB2312互转的最简单快捷的方法

    一.如果你想把utf-8转为GB2312 1.用记事本打开源码,把<meta http-equiv="Content-Type" content="text/htm ...

  9. spring源码解析--事务篇(前篇)

    对于每一个JAVA程序员,spring应该是再熟悉不过的框架了,它的功能有多强大我就不多说了,既然他有这么强大的功能,是如何实现的呢?这个就需要从他的原理去了解,而最直接了解原理的方式莫过于源码.当然 ...

  10. 【数据挖掘基础算法】KNN最近邻分类算法

    算法简介: 通过计算待预测样本和已知分类号的训练样本之间的距离来判断该样本属于某个已知分类号的概率.并选取概率最大的分类号来作为待预测样本的分类号 懒惰分类算法,其模型的建立直到待预测实例进行预测时才 ...