洛谷P4623 [COCI2012-2013#6] BUREK [模拟]

  题目传送门

BUREK

格式难调,题面就不放了。


  分析:

  一道比较有思维难度的模拟题。

  首先我们可以想到,对于一个三角形,可以画出一个最小矩形使得这个三角形被完全包围,并且这个矩形的边平行于坐标轴(图就不画了)。如果某条直线经过这个矩形内部,那么它就一定也会把这个三角形分割成两块。而要得到这个矩阵,只需要分别得到三角形三点中的最大与最小横纵坐标就行了,也就分别转化成了横纵向的若干区间。那么问题就转化为:平行于$x$轴的直线被包含于多少纵向区间,平行于$y$轴的直线被包含于多少横向区间内。

  那么这样问题就好办了,有多种解法可以做,这里博主用的是差分+前缀和的模拟方法,具体实现就看代码吧,非常好理解。

  Code:

 

//It is made by HolseLee on 23th Oct 2018
//Luogu.org P4623
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=2e5+7;
int n,m,ans[N],tot,cntx,cnty;
struct Node {
    int x,y,type;
    Node() {}
    Node(const int &_x,const int &_y,const int &_t):
        x(_x), y(_y), type(_t) {}
}a[N];
struct Ques {
    int p,id;
}X[N],Y[N];

inline int read()
{
    char ch=getchar(); int num=0; bool flag=false;
    while( ch<'0' || ch>'9' ) {
        if( ch=='-' ) flag=true; ch=getchar();
    }
    while( ch>='0' && ch<='9' ) {
        num=num*10+ch-'0'; ch=getchar();
    }
    return flag ? -num : num;
}

inline bool cmp1(Node &a,Node &b) { return a.x<b.x; }
inline bool cmp2(Node &a,Node &b) { return a.y<b.y; }
inline bool cmp3(Ques &a,Ques &b) { return a.p<b.p; }

int main()
{
    freopen("burek.in","r",stdin);
    freopen("burek.out","w",stdout);
    n=read();
    int mxx,mnx,mxy,mny,x1,x2,x3,y1,y2,y3;
    for(int i=1; i<=n; ++i) {
        x1=read(), y1=read(), x2=read(), y2=read(), x3=read(), y3=read();
        mxx=max(x1,max(x2,x3)); mnx=min(x1,min(x2,x3));
        mxy=max(y1,max(y2,y3)); mny=min(y1,min(y2,y3));
        a[++tot]=Node(mxx,mxy,-1); a[++tot]=Node(mnx+1,mny+1,1);
    }
    m=read(); char op[5],ka[5];
    for(int i=1; i<=m; ++i) {
        scanf("%s%s",op,ka);
        if( op[0]=='x' ) {
            X[++cntx].id=i, X[cntx].p=read();
        } else {
            Y[++cnty].id=i, Y[cnty].p=read();
        }
    }
    int sum=0, now=1;
    sort(a+1,a+tot+1,cmp1);
    sort(X+1,X+cntx+1,cmp3);
    for(int i=1; i<=tot; ++i) {
        while( now<=cntx && X[now].p<a[i].x ) {
            ans[X[now].id]=sum; now++;
        }
        sum+=a[i].type;
    }
    sum=0, now=1;
    sort(a+1,a+tot+1,cmp2);
    sort(Y+1,Y+cnty+1,cmp3);
    for(int i=1; i<=tot; ++i) {
        while( now<=cnty && Y[now].p<a[i].y ) {
            ans[Y[now].id]=sum; now++;
        }
        sum+=a[i].type;
    }
    for(int i=1; i<=m; ++i) printf("%d\n",ans[i]);
    return 0;
}

 

转载于:https://www.cnblogs.com/cytus/p/9838780.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值