题意:

有一个正方形区域,

要求支持两个操作:

1、放置三角形,给定放置方向(有4个方向,直角边与坐标轴平行),直角顶点坐标,边长

2、查询一个点被覆盖了多少次

1<=正方形区域边长n<=5000

1<=询问数<=10^5

保证输入合法,三角形被正方形区域完全包含。

题解:

嗯这是一道数据结构题…

一开始我想起来之前做过但没做出来的一道三角形修改三角形查询的分块题…

然后…GEOTCBRL说,是k-d tree呀,CF上面有标程代码长度限制的…

然而我并不会用k-d tree做这个…

于是想起来ACM2015合肥区现场赛的一道题The Shields…

这题可以用和那题类似的方法解决。

树状数组套树状数组(改段求点型)

可以采用三个这样的嵌套树状数组,维护以下信息:

1、矩形区域的值

2、直角朝向左下的三角形区域的值

3、直角朝向左上的三角形区域的值

有了这三种信息就可以很容易的容斥出任意一个方向的三角形区域的值

(用有公共锐角的两个相似的三角形区域相减得到一个直角梯形区域)

(然后和矩形区域作差可以得到三角形区域)

如何实现维护三角形的树状数组?

我们知道树状数组维护的是一种“前缀和”,

那么我们只要把求前缀和的坐标进行一下变换就可以了。

具体来说,

树状数组1:把点映射到(i,j)的前缀和

树状数组2:把点映射到(-i,i+j)的前缀和

树状数组3:把点映射到(i,j-i)的前缀和

然后用相同的办法就可以处理了。

然后因为我为了处理方便,把索引可能出现坐标的位置都平移到正整数位置,所以树状数组开多了几倍。

于是空间有点紧。这题可以离线下来对三个树状数组分别统计答案,同一时刻就只需要一个树状数组了。

(难得地一次AC…在CF上跑得还是第二快的…十分高兴w)

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lb(x) ((x)&(-(x)))
using namespace std;
inline int read()
{
int s = ; char c; while((c=getchar())<'0'||c>'9');
do{s=s*+c-'0';}while((c=getchar())>='0'&&c<='9');
return s;
}
const int N = , NQ = ;
int n,n3,tot,ans[NQ],dra[NQ],tia[NQ],tja[NQ],lena[NQ];
bool isc[NQ],is2[NQ];
struct tra
{
int a[N*];
void add(int p,int v){ while(p>) a[p]+=v, p-=lb(p); }
int query(int p){ int s=; while(p<=n3) s+=a[p], p+=lb(p); return s; }
};
struct trb
{
tra a[N];
void add(int p,int p2,int v){ while(p>) a[p].add(p2,v), p-=lb(p); }
int query(int p,int p2){ int s=; while(p<=n) s+=a[p].query(p2), p+=lb(p); return s; }
}tr;
int main()
{
int i,j,Q;
n = read(), n3 = n*, Q = read();
for(i=;i<=Q;i++)
{
if(isc[i]=(read()&)) dra[i] = read(), tja[i] = read(), tia[i] = read(), lena[i] = read()+;
else tja[i] = read(), tia[i] = read();
}
for(i=;i<=Q;i++)
{
if(isc[i])
{
int dr = dra[i], ti = tia[i], tj = tja[i], len = lena[i];
int ti1,tj1,ti2,tj2,v1,v2;
switch(dr)
{
case : ti1=ti+len-,tj1=tj-,v1=-; ti2=ti-,tj2=tj-,v2=; break;
case : ti1=ti,tj1=tj-,v1=-; ti2=ti-len,tj2=tj-,v2=; break;
case : ti1=ti+len-,tj1=tj,v1=; ti2=ti-,tj2=tj,v2=-; break;
case : ti1=ti,tj1=tj,v1=; ti2=ti-len,tj2=tj,v2=-; break;
}
tr.add(ti1,tj1+n,v1);
tr.add(ti2,tj2+n,v2);
}
else ans[i] += tr.query(tia[i],tja[i]+n);
}
memset(tr.a,,sizeof tr.a);
for(i=;i<=Q;i++)
{
if(isc[i])
{
int dr = dra[i], ti = tia[i], tj = tja[i], len = lena[i];
int ti1,tj1,ti2,tj2,v1,v2;
switch(dr)
{
case : ti1=ti,tj1=tj+len-,v1=; ti2=ti+len,tj2=tj-,v2=-; break;
case : ti1=ti+,tj1=tj-len-,v1=; ti2=ti-len+,tj2=tj-,v2=-; break;
default: continue;
}
tr.add(n-ti1+,ti1+tj1,v1);
tr.add(n-ti2+,ti2+tj2,v2);
}
else ans[i] += tr.query(n-tia[i]+,tia[i]+tja[i]);
}
memset(tr.a,,sizeof tr.a);
for(i=;i<=Q;i++)
{
if(isc[i])
{
int dr = dra[i], ti = tia[i], tj = tja[i], len = lena[i];
int ti1,tj1,ti2,tj2,v1,v2;
switch(dr)
{
case : ti1=ti,tj1=tj+len-,v1=; ti2=ti-len,tj2=tj-,v2=-; break;
case : ti1=ti+len-,tj1=tj-,v1=-; ti2=ti-,tj2=tj-len-,v2=; break;
default: continue;
}
tr.add(ti1,tj1-ti1+n,v1);
tr.add(ti2,tj2-ti2+n,v2);
}
else ans[i] += tr.query(tia[i],tja[i]-tia[i]+n);
}
for(i=;i<=Q;i++) if(!isc[i]) printf("%d\n",ans[i]);
return ;
}

Bubble Cup 8 finals I. Robots protection (575I)的更多相关文章

  1. Bubble Cup 11 - Finals [Online Mirror, Div. 1]题解 【待补】

    Bubble Cup 11 - Finals [Online Mirror, Div. 1] 一场很好玩的题啊! I. Palindrome Pairs 枚举哪种字符出现奇数次. G. AI robo ...

  2. Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1

    Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1 C. Jumping Transformers 我会状压 DP! 用 \(dp[x][y][ ...

  3. codeforce1046 Bubble Cup 11 - Finals 题解

    比赛的时候开G开了3h结果rose说一句那唯一一个AC的是羊的心态就崩了.. 这套题感觉质量挺好然后就back了下 A: AI robots 有三个限制条件:相互能够看见和智商的差.使用主席树,可以维 ...

  4. Bubble Cup 8 finals H. Bots (575H)

    题意: 简单来说就是生成一棵树,要求根到每个叶子节点上的路径颜色排列不同, 且每条根到叶子的路径恰有n条蓝边和n条红边. 求生成的树的节点个数. 1<=n<=10^6 题解: 简单计数. ...

  5. Bubble Cup 8 finals G. Run for beer (575G)

    题意: 给定一个带权无向图,每条边的代价为边权/当前速度,每次到达一个新节点,速度都会除以10. 求0号点到n-1号点的最小代价,如果多解输出点数最少的解,输出代价.路径点数.路径经过的点. 1< ...

  6. Bubble Cup 8 finals F. Bulbo (575F)

    题意: 给定初始位置,查询n次区间,每次查询前可以花费移动距离的代价来移动, 查询时需要花费当前位置到区间内最近的点的距离,求最小代价. 1<=n<=5000,1<=所有位置< ...

  7. Bubble Cup 8 finals E. Spectator Riots (575E)

    题意: 一个长宽是100000单位的球场上有很多暴动的观众,每个观众都有一个速度v, 在一秒内,观众会等概率地移动到与原位置的曼哈顿距离<=v的地方(不会移动到界外). 你需要选取三个位置,这三 ...

  8. Bubble Cup 8 finals D. Tablecity (575D)

    题意: (无输入,纯输出题) 一个城市用1000列2行的格子表示,一个小偷藏在城市的某一处. 在每一小时的开始, 在(X, Y)位置的小偷可以移动到 (X - 1, Y), (X + 1, Y),(X ...

  9. Bubble Cup 8 finals C. Party (575C)

    题意: 给定n个人,分两天晚上去夜总会开派对,要求每天恰好有n/2个人去,且每人去的夜总会各不相同. 每个人对不同的晚上不同的夜总会有不同的满意度,求一个方案使得所有人的满意度之和最大. 夜总会数量= ...

随机推荐

  1. mysq l错误Table ‘./mysql/proc’ is marked as crashed and should be repaired

    续上一篇,解决了上一篇中的问题后,启动成功,但是在数据库中操作会存在一些问题,一些操作报一下异常: Table './mysql/proc' is marked as crashed and shou ...

  2. Hadoop分布式系统的安装部署

    1.关于虚拟机的复制 新建一台虚拟机,系统为CentOS7,再克隆两台,组成一个三台机器的小集群.正常情况下一般需要五台机器(一个Name节点,一个SecondName节点,三个Data节点.) 此外 ...

  3. SQL Server附加数据库报错:无法打开物理文件,操作系统错误5

    问题描述:      附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf ...

  4. WinXP/Win7/Win8本地用户配置文件迁移至域用户

    一.概述 最近在进行加域的工作,PC大部分是Win7,使用过微软USMT 4.0和5.0工具进行迁移,但命令行报错,目前还没找到好的文章研究. 本文迁移方法很特殊,利用的是Windows默认配置文件. ...

  5. [数据分析]excel带名称的四象限散点图制作

    本文前言:方法来至Excel图表之道这本数,偶然看到,好久没出数据分析的文章了,也难怪最近几个月都忙作网页,数据分析自己也就用excell和sql 正文: 带象限的散点图效果如下: 看到图片,这里制作 ...

  6. hdu4059 The Boss on Mars(差分+容斥原理)

    题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设  则    为一阶差分. 二阶差分: n阶差分:     且可推出    性质: 1. ...

  7. Java动态代理

    代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

  8. November 1st 2016 Week 45th Tuesday

    Difficult circumstances serve as a textbook of life for people. 艰难坎坷是人们的生活教科书. It would be better if ...

  9. docker学习(1) 安装

    docker是啥就不多讲了,简言之就是更轻量.更牛叉的新一代虚拟机技术.下面是安装步骤: 一.mac/windows平台的安装 docker是在linux内核基础上发展而来的,无法直接运行在mac/w ...

  10. WPF简单模拟QQ登录背景动画

    介绍 之所以说是简单模拟,是因为我不知道QQ登录背景动画是怎么实现的.这里是通过一些办法把它简化了,做成了类似的效果 效果图 大体思路 首先把背景看成是一个4行8列的点的阵距,X轴Y轴都是距离70.把 ...