题解

想到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. 洛谷P1450 [HAOI2008]硬币购物(背包问题,容斥原理)

    洛谷题目传送门 我实在是太弱了,第一次正儿八经写背包DP,第一次领会如此巧妙的容斥原理的应用...... 对每次询问都做一遍多重背包,显然T飞,就不考虑了 关键就在于每次询问如何利用重复的信息 我这么 ...

  2. mysql列类型char,varchar,text,tinytext,mediumtext,longtext的比较与选择

    储存不区分大小写的字符数据 TINYTEXT 最大长度是 255 (2^8 – 1) 个字符. TEXT 最大长度是 65535 (2^16 – 1) 个字符. MEDIUMTEXT 最大长度是 16 ...

  3. 【BZOJ4500】矩阵(差分约束)

    [BZOJ4500]矩阵(差分约束) 题面 BZOJ 然而权限题 题解 显然拆分行和列.不妨设这一行/列总共加减的值是\(p\),那么每一个限制就是两个数的和为一个特定的数.这样子不好做,反正是一个二 ...

  4. 收藏:IPicture总结

    1.IPicture接口对象的创建方法1:直接通过文件创建LPCSTR szFileUrl; IPicture *pIPicture; OleLoadPicturePath(CComBSTR(szFi ...

  5. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  6. Python基础数据类型-字典(dict)

    Python基础数据类型-字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的每一篇都是Python3.x版本的哟 ...

  7. JAVA io 包小结

    IO 无非读写 I --> Reader  O--> Writer 为了方便字符 或者 文本文件的 操作创造出了 字符流 尤其是 缓冲字符输入输出流(BufferedReader,Buff ...

  8. [转载]为什么有些MP4文件在Chrome浏览器上播放不了?

    http://blog.sina.com.cn/s/blog_6bb7ebcc0101c2ja.html Chrome浏览器支持HTML5,它支持原生播放部分的MP4格式(不用通过Flash等插件). ...

  9. struts的理解

    1.struts是一个按MVC模式设计的Web层框架,其实他就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类.我们可以在web.xm ...

  10. 20155314 2016-2017-2 《Java程序设计》第8周学习总结

    20155314 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 了解NIO 会使用Channel.Buffer与NIO2 会使用日志API.国际化 会使用正 ...