【LOJ】#2082. 「JSOI2016」炸弹攻击 2
题解
想到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的更多相关文章
- [LOJ 2082] 「JSOI2016」炸弹攻击 2
[LOJ 2082] 「JSOI2016」炸弹攻击 2 链接 链接 题解 枚举发射源,将发射源当做原点,对敌人和激光塔极角排序. 由于敌人纵坐标均为正,而其它点均为负,因此每两个角度差在 \(\pi\ ...
- LOJ#2082. 「JSOI2016」炸弹攻击 2(计算几何+双指针)
题面 传送门 题解 我们枚举一下发射源,并把敌人和激光塔按极角排序,那么一组合法解就是两个极角之差不超过\(\pi\)且中间有敌人的三元组数,预处理一下前缀和然后用双指针就行了 //minamoto ...
- loj#2076. 「JSOI2016」炸弹攻击 模拟退火
目录 题目链接 题解 代码 题目链接 loj#2076. 「JSOI2016」炸弹攻击 题解 模拟退火 退火时,由于答案比较小,但是温度比较高 所以在算exp时最好把相差的点数乘以一个常数让选取更差的 ...
- 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 ...
随机推荐
- 【转】如何向XML内插入一个字符串片段
转自:http://bbs.csdn.net/topics/190051229 5楼 string filepath = Server.MapPath("你的xml文件"); ...
- MT【104】高斯函数找周期
分析:$t(n)=n-[\frac{n}{2}]-[\frac{n}{3}]-[\frac{n}{6}]$的周期为6,故 $\sum\limits_{n=1}^{2014}(n-t(n))=\sum\ ...
- 【Revit API】调用Revit内部命令PostableCommand
Revit内置了一些命令,直接调用Revit操作方式. 可以去API文档查询PostableCommand枚举,还是很多的. 话不多说,直接上代码 var commandId = RevitComma ...
- 【leetcode】 Jump Game
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- .net MVC框架里怎么写控件
.net的MVC框架如果选择了Razor引擎就需要自己来写控件了,这里列出了一些简单的控件的书写方法 @*这是TextBox控件的写法*@ @Html.TextBox("textbox1&q ...
- Linux问题集锦
一些会遇到的问题,我会不断更新问题集锦~ 1.vi / vim保存文件时遇到的问题:E212: Can't open file for writing 在vi / vim下输入w或wq!保存编辑的文 ...
- 转:iOS-生成Bundle包-引入bundle-使用bundle
在我们使用第三方框架时,常常看到XXX.bundle的文件. 我们找到该文件,显示包内容,大致看到很多资源文件:图片.配置文本.XIB文件…… 什么是Bundle文件? 简单理解,就是资源文件包. ...
- vue-router 编程式导航
借助vue-router的实例方法,通过编写代码来实现导航的切换: back:回退一步 forward:前进一步 go:指定前进回退步数 push:导航到不同url,向history栈添加一个新的记录 ...
- Redis记录-redis和memcached的区别
1.Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memcache还可用于缓存其他东西,例如图片.视频等等: 2.Redis不仅仅支持简单的k/v类型的数据,同时还提供lis ...
- bzoj千题计划205:bzoj1966: [Ahoi2005]VIRUS 病毒检测
http://www.lydsy.com/JudgeOnline/problem.php?id=1966 f[i][j] 表示s的前i个和t的前j个是否匹配 转移看代码 注意初始化: f[0][0]= ...