题解

想到n3发现思路有点卡住了

对于每个发射塔把激光塔和敌人按照极角排序,对于一个激光塔,和它转角不超过pi的激光塔中间夹的敌人总和就是答案

记录前缀和,用two-Points扫一下就行

代码

#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define MAXN 805
#define mo 99994711
#define pb push_back
#define eps 1e-8
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 - '0' + c;
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
struct Point {
db x,y;
Point(){}
Point(db _x,db _y) {x = _x;y = _y;}
friend Point operator + (const Point &a,const Point &b) {return Point(a.x + b.x,a.y + b.y);}
friend Point operator - (const Point &a,const Point &b) {return Point(a.x - b.x,a.y - b.y);}
friend Point operator * (const Point &a,const db &d) {return Point(a.x * d,a.y * d);}
friend Point operator / (const Point &a,const db &d) {return Point(a.x / d,a.y / d);}
friend db operator * (const Point &a,const Point &b) {return a.x * b.y - a.y * b.x;}
friend db dot(const Point &a,const Point &b) {return a.x * b.x + a.y * b.y;}
db norm() {return sqrt(x * x + y * y);}
friend bool operator < (const Point &a,const Point &b) {return a.x < b.x || (a.x == b.x && a.y < b.y);}
}D1[MAXN],S1[MAXN],T1[MAXN];
int D,S,T,tot;
pair<db,Point> L[MAXN * 4];
Point P[MAXN * 4];
int sum[MAXN * 4];
void Solve() {
read(D);
for(int i = 1 ; i <= D ; ++i) scanf("%lf%lf",&D1[i].x,&D1[i].y);
read(S);
for(int i = 1 ; i <= S ; ++i) scanf("%lf%lf",&S1[i].x,&S1[i].y);
read(T);
int64 ans = 0;
for(int i = 1 ; i <= T ; ++i) scanf("%lf%lf",&T1[i].x,&T1[i].y);
for(int i = 1 ; i <= S ; ++i) {
tot = 0;
for(int j = 1 ; j <= D ; ++j) L[++tot] = mp(atan2(D1[j].y - S1[i].y,D1[j].x - S1[i].x),D1[j]);
for(int j = 1 ; j <= T ; ++j) L[++tot] = mp(atan2(T1[j].y - S1[i].y,T1[j].x - S1[i].x),T1[j]);
sort(L + 1,L + tot + 1);
for(int i = 1 ; i <= tot ; ++i) P[i] = L[i].se;
for(int i = 1 ; i <= tot ; ++i) P[i + tot] = L[i].se;
tot *= 2;
for(int i = 1 ; i <= tot ; ++i) {
sum[i] = sum[i - 1];
if(P[i].y > 0) sum[i]++;
}
int r = 0,cnt = 0;
int64 s = 0;
for(int l = 1 ; l <= tot / 2; ++l) {
while(r < l) {if(P[r + 1].y < 0) s += sum[r + 1],++cnt;++r;}
while((P[l] - S1[i]) * (P[r + 1] - S1[i]) > 0) {
if(P[r + 1].y < 0) s += sum[r + 1],++cnt;++r;
}
if(P[l].y < 0) {
s -= sum[l];--cnt;
ans += s - 1LL * cnt * sum[l];
}
}
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

貌似板刷了一页LOJ了呢。。

【LOJ】#2082. 「JSOI2016」炸弹攻击 2的更多相关文章

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

    [LOJ 2082] 「JSOI2016」炸弹攻击 2 链接 链接 题解 枚举发射源,将发射源当做原点,对敌人和激光塔极角排序. 由于敌人纵坐标均为正,而其它点均为负,因此每两个角度差在 \(\pi\ ...

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

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

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

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

  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. css后代选择器 .属性 元素 与 元素.属性的区别

    经常看见css的后代选择器是这样的写法: div.class   和 .class div 的形式两者的区别: div.class  是选中的类名为class 的div元素,与直接使用类选择器.cla ...

  2. 【刷题】BZOJ 1124 [POI2008]枪战Maf

    Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的人也不同. ...

  3. centos 7使用docker安装lnmp和redis环境

    #================Docker基础操作========================== #启动docker服务service docker start#搜索可用docker镜像#h ...

  4. [SDOI2009]Bill的挑战——全网唯一 一篇容斥题解

    全网唯一一篇容斥题解 Description Solution 看到这个题,大部分人想的是状压dp 但是我是个蒟蒻没想到,就用容斥切掉了. 并且复杂度比一般状压低, (其实这个容斥的算法,提出来源于y ...

  5. C++并发编程实战---阅读笔记

    1. 当把函数对象传入到线程构造函数中时,需要避免“最令人头痛的语法解析”.如果传递了一个临时变量,而不是一个命名的变量:C++编译器会将其解析为函数声明,而不是类型对象的定义. 例如: class ...

  6. requestMapping之地址映射

    转:http://www.cnblogs.com/qq78292959/p/3760560.html 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时, ...

  7. Python里面这些点,据说80%的新手都会一脸懵逼

    Python里面这些点,据说80%的新手都会一脸懵逼 菜鸟Python 关注 2018.10.10 12:51 字数 1833 阅读 123评论 0喜欢 10 Python虽然语法简单,通俗易懂,但是 ...

  8. centos7+mysql5.7.11实现主从复制

    1  首先检测当前的系统是否已经安装了MySQL yum list installed | grep mysql 如果有的话,删除 2  下载rpm库资源,在网页 https://dev.mysql. ...

  9. webpack提取库

    有时候我们不想bundle.js过于大,想把一些库独立成文件单独拿出来 module.exports = { entry: { // bundle是我们要打包的项目文件的导出名字, app是入口js文 ...

  10. Ubantu里面的Sublime Text3不支持中文的解决办法

    参考的大佬链接:https://github.com/lyfeyaj/sublime-text-imfix 更新然后将系统升级到最新版本,在linux终端输入 sudo apt-get update ...