【BZOJ5317】【JSOI2018】—部落战争(凸包+闵可夫斯基和)

本文探讨了利用几何算法解决向量合法性和点包含判断问题,通过闵可夫斯基和的概念,介绍了如何构建凸包并判断点是否位于凸包内部。使用C++实现的Graham扫描算法构建凸包,并提供了点包含判断的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

发现向量xxx不合法其实就是可以从A−x=BA-x=BAx=B
也就是x=A−Bx=A-Bx=AB
似乎叫闵可夫斯基和?
建出凸包后看点在不在凸包内就可以了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
    char ch=getchar();
    int res=0,f=1;
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();
    return res*f;
}
const int N=100005;
struct point{
    double x,y;
    point(double _x=0,double _y=0):x(_x),y(_y){}
    friend inline point operator +(const point &a,const point &b){
        return point(a.x+b.x,a.y+b.y);
    }
    friend inline point operator -(const point &a,const point &b){
        return point(a.x-b.x,a.y-b.y);
    }
    friend inline double operator *(const point &a,const point &b){
        return a.x*b.y-a.y*b.x;	
    }
    inline double calc(){
        return x*x+y*y;
    }
}p1[N],p2[N],q[N],t1[N],t2[N];
int n,m,k,top;
inline bool comp(const point &a,const point &b){
    double res=(a-q[1])*(b-q[1]);
    return (res==0)?((a-q[1]).calc()<(b-q[1]).calc()):(res>0);
}
int graham(point *p,int cnt)
{
    for(int i=1;i<=cnt;i++)q[i]=p[i];
    for(int i=2;i<=cnt;i++)if(q[i].x<q[1].x||q[i].x==q[1].x&&q[i].y<q[1].y)swap(q[1],q[i]);
    sort(q+2,q+cnt+1,comp);top=1;
    for(int i=2;i<=cnt;i++)
    {
        while(top>=2&&(q[top]-q[top-1])*(q[i]-q[top-1])<=0)top--;
        q[++top]=q[i];
    }
    for(int i=1;i<=top;i++)p[i]=q[i];p[top+1]=p[1];
    return top;
}
point p[N];int tot;
inline int check(point a){
    if((a-p[1])*(p[2]-p[1])>0||(a-p[1])*(p[tot]-p[1])<0)return 0;
    int l=2,r=tot,res=2;
    while(l<=r){
        int mid=((l+r)>>1);
        if((p[mid]-p[1])*(a-p[1])>=0)res=mid,l=mid+1;
        else r=mid-1;
    }
    return (p[res%tot+1]-p[res])*(a-p[res])>=0;
}
int main(){
    n=read(),m=read(),k=read();
    for(int i=1;i<=n;i++)p1[i].x=read(),p1[i].y=read();
    for(int i=1;i<=m;i++)p2[i].x=-read(),p2[i].y=-read();
    n=graham(p1,n),m=graham(p2,m);
    for(int i=1;i<=n;i++)t1[i]=p1[i+1]-p1[i];
    for(int i=1;i<=m;i++)t2[i]=p2[i+1]-p2[i];
    int f1=1,f2=1;p[tot=1]=p1[1]+p2[1];
    while(f1<=n&&f2<=m)p[++tot]=p[tot-1]+((t1[f1]*t2[f2]>=0)?t1[f1++]:t2[f2++]);
    while(f1<=n)p[++tot]=p[tot-1]+t1[f1++];
    while(f2<=m)p[++tot]=p[tot-1]+t2[f2++];
    tot=graham(p,tot);
    while(k--){
        point a;a.x=read(),a.y=read();
        cout<<check(a)<<'\n' ;
    }
}

转载于:https://www.cnblogs.com/stargazer-cyk/p/11145619.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、COSO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析模拟,揭示了生物质炉具在实际应用中的优点挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值