题面

传送门

题解

首先可以用一个矩形去套这个多边形,那么我们只要枚举这个矩形的左下角就可以枚举完所有多边形的位置了

我们先对每一个\(x\)坐标开一个\(bitset\),表示这个\(x\)坐标里哪些\(y\)坐标处有苍蝇。然后再处理出矩形中哪些位置会被覆盖,这个同样可以枚举\(x\)坐标,然后对于所有线段,如果它穿过这个\(x\)坐标,就用一个\(stack\)存起来,然后把所有\(stack\)里的\(sort\)一下,乱搞就好了(具体可以看代码)

注意只有一条线段完全穿过\(x\)才有可能会产生一个区间覆盖的效果。还有一种情况就是两条线段加起来穿过\(x\),然而这两条线段公共端点在\(x\)轴上,那么之前是不会判的,所以要特判

听说这题还有\(FFT\)的做法……话说那些大爷们真的是在做计蒜几盒么……

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#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)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
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=505,M=1e5+5;
struct node{int x,y;}p[M],nfly,a,b;
inline void swap(node &a,node &b){node t=a;a=b,b=t;}
bitset<N>pfly[N],fly[N],now;double st[N];bool ans[N][N];
int n,m,k,top,mnx=inf,mny=inf,mxx=-inf,mxy=-inf,res;
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read(),k=read();
fp(i,1,k)nfly.x=read(),nfly.y=read(),fly[nfly.x].set(nfly.y);
k=read();
fp(i,1,k){
p[i].x=read(),p[i].y=read();
cmin(mnx,p[i].x),cmin(mny,p[i].y),cmax(mxx,p[i].x),cmax(mxy,p[i].y);
}
mxx-=mnx,mxy-=mny;fp(i,1,k)p[i].x-=mnx,p[i].y-=mny,pfly[p[i].x].set(p[i].y);
fp(x,0,mxx){
top=0;
fp(i,1,k){
a=p[i],b=p[i==k?1:i+1];if(a.y>b.y)swap(a,b);
if((a.x<x&&b.x<x)||(a.x>x&&b.x>x)||(a.x==x&&b.x>x)||(b.x==x&&a.x>x))continue;
if(a.x==x&&b.x==x){
fp(y,a.y+1,b.y-1)pfly[x].set(y);
continue;
}
double k=1.0*(b.y-a.y)/(b.x-a.x);
st[++top]=k*(x-a.x)+a.y;
}
sort(st+1,st+1+top);
for(R int y=0,flag=0,i=1;y<=mxy;++y){
while(i<=top&&st[i]<y)++i,flag^=1;
if(flag||(i<=top&&st[i]==y))pfly[x].set(y);
}
}
fp(i,0,mxx)fp(y,0,m-mxy){
now=pfly[i]<<y;
fp(x,0,n-mxx)if(!ans[x][y]&&(now&fly[x+i]).any())ans[x][y]=1;
}
fp(x,0,n-mxx)fp(y,0,m-mxy)res+=!ans[x][y];
printf("%d\n",res);
return 0;
}

LOJ#6049. 「雅礼集训 2017 Day10」拍苍蝇(计算几何+bitset)的更多相关文章

  1. 「雅礼集训 2017 Day10」拍苍蝇

    传送门 Description 有一天,小 A 的母亲对他家里的卫生状况非常不满意,他的房间里有非常多的苍蝇.在母亲的威逼利诱下,小 A 拿起了苍蝇拍去消灭家里的苍蝇.然而,小 A 以前从来没有亲手消 ...

  2. LOJ#6047. 「雅礼集训 2017 Day10」决斗(set)

    题面 传送门 题解 这么简单一道题我考试的时候居然只打了\(40\)分暴力? 如果我们把每个点的\(a_i\)记为\(deg_i-1\),其中\(deg_i\)表示有\(deg_i\)个数的\(A_i ...

  3. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

  4. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

  5. [LOJ 6030]「雅礼集训 2017 Day1」矩阵

    [LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...

  6. [LOJ 6029]「雅礼集训 2017 Day1」市场

    [LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...

  7. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 …… 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  8. loj 6037 「雅礼集训 2017 Day4」猜数列 - 动态规划

    题目传送门 传送门 题目大意 有一个位置数列,给定$n$条线索,每条线索从某一个位置开始,一直向左或者向右走,每遇到一个还没有在线索中出现的数就将它加入线索,问最小的可能的数列长度. 依次从左到右考虑 ...

  9. Loj 6036 「雅礼集训 2017 Day4」编码 - 2-sat

    题目传送门 唯一的传送门 题目大意 给定$n$个串,每个串只包含 ' .问是否可能任意两个不同的串不满足一个是另一个的前缀. 2-sat的是显然的. 枚举每个通配符填0还是1,然后插入Trie树. 对 ...

随机推荐

  1. 【328】Python 控制鼠标/键盘+图片识别 综合应用

    本文是基于 [267]实现跨网络传数据 的基础上的,由于在弹出 putty 之后,需要手动输入命令(pass.sh.get.sh)来实现数据的传递,另外就是处理完之后需要手动关闭 putty,本文解决 ...

  2. 79. Word Search (Array; DFS,Back-Track)

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  3. Going Home(最小费用最大流)

    Going Home http://poj.org/problem?id=2195 Time Limit: 1000MS   Memory Limit: 65536K Total Submission ...

  4. sqlserver流程控制(待续)

    if else: if(1=1) begin--必须1个=号print '111'--begin end 之间必须要有内容end else beginprint '222'end while: DEC ...

  5. 子串字谜substring anagrams

    [抄题]: 给定一个字符串 s 和一个 非空字符串 p ,找到在 s 中所有关于 p 的字谜的起始索引.字符串仅由小写英文字母组成,字符串 s 和 p 的长度不得大于 40,000.输出顺序无关紧要. ...

  6. mysql查询今天、昨天、近7天、近30天、本月、上一月的SQL语句

    mysql查询今天.昨天.近7天.近30天.本月.上一月的SQL语句 这篇文章主要介绍了mysql查询今天.昨天.近7天.近30天.本月.上一月的SQL语句,一般在一些统计报表中比较常用这个时间段,需 ...

  7. CentOS7通过 yum安装路径查询方法

    CentOS7通过 yum安装路径查询方法 rpm -qa 然后执行 rpm -ql 软件名称 就可以显示软件的安装路径. 原文博客的链接地址:https://cnblogs.com/qzf/

  8. [GO]go使用etcd

    package main import ( "go.etcd.io/etcd/clientv3" //笔者在使用clientv3的时间曾经使用过github.com/coreos/ ...

  9. CodeForces 687A NP-Hard Problem (二分图)

    题意:给定 n 条边,然后让你把它分成两组,每组都有所有边的一个端点. 析:一开始我是先判定环,以为就不能成立,其实不是这样的,有环也行.用dfs进行搜索,并标记每一个端点,如果标记过并且和以前不一样 ...

  10. Redis是可以安装成windows服务-开机自启 win7 64位

    其实Redis是可以安装成windows服务的,开机自启动,命令如下: redis-server --service-install redis.windows.conf 安装完之后,就可看到Redi ...