[LOJ 2082] 「JSOI2016」炸弹攻击 2

链接

链接

题解

枚举发射源,将发射源当做原点,对敌人和激光塔极角排序。

由于敌人纵坐标均为正,而其它点均为负,因此每两个角度差在 \(\pi\) 以内的激光塔内部的敌人的个数之和就是该发射源对答案的贡献。

用前缀和以及 \(Two Pointers\) 可以在 \(O(N)\) 的时间内统计一个发射源的贡献。

时间复杂度 \(O(N2LogN)\)。

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define maxn 808
  6. #define ll long long
  7. using namespace std;
  8. int D, S, T, sd[maxn << 2], st[maxn << 2], tmp[maxn << 2];
  9. ll ans;
  10. struct point {
  11. int x, y;
  12. inline void get() { scanf("%d%d", &x, &y); }
  13. } d[maxn], s[maxn], t[maxn];
  14. inline point operator-(point a, point b) { return (point){ a.x - b.x, a.y - b.y }; }
  15. inline ll cm(point a, point b) { return 1ll * a.x * b.y - 1ll * a.y * b.x; }
  16. inline bool sign(int x) {
  17. if (x >= 0)
  18. return 1;
  19. return 0;
  20. }
  21. struct data {
  22. point v;
  23. bool tp;
  24. } a[maxn << 2];
  25. inline bool cmp(data a, data b) {
  26. return sign(a.v.y) > sign(b.v.y) || sign(a.v.y) == sign(b.v.y) && (cm(a.v, b.v) < 0);
  27. }
  28. void init() {
  29. scanf("%d", &D);
  30. for (int i = 1; i <= D; ++i) d[i].get();
  31. scanf("%d", &S);
  32. for (int i = 1; i <= S; ++i) s[i].get();
  33. scanf("%d", &T);
  34. for (int i = 1; i <= T; ++i) t[i].get();
  35. }
  36. void solve() {
  37. ans = 0;
  38. for (int i = 1; i <= S; ++i) {
  39. int cnt = 0;
  40. int xxx = ans;
  41. for (int j = 1; j <= D; ++j) a[++cnt].v = d[j] - s[i], a[cnt].tp = 0;
  42. for (int j = 1; j <= T; ++j) a[++cnt].v = t[j] - s[i], a[cnt].tp = 1;
  43. sort(a + 1, a + cnt + 1, cmp);
  44. for (int j = 1; j <= cnt; ++j) a[cnt + j] = a[j];
  45. //
  46. for (int j = 1; j <= cnt << 1; ++j) {
  47. sd[j] = sd[j - 1], st[j] = st[j - 1], tmp[j] = tmp[j - 1];
  48. if (a[j].tp)
  49. ++st[j], tmp[j] += sd[j];
  50. else
  51. ++sd[j];
  52. }
  53. for (int j = 1, k = 1; j <= cnt; ++j)
  54. if (a[j].tp) {
  55. k = max(k, j);
  56. while ((k < (cnt << 1)) &&
  57. (cm(a[j].v, a[k + 1].v) < 0))
  58. ++k;
  59. ans += tmp[k] - tmp[j] -
  60. 1ll * (st[k] - st[j]) * sd[j];
  61. }
  62. }
  63. printf("%lld\n", ans);
  64. }
  65. int main() { // freopen("1.in","r",stdin);
  66. init();
  67. solve();
  68. return 0;
  69. }

[LOJ 2082] 「JSOI2016」炸弹攻击 2的更多相关文章

  1. LOJ#2082. 「JSOI2016」炸弹攻击 2(计算几何+双指针)

    题面 传送门 题解 我们枚举一下发射源,并把敌人和激光塔按极角排序,那么一组合法解就是两个极角之差不超过\(\pi\)且中间有敌人的三元组数,预处理一下前缀和然后用双指针就行了 //minamoto ...

  2. loj#2076. 「JSOI2016」炸弹攻击 模拟退火

    目录 题目链接 题解 代码 题目链接 loj#2076. 「JSOI2016」炸弹攻击 题解 模拟退火 退火时,由于答案比较小,但是温度比较高 所以在算exp时最好把相差的点数乘以一个常数让选取更差的 ...

  3. 【LOJ】#2082. 「JSOI2016」炸弹攻击 2

    题解 想到n3发现思路有点卡住了 对于每个发射塔把激光塔和敌人按照极角排序,对于一个激光塔,和它转角不超过pi的激光塔中间夹的敌人总和就是答案 记录前缀和,用two-Points扫一下就行 代码 #i ...

  4. LOJ#2076. 「JSOI2016」炸弹攻击(模拟退火)

    题面 传送门 题解 退火就好了 记得因为答案比较小,但是温度比较高,所以在算\(\exp\)的时候最好把相差的点数乘上一个常数来让选取更劣解的概率降低 话虽如此然而我自己打的退火答案永远是\(0\)- ...

  5. loj#2071. 「JSOI2016」最佳团体

    题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...

  6. 【LOJ】#2076. 「JSOI2016」炸弹攻击

    题解 我冷静一下,话说如果去掉建筑和R的限制好像是模拟退火吧 然后开始写模拟退火了,起始点就随机一个敌人作为起始点 没对着数据写了一下获得了70pts,感到美滋滋 然后对着数据卡了很久--发现有个数据 ...

  7. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  8. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  9. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

随机推荐

  1. RQNOJ 622 最小重量机器设计问题:dp

    题目链接:https://www.rqnoj.cn/problem/622 题意: 一个机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得. w[i][j]是从供应商j处购得的部件i的重量, ...

  2. 第一节 课程简介与HTML5概述

    第一节 课程简介与HTML5概述 *********************************************************** 1.1课程简介 教学目的: 从基础入手到能够运 ...

  3. Java并发模型(一)

    学习资料来自http://ifeve.com/java-concurrency-thread-directory/ 一.多线程 进程和线程的区别: 一个程序运行至少一个进程,一个进程至少包含一个线程. ...

  4. CentOS 7编译安装Tengine+PHP+MariaDB全程笔记

    安装环境:CentOS7 3.10.0-693.5.2.el7.x86_64 准备源码包: pcre-8.41.tar.gz openssl-1.0.1h.tar.gz zlib-1.2.11.tar ...

  5. C++ 精确计时类

    http://hi.baidu.com/ronyo/blog/item/ee7e71cf7d46c338f8dc61ad .html    在一些程序中经常要统计一个算法/函数花费的时间,每次都重新写 ...

  6. linux进程学习笔记

    学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...

  7. hdfs 查看报告--命令(hdfs dfsadmin -report)

    [hadoop@master sbin]$ hdfs dfsadmin -reportConfigured Capacity: 8202977280 (7.64 GB)Present Capacity ...

  8. Codeforces 762B USB vs. PS/2 贪心

    Codeforces 762B 题目大意: 有a台只有USB接口的电脑,b台PS/2接口的电脑,c台两种接口都有的电脑.每台电脑只用装一个鼠标.给出n个鼠标及其费用,每个鼠标只能使用一遍.在最大化有鼠 ...

  9. openjudge 4116:拯救行动

    传送门 总时间限制:  1000ms 内存限制:  65536kB 描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路( ...

  10. poj3067Japan——树状数组查找逆序对

    题目:http://poj.org/problem?id=3067 利用树状数组查找逆序对. 代码如下: #include<iostream> #include<cstdio> ...