[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;
}

最新文章

  1. [转]&lt;jsp:include&gt;和&lt;%@include%&gt;的区别
  2. lumen 构建api(dingo api)
  3. 正则表达式匹配/data/misc/wifi/wpa_supplicant.conf的WiFi名称与密码
  4. python核心编程学习记录之错误与异常
  5. xml装php数组
  6. 用list&lt;类&gt;集合接收一个网址返回的一个类的集合的XML
  7. 网页frame引入实现全屏滚动,使用jquery实现浏览器兼容
  8. cf B. Inna and Nine
  9. 深度分析 Java 的 ClassLoader 机制(源码级别)(转)
  10. Select In SQL Server-Cross Instance in same domain and different domain
  11. Laptop Ubuntu16.04/14.04 安装Nvidia显卡驱动
  12. Python可视化:Seaborn库热力图使用进阶
  13. Javascript之学习笔记每日更新
  14. Python爬虫(九)_非结构化数据与结构化数据
  15. shell入门之流程控制语句
  16. android分包方案
  17. [Luogu P2966][BZOJ 1774][USACO09DEC]牛收费路径Cow Toll Paths
  18. android基础----&gt;XMl数据的解析
  19. MySQL transaction
  20. 远程主动读取数据 RFC_READ_TABLE

热门文章

  1. 让django完成翻译,迁移数据库模型
  2. packettotal.com - PacketTotal - A Free Online PCAP Analysis Engine
  3. C/C++协程的实现方式总结
  4. MySQL记录_20160919
  5. hdu3739 Anti LIS[最小割]
  6. ACM学习历程—HDU4717 The Moving Points(模拟退火 || 三分法)
  7. 高性能的序列化与反序列化:kryo的简单使用
  8. [转]Javascript高性能动画与页面渲染
  9. Codeplus2017 11月赛T3——基因
  10. PowerShell 总结