当前位置: 首页 > news >正文

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

题面

传送门

题解

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

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
    R int res,f=1;R char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
const int N=3205;
struct node{
    int x,y,t;
    inline node(){}
    inline node(R int xx,R int yy,R int tt):x(xx),y(yy),t(tt){}
    inline ll operator *(const node &b)const{return 1ll*x*b.y-1ll*y*b.x;}
    inline bool sgn()const{return x?x>0:y>0;}
    inline bool operator <(const node &b)const{
        return sgn()!=b.sgn()?sgn()<b.sgn():*this*b<0;
    }
}a[N],b[N],c[N],st[N];
ll res;int s[N],f[N],g[N],D,S,T,top;
int main(){
//  freopen("testdata.in","r",stdin);
    D=read();
    fp(i,1,D)a[i].x=read(),a[i].y=read();
    S=read();
    fp(i,1,S)b[i].x=read(),b[i].y=read();
    T=read();
    fp(i,1,T)c[i].x=read(),c[i].y=read();
    fp(k,1,S){
        top=0;
        fp(i,1,D)st[++top]=node(a[i].x-b[k].x,a[i].y-b[k].y,0);
        fp(i,1,T)st[++top]=node(c[i].x-b[k].x,c[i].y-b[k].y,1);
        sort(st+1,st+1+top);
        fp(i,1,top)st[top+i]=st[i];
        fp(i,1,top<<1){
            s[i]=s[i-1],f[i]=f[i-1],g[i]=g[i-1];
            st[i].t?++f[i],g[i]+=s[i]:++s[i];
        }
        for(R int i=1,j=1;i<=top;++i)if(st[i].t){
            if(j<i)j=i;
            while(j+1<i+top&&st[i]*st[j+1]<=0)++j;
            res+=g[j]-g[i]-s[i]*(f[j]-f[i]);
        }
    }
    printf("%lld\n",res);
    return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10698649.html

相关文章:

  • 旧版IDEA下载地址
  • 二叉搜索树的第K个结点
  • 系统吞吐量(TPS)、用户并发量、性能测试概念和公式
  • 6.1Python数据处理篇之pandas学习系列(一)认识pandas
  • class-3   linux文件系统知识(一)
  • node学习记录(1)
  • jetty for linux 启用日志
  • 《码出高效》学习笔记与书中错误记录
  • Keystone controller.py routers.py代码解析
  • 测试管理-测试问题监控
  • Bash破壳漏洞
  • Python实现跨平台运维小神器
  • 一篇很全面的IOS面试题(下)
  • ViewController与outlet绑定
  • 三、Python-列表
  • 2017-08-04 前端日报
  • Akka系列(七):Actor持久化之Akka persistence
  • LeetCode算法系列_0891_子序列宽度之和
  • REST架构的思考
  • Spring Boot MyBatis配置多种数据库
  • VuePress 静态网站生成
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从伪并行的 Python 多线程说起
  • 飞驰在Mesos的涡轮引擎上
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 为视图添加丝滑的水波纹
  • kubernetes资源对象--ingress
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​插件化DPI在商用WIFI中的价值
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • ()、[]、{}、(())、[[]]命令替换
  • (003)SlickEdit Unity的补全
  • (12)Hive调优——count distinct去重优化
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二)WCF的Binding模型
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .Net 6.0 处理跨域的方式
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core 成都线下面基会拉开序幕
  • .Net 高效开发之不可错过的实用工具
  • .net6+aspose.words导出word并转pdf
  • .NET和.COM和.CN域名区别
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET开源快速、强大、免费的电子表格组件
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [1127]图形打印 sdutOJ
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [HDU]2161Primes
  • [HITCON 2017]SSRFme perl语言的 GET open file 造成rce