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. Windows下使用Python的Curses库时 No module named _curses问题

    这个问题产生的 根本原因 是 curses 库不支持 windows.所以我们在下载完成python后(python 是自带 curses 库的),虽然在  python目录\Lib  中可以看到 c ...

  2. ESP8266 station模式下建立client、server TCP连接

    程序实现内容: 1.在station模式下,ESP8266作为client.server进行TCP连接2.实现数据的发送.接收(同时回传)实现思路:TCP网络通信分层为:应用层.网络层.数据链路层.物 ...

  3. selenium,unittest——下拉菜单操作,百度账号设置修改

    #encoding=utf-8from selenium import webdriverimport time,unittest, re,sysfrom HTMLTestRunner import ...

  4. Jenkins+git+Nginx

    1.Jenkins 一.tomcat安装 1.下载JDK和Tomcat //通过wget下载 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomca ...

  5. 英特尔® 实感™ 深度摄像头代码示例 – R200 摄像头数据流

    英特尔开发人员专区原文地址 简介 该可下载代码示例展示了如何使用面向 Windows 的英特尔® 实感™ SDK* 捕捉和查看用 C#/XAML 编写的原始 R200 摄像头数据流. Visual S ...

  6. Debian 给非 ROOT 用户添加 sudoer 权限

    问题描述 从官方镜像安装的 Debian 9 (Stretch)比较纯净,但因此需要自己安装.配置许多常用的 Linux 应用,这里就需要 sudo (super user do)临时获取 root ...

  7. ES6的新特性(16)——Generator 函数的语法

    Generator 函数的语法 简介 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generator 函数的语法和 API,它的 ...

  8. Traffic Steering for Service Function Chaining

    Introduction 目前通过vlan标签来把流量引向对应的sfc 以前的sfc静态(SFs相邻组成SFC),有了sdn之后具有动态性.(SFs不需要彼此相邻.将流量动态地导向所需的SFs.) 流 ...

  9. n元一维向量向左循环移位i的几种算法

    1.最简单的算法借助于一个n元的中间向量在n步时间内完成 时间复杂度:O(n)  空间复杂度O(n) void shift_easy(int arr[], int _arr[], int n, int ...

  10. rfid工作原理

    RFID的工作原理是:标签进入磁场后,如果接收到阅读器发出的特殊射频信号,就能凭借感应电流所获得的能量发送出存储在芯片中的产品信息(即Passive Tag,无源标签或被动标签),或者主动发送某一频率 ...