orz.....神tm数形结合题

题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1062

   

   插入线段,删除线段,查询区间内线段个数,线段随时间往复运动

sol:  线段肯定没法操作,考虑把线段化成点

   首先显然因为2*len是一个周期,所以t%=2*len

   因为线段有一个初始位置l,考虑将线段移动至l=0的位置,用时间和长度表示该线段

   

   插入一个点时,该点的坐标为((t-l*d)%len,r-l)

   删除一个点时,直接删除即可

   对于查询操作,t时刻与[l,r]有交的线段如下图

   

   先画出t=0时的图像,左右沿x=len对称,再右移t个单位,超过右边界的补到左边

   ....这样奇怪的图形也没法处理QAQ不过可以将其补成平行四边形

   

   还是比较难搞QAQ,然而可以通过扭曲坐标系将其化成矩形

   <len的点横坐标仍为t,纵坐标为Pi+t

   >len的点横坐标仍为t,纵坐标为Pi﹣t+2*len(为保证坐标非负)

   

   唔....然后就是平面加点,删点,查询子矩阵和QwQ用二维树状数组维护即可

   各种细节在代码里有注释

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int Mx=;
struct Node { int x,y1,y2; } str[Mx];
int q,len,k,t,map[][][];//因为有两种斜率,所以每个点需要记2次
inline int lowbit(int x) { return x&(-x); }
inline void add(int c,int det)//因为树状数组不能访问0下标,需要右移一位
{
for(int i=str[c].x+;i<;i+=lowbit(i))
{
for(int j=str[c].y1+;j<;j+=lowbit(j)) map[][i][j]+=det;
for(int j=str[c].y2+;j<;j+=lowbit(j)) map[][i][j]+=det;
}
}
inline int sum(int x,int y,int jud)
{
if(x<||y<) return ; x++;y++;//下标右移
if(x>*len) x=(*len)+;
if(y>*len) y=(*len)+;
int tmp=;
for(int i=x;i>;i-=lowbit(i))
for(int j=y;j>;j-=lowbit(j))
tmp+=map[jud][i][j];
return tmp;
}
inline int area(int jud,int x1,int y1,int x2,int y2)
{
return sum(x2,y2,jud)+sum(x1-,y1-,jud)-sum(x1-,y2,jud)-sum(x2,y1-,jud);
//考虑下标超过2*len时要补到左边
}
inline int solve(int t,int l,int r)
{
int d=(r==len);//如果区间右端点为len则在直线y=len上的点只能被计算一次
return area(,t,l+t,t+r,*len)+area(,,l+t-*len,t+r-*len-d,*len)+
area(,*len-r+t+d,l-t,*len,*len)+area(,t-r,l-t+*len,t-,*len);
}
int main()
{
scanf("%d%d",&q,&len);
while(q--)
{
scanf("%d%d",&k,&t);
if(k==)
{
int l,r,c,d;scanf("%d%d%d%d",&c,&l,&r,&d);
str[c].x=(t+(*len)-(l*d))%(*len);//2*len为一个周期
str[c].y1=r-l+str[c].x;
str[c].y2=r-l-str[c].x+(*len);//为避免下标为负所以上移2*len个单位
add(c,);//加点视为单点+1
}
else if(k==)
{
int l,r;scanf("%d%d",&l,&r);
printf("%d\n",solve(t%(*len),l,r));
}
else
{
int c;scanf("%d",&c);
add(c,-);//删点视为单点-1
}
}
return ;
}

bzoj1062【Noi2008】糖果雨的更多相关文章

  1. [bzoj1062] [NOI2008]糖果雨

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

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

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

  3. [NOI2008]糖果雨

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

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

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

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

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

  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. 第一篇 HTML基础

    浏览网页,就是上网,上网的本质就是下载内容. 浏览器是个解释器,用来执行HTML.css.JS代码的. HTML,CSS, JavaScript 号称网络三剑客. 1. 浏览器发送一个域名给服务端 2 ...

  2. 一步一步图文介绍SpriteKit使用TexturePacker导出的纹理集Altas

    1.为什么要使用纹理集? 游戏是一种很耗费资源的应用,特别是在移动设备中的游戏,性能优化是非常重要的 纹理集是将多张小图合成一张大图,使用纹理集有以下优点: 1.减少内存占用,减少磁盘占用: 2.减少 ...

  3. Android开发-API指南-<permission-tree>

    <permission-tree> 英文原文:http://developer.android.com/guide/topics/manifest/permission-tree-elem ...

  4. 如何借助windows的VHD引导特性实现VHD多windows系统共存

    近期,由于一些需要,需要运行3个windows系统,具体需要如何此处略去,现将实现方式共享如下. 测试环境: HP 820 G2, 4G内存, 500G SSD硬盘 windows 7 企业版 win ...

  5. OpenPAI大规模人工智能平台安装部署文档

    环境要求: 如果需要图形界面,需要在Ubuntu系统安装,否则centos系统安装时是没有问题的(web端和命令行进行任务提交) 安装过程需要有另外一台控制端机器(注意:区别于集群所在的任何一台服务器 ...

  6. kvm虚拟化操作

    本节演示如何使用 virt-manager 启动 KVM 虚机. 首先通过命令 virt-manager 启动图形界面 # virt-manager 点上面的图标创建虚机 给虚机命名为 kvm1,这里 ...

  7. C Program进阶-数组

    (一)数组的内存布局 对于语句int a[5]; 我们明白这里定义了一个数组,数组里有5个元素,每一个元素都是int类型,我们可以用a[0],a[1]等访问数组里的元素,但是这些元素的名字就是a[0] ...

  8. Python中函数的参数-arguments

    归纳起来,Python中函数的定义形式和调用形式主要有如下几种形式: # 函数的定义形式 def func(name) # 匹配positional参数或者keyword参数 def func(nam ...

  9. Alpha发布——视频展示

    一.视频链接 http://v.youku.com/v_show/id_XMzEyODQzNzQ2MA==.html 二.视频文案说明 你是不是还在为软工作业奋笔疾书? 你是不是无法及时查看最新博客信 ...

  10. 用SC命令 添加或删除windows服务提示OpenSCManager 失败5 拒绝访问

    在安装命令行中安装  windowsOpenSCManager 失败5  的错误,原因是当前用户的权限不足,需要做的是在注册表 HKEY_LOCAL_MACHINE\Software\Microsof ...