稻草人

【LOJ2880】稻草人

戏子无情 提交于 2020-01-29 13:41:18
题目 题目链接: https://loj.ac/problem/2880 JOI 村有一片荒地,上面竖着 \(n\) 个稻草人。任意两个稻草人的横坐标都不相同,任意两个稻草人的纵坐标都不相同。村民们每年多次在稻草人们的周围举行祭典。 有一次,JOI 村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地。和启示中的一样,田地需要满足以下条件: 田地的形状是边平行于坐标轴的长方形; 左下角和右上角各有一个稻草人; 田地的内部(不包括边界)没有稻草人。 给出每个稻草人的坐标,请你求出有多少个满足条件的田地。 思路 网上的题解都是用 \(cdq+\) 单调栈的优秀算法,但这个 \(\color{gray}{\texttt{菜鸡stoorz}}\) 实在太菜了,看不懂这些高大尚的算法。所以就写了一个 \(cdq+bit+\) 线段树的一种常数超级超级超级大的垃圾算法 \(qwq\) 。 然后再bzoj上T飞了,LOJ跑了倒数第一,33321 ms 首先我们发现这个题目所求其实很像三维偏序,所以考虑用 \(cdq\) 求解。 假设我们现在处理到的区间是 \([l,r]\) ,我们可以对每一个点求出一个贡献区间 \([l_i,r_i]\) ,比如说如果这个点 \(i\) 在左半边,那么列区间为 \([l_i,r_i]\) ,行区间为 \([x_i,mid]\) 的矩形内没有任何一个点。

[BZOJ]4237: 稻草人

匿名 (未验证) 提交于 2019-12-02 23:05:13
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <stack> #include <queue> #include <cmath> #include <set> #include <map> #define mp make_pair #define pb push_back #define pii pair<int,int> #define link(x) for(edge *j=h[x];j;j=j->next) #define inc(i,l,r) for(int i=l;i<=r;i++) #define dec(i,r,l) for(int i=r;i>=l;i--) const int MAXN=3e5+10; const double eps=1e-8; #define ll long long using namespace std; struct edge{int t,v;edge*next;}e[MAXN<<1],*h[MAXN],*o=e; void add(int x,int y,int vul){o->t=y;o->v=vul;o->next=h[x];h[x]=o++;} ll read(){