[LOJ 2082] 「JSOI2016」炸弹攻击 2
[LOJ 2082] 「JSOI2016」炸弹攻击 2
链接
题解
枚举发射源,将发射源当做原点,对敌人和激光塔极角排序。
由于敌人纵坐标均为正,而其它点均为负,因此每两个角度差在 \(\pi\) 以内的激光塔内部的敌人的个数之和就是该发射源对答案的贡献。
用前缀和以及 \(Two Pointers\) 可以在 \(O(N)\) 的时间内统计一个发射源的贡献。
时间复杂度 \(O(N2LogN)\)。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 808
#define ll long long
using namespace std;
int D, S, T, sd[maxn << 2], st[maxn << 2], tmp[maxn << 2];
ll ans;
struct point {
int x, y;
inline void get() { scanf("%d%d", &x, &y); }
} d[maxn], s[maxn], t[maxn];
inline point operator-(point a, point b) { return (point){ a.x - b.x, a.y - b.y }; }
inline ll cm(point a, point b) { return 1ll * a.x * b.y - 1ll * a.y * b.x; }
inline bool sign(int x) {
if (x >= 0)
return 1;
return 0;
}
struct data {
point v;
bool tp;
} a[maxn << 2];
inline bool cmp(data a, data b) {
return sign(a.v.y) > sign(b.v.y) || sign(a.v.y) == sign(b.v.y) && (cm(a.v, b.v) < 0);
}
void init() {
scanf("%d", &D);
for (int i = 1; i <= D; ++i) d[i].get();
scanf("%d", &S);
for (int i = 1; i <= S; ++i) s[i].get();
scanf("%d", &T);
for (int i = 1; i <= T; ++i) t[i].get();
}
void solve() {
ans = 0;
for (int i = 1; i <= S; ++i) {
int cnt = 0;
int xxx = ans;
for (int j = 1; j <= D; ++j) a[++cnt].v = d[j] - s[i], a[cnt].tp = 0;
for (int j = 1; j <= T; ++j) a[++cnt].v = t[j] - s[i], a[cnt].tp = 1;
sort(a + 1, a + cnt + 1, cmp);
for (int j = 1; j <= cnt; ++j) a[cnt + j] = a[j];
//
for (int j = 1; j <= cnt << 1; ++j) {
sd[j] = sd[j - 1], st[j] = st[j - 1], tmp[j] = tmp[j - 1];
if (a[j].tp)
++st[j], tmp[j] += sd[j];
else
++sd[j];
}
for (int j = 1, k = 1; j <= cnt; ++j)
if (a[j].tp) {
k = max(k, j);
while ((k < (cnt << 1)) &&
(cm(a[j].v, a[k + 1].v) < 0))
++k;
ans += tmp[k] - tmp[j] -
1ll * (st[k] - st[j]) * sd[j];
}
}
printf("%lld\n", ans);
}
int main() { // freopen("1.in","r",stdin);
init();
solve();
return 0;
}
[LOJ 2082] 「JSOI2016」炸弹攻击 2的更多相关文章
- LOJ#2082. 「JSOI2016」炸弹攻击 2(计算几何+双指针)
题面 传送门 题解 我们枚举一下发射源,并把敌人和激光塔按极角排序,那么一组合法解就是两个极角之差不超过\(\pi\)且中间有敌人的三元组数,预处理一下前缀和然后用双指针就行了 //minamoto ...
- loj#2076. 「JSOI2016」炸弹攻击 模拟退火
目录 题目链接 题解 代码 题目链接 loj#2076. 「JSOI2016」炸弹攻击 题解 模拟退火 退火时,由于答案比较小,但是温度比较高 所以在算exp时最好把相差的点数乘以一个常数让选取更差的 ...
- 【LOJ】#2082. 「JSOI2016」炸弹攻击 2
题解 想到n3发现思路有点卡住了 对于每个发射塔把激光塔和敌人按照极角排序,对于一个激光塔,和它转角不超过pi的激光塔中间夹的敌人总和就是答案 记录前缀和,用two-Points扫一下就行 代码 #i ...
- LOJ#2076. 「JSOI2016」炸弹攻击(模拟退火)
题面 传送门 题解 退火就好了 记得因为答案比较小,但是温度比较高,所以在算\(\exp\)的时候最好把相差的点数乘上一个常数来让选取更劣解的概率降低 话虽如此然而我自己打的退火答案永远是\(0\)- ...
- loj#2071. 「JSOI2016」最佳团体
题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...
- 【LOJ】#2076. 「JSOI2016」炸弹攻击
题解 我冷静一下,话说如果去掉建筑和R的限制好像是模拟退火吧 然后开始写模拟退火了,起始点就随机一个敌人作为起始点 没对着数据写了一下获得了70pts,感到美滋滋 然后对着数据卡了很久--发现有个数据 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
随机推荐
- FAQrobot 聊天机器人笔记
follow: https://github.com/ofooo/FAQrobot 这是一个简单的基于问词匹配的自动问答,获取与用户问句Q1最匹配的知识库中的问句Q2,Q2的答案就是Q1的答案. 首 ...
- 媒体格式分析之flv -- 基于FFMPEG
本来是应该先写一个媒体文件格式的简单讲解的,还没来得及写,以后再写.今天就先根据ffmpeg的flv.c的flv_demux这个结构体来讲解一下当前比较流行的媒体格式flv. FLV 是FLASH V ...
- 实现PIX需要参考的标准资料
•初步了解PIX V2和V3:"IHE_ITI_TF_Rev8-0_Vol1_FT_2011-08-19"中第5章和第23章 •了解PIX V2相关事务: "IHE_IT ...
- Oracle获取日期的特定部分
(1)oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分 ,语法:extract ({ year | month | day ...
- Spring框架中的@Import、@ImportResource注解
spring@Import @Import注解在4.2之前只支持导入配置类 在4.2,@Import注解支持导入普通的java类,并将其声明成一个bean 使用场景: import注解主要用在基于ja ...
- hibernate学习五 Hibernate补充
1 MiddleGenIDE可以生成映射类和映射文件. 2
- python3 + selenium + eclipse 中报错:'geckodriver' executable needs to be in PATH
Windows系统解决办法如下: 1.下载geckodriver.exe: 下载地址:https://github.com/mozilla/geckodriver/releases 请根据系统版本选择 ...
- java的clone()的使用
clone()方法的约定 首先明确的是clone()是object的方法.Cloneable接口没有任何方法,它只起到标识的作用.(java的原型模式有用到) Cloneable接口的目的是作为对象的 ...
- pkg_resources----Entry Points为程序提供扩展点
官方文档对Entry Points的介绍 Entry Points Entry points are a simple way for distributions to "advertise ...
- WSAStartup()函数的使用
int WSAStartup( __in WORD wVersionRequested, __out LPWSADATA lpWSAData ); WSAStartup 格 式: int PASCA ...