这个题目一个队友没读懂, 然后我读错了题目, 还让他堆了半天的公式写了半天的代码, 交上去一直0.0, 另一队友问题目有没有读错, 我坚持没有读错, 然后坑了2个小时的时间,不然应该会早一点做出来。

题意: 平面上有n个不重和的点, 现在定义一个集合是好的, 那么就需要满足, 这个集合里的每一个子集 都存在一个 {(x, y) |x >= a,  l <= y <= r}(a, l, r为任意实数) 的这个区域与原来集合求交 之后能表示出来。求这个n个点所组成的集合的非空子集有多少个是合法的。

解释一下样例的话 就是 对于 { (1,1) (2,2) (3,3) } 这个集合来说他不是好的一个好的集合, 他的子集{(1,1)}   {(2,2)}   {(3,3)}  {(1,1) (2,2)}  {(2,2) (3,3)}  {(1,1) (2,2) (3,3)}  都可以通过原集合 和 一个{(x, y) |x >= a,   l <= y <= r} 求交集得到, 但是对于 {(1,1) (3,3)} 这个子集来说, 不能求交集得到, 因为如果 存在(1,1) (3,3)  那么也一定存在 (2,2)。

题解:

只有一个点的情况 都是合法的

有2个点的情况 除了同y轴的任意2点组成的集合也是合法的

有3个点的情况 我们发现只有 一个点的 x 坐标小于 其他2个点的x坐标,并且 另外2个点的y坐标一个大于 这个点的y坐标 另一个小于 这个点的y坐标 这样的情况才会合法。

3个点以上的情况都是非法的。

我们每次处理到一个点 (x, y) 之后,我们都查询满足 (xi > x, yi > y)点的个数 设他为a, 然后查询(xi > x, yi < y) 的点的个数 设他为b,

先这个点与其他的点组个成2个点的情况 ans += a + b。

其次这个点与其他的点组成3个点的情况 ans += a * b。

这样处理完所有的点之后我们就可以求解了。

我们用树状数组来加快查询的速度。

首先存下所有的点, 离散化y的坐标, 然后在树状数组相应的位置加上值。

再从左到右处理所有的点, 每次处理到一个点的时候, 我们要先把所有的同x轴的点的值先删除掉, 因为同x轴的点只能和前面的点组成3个点的形式,但是这个东西在前面的点就处理过了,并且我们需要查询的是 后面的点的不同 y 的数目, 所以要先删除这些点的影响, 但是这些点都是可以两两组合的, 这个要先加上去。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = ;
const int N = 1e5 + ;
pll p[N];
pll pp[N];
int vis[N];
int tree[N];
int k = ;
void add(int x, int c){
while(x <= k){
tree[x]+=c;
x += x&(-x);
}
}
int query(int x){
int ret = ;
while(x){
ret += tree[x];
x -= x&(-x);
}
return ret;
}
int main(){
int n;
scanf("%d", &n);
for(int i = ; i <= n; i++){
scanf("%d%d", &p[i].fi, &p[i].se);
pp[i].se = i;
pp[i].fi = p[i].se;
}
sort(pp+, pp++n);
for(int i = ; i <= n; i++){
if(pp[i].fi != pp[i-].fi) k++;
p[pp[i].se].se = k;
}
for(int i = ; i <= n; i++)
add(p[i].se, );
sort(p+, p+n+);
LL ans = n;
for(int i = ; i <= n; i++){
pp[] = p[i];
int j = i+, tt = ;
while(j <= n && p[j].fi == pp[].fi)
pp[tt++] = p[j++];
i = j - ;
for(int z = ; z < tt; z++)
add(pp[z].se, -);
ans += 1ll * tt * (tt-) / ;
for(int z = ; z < tt; z++){
int y = pp[z].se;
LL t1 = query(k) - query(y);
LL t2 = query(y-);
ans = ans + t1 * t2 + t1 + t2;
ans %= mod;
}
}
cout << ans << endl;
return ;
}

牛客暑假多校第五场 I vcd的更多相关文章

  1. 牛客暑假多校第五场A.gpa

    一.题意 给出你的N门课程的考试成绩和所占的机电数目.允许你放弃K门课的成绩,要求你的平均学分绩最高能达到多少. Kanade selected n courses in the university ...

  2. 牛客暑假多校第五场 D inv

    题意:给你一个n, 接来下给你一个 [1,n] 中偶数的排列, 还有一个 [1, n] 中 奇数 按照递增的顺序排列, 现在求一个原数列, 使得偶数列排序 和 奇数列 都是原数列的一个子序列, 现在求 ...

  3. 牛客2018多校第五场E-room 最小费用最大流

    题意:有n个寝室,每个寝室4个人,现在在搞搬寝室的活动,告诉你每个寝室之前的人员名单,和之后的人员名单,问最少需要几个人要搬寝室. 思路: 转化为最小费用最大流解决的二分图问题,对每个去年的宿舍,向每 ...

  4. 牛客暑假多校第六场I-Team Rocket

    一.题意 我们是穿越银河的火箭队....... 给出若干个区间,之后给出若干个点,要求对每个点求出,第一个覆盖点的区间的数量,之后用当前所有点覆盖的区间的序号的乘积结合输入的Y来生成下一位点.最后输出 ...

  5. 牛客暑假多校第六场 I Team Rocket

    题意: 现在有n条火车, 每条火车都有一个运行 [ Li, Ri ], 现在有m支火箭队, 每次火箭队都会破坏这整条铁路上的一个点, 如果一条火车的运行区间[Li, Ri] 被破坏了, 那么这条火车会 ...

  6. 2019牛客暑期多校第五场题解ABGH

    A.digits 2 传送门 题意:给你一个n,要求输出一个每一位数字之和能整除n且其本身也能整除n的数.n不超过100,要求的数不超过10000位数. 题解:直接将n输出n次. 代码: #inclu ...

  7. 2020牛客暑假多校训练营 第二场 H Happy Triangle set 线段树 分类讨论

    LINK:Happy Triangle 这道题很容易. 容易想到 a+b<x a<x<b x<a<b 其中等于的情况在第一个和第三个之中判一下即可. 前面两个容易想到se ...

  8. 2020牛客暑假多校训练营 第二场 G Greater and Greater bitset

    LINK:Greater and Greater 确实没能想到做法. 考虑利用bitset解决问题. 做法是:逐位判断每一位是否合法 第一位 就是 bitset上所有大于\(b_1\)的位置 置为1. ...

  9. 2020牛客暑假多校训练营 第二场 E Exclusive OR FWT

    LINK:Exclusive OR 没做出 原因前面几篇说过了. 根据线性基的知识容易推出 不超过\(w=log Mx\)个数字即可拼出最大值 其中Mx为值域. 那么考虑w+2个数字显然也为最大值.. ...

随机推荐

  1. Spring框架使用@Autowired自动装配引发的讨论

    问题描述 有同事在开发新功能测试时,报了个错,大致就是,在使用 @Autowired 注入时,某个类有两个bean,一个叫a,一个叫b. 一般这种情况应该声明注入哪个bean,他没有声明,他不知道这个 ...

  2. centos6.5-7编译安装Ansible详细部署

    一.基础介绍==========================================================================================ansi ...

  3. 15分钟让你了解如何实现并发中的Barrier

    说到Barrier,很多语言中已经是标准库中自带的概念,一般情况下,只需要直接使用就行了.而最近一些机缘巧合的机会,我需要在c++中使用这么个玩意儿.但是c++标准库里还没有这个概念,只有boost里 ...

  4. OV SSL证书有哪些功能?网站安装OV SSL证书的好处

    OV SSL证书英文名称为Organization Validation SSL Certificate,申请OV SSL证书需要审核申请者对域名是否拥有控制权,同时审核申请者是否为一个合法登记.真实 ...

  5. Linux基础文件权限

    一.基本权限 文件权限设置: 可以赋于某个用户或组 能够以何种方式 访问某个文件 权限对象:属主: u属组: g其他人: o 基本权限类型:读:r 4写:w 2执行: x 1 rwx rw- r-- ...

  6. css常用代码块

    顶部固定导航栏 | css position: fixed; top: 0; left: 0; z-index: 9999; width: 100%; height: 48px; border-top ...

  7. 全屏滚动插件pagePiling.js

    全屏滚动效果是最近非常流行的网页设计形式,带给用户良好的视觉和交互体验.pagePiling.js 这款 jQuery 插件可以帮助前端开发人员轻松实现这种效果.支持所有的主流浏览器,包括IE8+,支 ...

  8. 【0808 | Day 11】文件的高级应用/修改以及函数的定义/使用/参数

    文件的高级应用 一.三种模式 'r+'模式 with open('test.py','r',encoding = 'utf8') as fr: print(fr.writable()) fr.writ ...

  9. ES 27 - Elasticsearch脚本的使用实践

    目录 1 关于脚本 2 脚本使用的最佳实践 2.1 创建脚本并存储 2.2 脚本的缓存 2.3 Script Field - 脚本字段 本文以 ES 6.6.0 版本为例进行演示. 1 关于脚本 ES ...

  10. 存在于文件名中的SQL手工注入

    SQL注入已经在前一章为大家介绍了个大概,本文将讲述我遇到的本以为是文件上传漏洞,却是以文件名触发的SQL注入! 本文分享的内容同样来自于一道CTF题! 1. 直接进入正题 (1) 初步探测 先看一下 ...