题解 \(by\;zj\varphi\)

对于没有在同一行或同一列的情况,直接枚举右边界,左边界从大到小,用树状数组维护上下边界即可。

而对于有多个在一列或一行的情况,这些点将左右分成了几个区间,枚举上边界在哪个区间,同时维护下边界。

Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
struct nanfeng_stream{
template<typename T>inline nanfeng_stream operator>>(T &x) {
ri f=0;x=0;register char ch=gc();
while(!isdigit(ch)) f|=ch=='-',ch=gc();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
return x=f?-x:x,*this;
}
}cin;
}
using IO::cin;
namespace nanfeng{
#define Node(x,y) (Node){x,y}
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
typedef long long ll;
static const int N=1e5+7,MOD=1e9+7;
int cut[N],Y[N],vis[N],X[N],cnt,xm,tot,n;
ll ans;
struct node{int x,y;}pnt[N];
struct Node{ll x,y;};
inline bool operator<(const node &n1,const node &n2) {return n1.x==n2.x?n1.y<n2.y:n1.x>n2.x;}
struct BIT{
#define lowbit(x) ((x)&-(x))
int c[2507],b[2507];
inline void init() {
memset(c,0,sizeof(int)*(xm+7));
memset(b,0,sizeof(int)*(xm+7));
}
inline void update(int x,int k) {for (ri i(x);i<=xm;i+=lowbit(i)) c[i]+=k,p(b[i]);}
inline Node query(int x) {
register ll res(0),nm(0);
for (ri i(x);i;i-=lowbit(i)) res+=c[i],nm+=b[i];
return Node(res,nm);
}
}B;
inline int main() {
//FI=freopen("nanfeng.in","r",stdin);
//FO=freopen("nanfeng.out","w",stdout);
cin >> n;
for (ri i(1);i<=n;p(i)) cin >> pnt[i].x >> pnt[i].y,xm=cmax(xm,pnt[i].y);
std::sort(pnt+1,pnt+n+1);
cut[p(tot)]=1;
X[tot]=pnt[1].x;
for (ri i(1);i<=n;p(i)) {
if (pnt[i].x!=pnt[i-1].x&&i!=1) Y[p(cnt)]=xm+1,cut[p(tot)]=cnt+1,X[tot]=pnt[i].x;
Y[p(cnt)]=pnt[i].y;
}
Y[p(cnt)]=xm+1;
cut[p(tot)]=cnt+1;
for (ri i(1);i<tot;p(i)) {
register ll tmp=ans;
B.init();
memset(vis,0,sizeof(int)*(xm+7));
for (ri j(cut[i]);j<cut[i+1]-1;p(j))
if (!vis[Y[j]]) B.update(Y[j],Y[j]),vis[Y[j]]=1;
for (ri j(i+1);j<tot;p(j)) {
for (ri k(cut[j]);k<cut[j+1]-1;p(k))
if (!vis[Y[k]]) B.update(Y[k],Y[k]),vis[Y[k]]=1;
ri l1(cut[i]),l2(cut[j]);
ri mn(cmax(Y[l1],Y[l2]));
while(Y[l1+1]<=mn) p(l1);
while(Y[l2+1]<=mn) p(l2);
while(l1<cut[i+1]-1&&l2<cut[j+1]-1) {
int tmp=cmin(Y[l1+1],Y[l2+1]);
register Node tp1=B.query(tmp-1),tp2=B.query(mn-1),tp3=B.query(cmin(Y[l1],Y[l2]));
mn=tmp;
ans=(ans+(ll)(X[i]-X[j])*((tp1.x-tp2.x)*tp3.y-(tp1.y-tp2.y)*tp3.x))%MOD;
if (Y[l1+1]<=mn) p(l1);
if (Y[l2+1]<=mn) p(l2);
}
}
}
printf("%lld\n",ans);
return 0;
}
}
int main() {return nanfeng::main();}

NOIP 模拟 $34\; \rm Rectangle$的更多相关文章

  1. NOIP 模拟 $34\; \rm Equation$

    题解 \(by\;zj\varphi\) 发现每个点的权值都可以表示成 \(\rm k\pm x\). 那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x ...

  2. NOIP 模拟 $34\; \rm Merchant$

    题解 \(by\;zj\varphi\) 对于选的物品,总值一定有在前一段区间递减,后一段递增的性质,那么就可以二分. check()时只递归归并大的一段,用nth_element即可 Code #i ...

  3. noip模拟34[惨败]

    noip模拟34 solutions 我从来不为失败找借口,因为败了就是败了,没人听你诉说任何事情 今天很伤感,以来考试没考好,二来改题改半天也改不出来 这次算是炸出来了我经常范的一些错误,比如除以0 ...

  4. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  5. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  6. NOIP模拟3

    期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...

  7. 7.22 NOIP模拟7

    又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...

  8. 20190725 NOIP模拟8

    今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ...

  9. 20190902+0903合集-NOIP模拟

    一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口 ...

随机推荐

  1. Apache Superset 1.2.0教程 (二)——快速入门(可视化王者英雄数据)

    上一篇我们已经成功的安装了superset,那么该如何可视化我们的数据呢?本文将可视化王者英雄的数据,快速的入门Superset. 一.连接数据源 首先确保mysql可以正常连接使用,并且准备好数据. ...

  2. DL基础补全计划(三)---模型选择、欠拟合、过拟合

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  3. 前端-Vue基础3(父子组件交互)

    1.子组件往父组件传值 点击子组件的值,子组件自增,父组件的值也跟着自增 通过:this.$emit('change')方法向父组件暴露事件,在子组件中引用,可以调用父组件的方法 点击子组件触发cli ...

  4. C语言变量 类型判断

    变量三要素: 一个变量有三个基本的要素,变量的名称,变量的类型,变量的值.所以int a = 10; 变量名为a,变量的存储类型为int型,变量的值为10. 变量还有一些属性如作用范围和存储类型. 变 ...

  5. Scala学习——函数

    一.函数的定义(def) object FunctionApp { //定义函数:方法体内最后一行为返回值,不需要使用return def add(a:Int,b:Int):Int={ a + b } ...

  6. robotframework - selenium Api介绍

    一.介绍下selenium常用的api *** Settings ***Library SeleniumLibraryResource baidu业务.txtResource UI分层.txt *** ...

  7. python3执行.sql文件

    这个脚本主要是遍历执行文件夹下的sql文件,但是没有辨别文件的格式,所以文件夹下只能够放.sql文件,否则会报错哈. 我的sql文件夹与执行的文件平级,所以dir_path就是sql,大家依照自己的路 ...

  8. Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用

    Redis中的HyperLogLog 一般我们评估一个网站的访问量,有几个主要的参数: pv,Page View,网页的浏览量 uv,User View,访问的用户 一般来说,pv 或者 uv 的统计 ...

  9. 2021 NOI冬令营

    2021 NOI冬令营 -- 本来想写得稍微文艺一点的,但是停课这么久已经退化到不会写文章了. 毕竟省选了我才来补的,时间也过去很久了. 毕竟这次我没有获得任何奖项. 我唯一的获得就是-- --好好看 ...

  10. YsoSerial 工具常用Payload分析之CC5、6(三)

    前言 这是common-collections 反序列化的第三篇文章,这次分析利用链CC5和CC6,先看下Ysoserial CC5 payload: public BadAttributeValue ...