bzoj1062【Noi2008】糖果雨
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】糖果雨的更多相关文章
- [bzoj1062] [NOI2008]糖果雨
Description 有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成的.更加神奇的是,天空中飘满了五颜六色的糖果云,很快糖果 ...
- 【BZOJ 1062】 1062: [NOI2008]糖果雨 (二维树状数组)**
1062: [NOI2008]糖果雨 Description 有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成的.更加神奇的是, ...
- [NOI2008]糖果雨
bzoj1062[Noi2008]糖果雨 首先给出的颜色没有用. 估计要用数据结构.而线段难以维护. 考虑把线段变成点 T是单增的. 所以询问的时候,存在的线段都可能贡献答案. 那些线段的位置如果可以 ...
- 1062: [NOI2008]糖果雨 - BZOJ
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1062 神题一个,直接讲思路了(全都是看别人的) 首先我们把一个云用一个平面上的点( ...
- BZOJ 1062: [NOI2008]糖果雨(二维树状数组)
首先嘛,这道题是非同一般的恶心= = 然后首先膜拜一下CDQ大神ORZ在考场上A了这道题ORZ 这道题看到的话,我是先想把云朵化成在0s时的位置,但很容易发现这样只能单点查询而不能查询整段 结果只能膜 ...
- BZOJ 1062 糖果雨
http://www.lydsy.com/JudgeOnline/problem.php?id=1062 思路:找到平行四边形以后,变换坐标:y->y-kx,k为斜率,这样变成了矩形,然后只要二 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj 1061~1065【Noi2008】解题报告
这次Noi好像格外喜欢树形DpQAQ P.S.好像这次的题都与图有关QAQ bzoj1061[Noi2008]志愿者招募:上下界可行最小费用流 bzoj1062[Noi2008]糖果雨:数形结合&am ...
- 【FINAL】NOI
我就是复习一下..根本就不是什么题解...谁也看不懂的... NOI2007 社交网络 最短路 货币兑换 斜率优化动态规划 项链工厂 线段树 生成树计数 ...
随机推荐
- git学习笔记(一)——从已存在的远程仓库克隆
应用场景:在公司电脑把脚本上传到公司的gitlab上,在家里想继续写: 问题: 家里的之前代码连的是github的仓库,需要把公钥替换成公司gitlab的. 环境:win10,pycharm,git ...
- 使用unittest里面的discover()方法组织测试用例
import osimport unittest directory = os.getcwd()# 测试用例的目录organize = unittest.defaultTestLoader.disco ...
- Linux命令应用大词典-第11章 Shell编程
11.1 declare:显示或设置Shell变量 11.2 export:显示或设置环境变量 11.3 set:显示和设置Shell变量 11.4 unset:删除变量或函数 11.5 env:查看 ...
- 银行系统ps:不太完善,蟹蟹评论
# 主程序运行 import time from guanli import GuanLi from atm import ATM from user import User def main(): ...
- leetcode-反转链表
转载至:https://blog.csdn.net/fx677588/article/details/72357389 反转一个单链表. 示例: 输入: 1->2->3->4 ...
- python作业:三级菜单(第一周)
一.作业需求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 二.三级菜单 ...
- LeetCode - 13. Roman to Integer - 思考if-else与switch的比较 - ( C++ ) - 解题报告
1.题目: 原题:Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range ...
- 你真的了解JAVA里的String么
Java中String类细节问题 (考察点Java内存分配问题) 1. String str1 = "abc"; System.out.println(str1 == &quo ...
- SGU 194 Reactor Cooling(无源无汇上下界可行流)
Description The terrorist group leaded by a well known international terrorist Ben Bladen is bulidin ...
- 如何在html中把一个图片或者表格覆盖在一张已有图片上的任意位置
如何在html中把一个图片或者表格覆盖在一张已有图片上的任意位置 <div style="position:relative;"> <img src=&quo ...