一、题目

点此看题

题目说的很不清楚,我再来解释一下:

有一个 n × n n\times n n×n 的矩阵,一开始有人在上面标记了 n n n个点(不重行,不重列),询问给定一个矩形,问有多少选两个点组成的矩形与给定的矩形相交(挨着也行)。

二、解法

正难则反,有一种计算方法就是用所有矩形减去不相交的矩形, x x x个点能生成的矩形数为 x ( x − 1 ) 2 \frac{x(x-1)}{2} 2x(x−1)​ 。

可以先减去上下左右四个方向所能生成的矩形数量,那这样会不会算重呢?答案就是我们减多了,因为左下角,右下角,左上角,右上角所能生成的矩形数量都被算了两遍,所以要加回去。

本题范围很大,但是点很不多,可以用主席树来维护前缀和,时间复杂度&空间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)。

#include <cstdio>
#define LL long long
const int N = 200005;
const int M = 30*N;
int read()
{int x=0,flag=1;char c;while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();return x*flag;
}
int n,q,cnt,rt[N],sum[M],ls[M],rs[M];
int ins(int x,int l,int r,int id)
{int t=++cnt;sum[t]=sum[x]+1;ls[t]=ls[x];rs[t]=rs[x];if(l==r) return t;int mid=(l+r)>>1;if(mid>=id)ls[t]=ins(ls[x],l,mid,id);elsers[t]=ins(rs[x],mid+1,r,id);return t;
}
int ask(int x,int y,int l,int r,int L,int R)
{if(l>R || L>r) return 0;if(L<=l && r<=R) return sum[y]-sum[x];int mid=(l+r)>>1;return ask(ls[x],ls[y],l,mid,L,R)+ask(rs[x],rs[y],mid+1,r,L,R);
}
LL cal(int x)
{return 1ll*x*(x-1)/2;
}
int main()
{n=read(),q=read();for(int i=1;i<=n;i++){int x=read();rt[i]=ins(rt[i-1],1,n,x);}while(q--){int a=read(),b=read(),c=read(),d=read();LL res=cal(n)-cal(a-1)-cal(b-1)-cal(n-c)-cal(n-d);if(b>1){res+=cal(ask(rt[0],rt[a-1],1,n,1,b-1));res+=cal(ask(rt[c],rt[n],1,n,1,b-1));}if(d<n){res+=cal(ask(rt[0],rt[a-1],1,n,d+1,n));res+=cal(ask(rt[c],rt[n],1,n,d+1,n));}printf("%lld\n",res);}
}

CF853C Boredom相关推荐

  1. Codeforces 853C - Boredom

    853C - Boredom 题意 给出一个矩阵,每行每列有且仅有一个点.每次询问一个子矩形,问这些点构成的矩形有多少个与给定的矩形相交(两个处于对角线上的点可以组成矩形). 分析 考虑矩形周围 8 ...

  2. Codeforces Round #260 (Div. 1) A - Boredom DP

    点击打开链接 题意: 给你n个数,你每次可以选择删除去一个数x,但是等于x+1和等于x-1的数都得删去 你每一次操作可以得x分 思路一: dp[i]表示到i后能够得到的最大分数 dp[i]=max(d ...

  3. A. Boredom【DP】

    用哈希表存一下每个数出现的个数.考虑每一个数选不选依赖于前一个数. https://codeforces.com/problemset/problem/455/A #include<bits/s ...

  4. CodeForces - 456C Boredom(线性dp)

    题目链接:点击查看 题目大意:给出一个由n个数字组成的数列,现在给出规则是,每次选择数列中的一种数字 x,选择后的贡献为 x,不过操作后会删除掉所有数值为 x + 1 和 x - 1 的数,现在问如何 ...

  5. A. Boredom(线性dp基础题)

    题目的大意是:给定你一个数组,每次可以删掉一个大小为a的数,获得a的分数,同时删除数列中所有大小为a+1和a-1的数.问删除所有数组中的数后,能够获得的最大分数值. 思路:本题可以用线性dp来解决.d ...

  6. c语言解析xml字符串_Python XML解析

    Python XML解析 什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). 你可以通过本站学习XML教程 XML 被设计用来传输和存储数据. XML是 ...

  7. react项目开发步骤_成为专业React开发人员的31个步骤

    react项目开发步骤 我为达到可雇用水平而进行的每个项目和课程. (Every single project and course I took to reach a hireable level. ...

  8. Jürgen Schmidhuber回顾30年前旧作,称其启发了现今流行的很多概念

    来源:机器之心本文约3300字,建议阅读7分钟本文回顾了 30 年前其团队发表的关于利用人工进行规划和强化学习的研究工作. 现今流行的生成对抗网络(GAN)只是对抗好奇心的一种特例?在近日 Jürge ...

  9. python 解析xml

    在工作中很多时候都要用到xml,使用这个时候难免会设计到解析他,然后就研究了一下python解析xml问题,看了很多东西,python有很多解析xml的包,但是也折腾我好一段时间,最后选择了这个方法. ...

最新文章

  1. iphone系统更新 3002错误
  2. 2014西安 H 有向图博弈 UVALive-7042
  3. 前后端分离业务逻辑常用封装函数(一)
  4. TCP/IP详解--学习笔记(12)-TCP的超时与重传
  5. Android 的 ramdisk.img、system.img、userdata.img 作用说明,以及UBoot 系统启动过程
  6. C++学习之路 | PTA乙级—— 1022 D进制的A+B (20分)(精简)
  7. es6 Class 的 getter函数和setter函数
  8. 谷歌Chrome浏览器开发者工具教程—JS调试篇
  9. 国产web端开源ui组件-后台前端ui界面组件库
  10. studio one 3 机架声道设置_「声卡跳线」IXI Mega M8 声卡电脑/手机直播机架跳线(图文教程)...
  11. c3p0连接池配置连接不上mysql_数据库连接池之c3p0的配置 + 问题解决方案
  12. 路由交换技术vlan、trunk、单臂路由、三层交换、链路聚合、STP
  13. Android游戏破解 入门级零基础起步学习破解!MT管理器+修改器使用方法 小白看了绝对有用
  14. 荣耀 android 11 rom,华为荣耀10官方固件rom刷机包_华为荣耀10完整版系统升级包
  15. Performance Test Framework (PTF)是压力测试框架(轩)
  16. 数据分析:AARRR模型
  17. 全球游戏收入将随着电影电视改编作品的不断增多而达到惊人水平 | 美通社头条...
  18. 硬盘分区怎么分?新手该如何操作?
  19. The server of Nginx(二)——Nginx基本功能配置
  20. Android dex修复工具,安卓热修复----手动加载dex文件到设备并执行

热门文章

  1. 深入理解Unity的prefab和序列化过程
  2. CAD初学者如何快速画圆?
  3. 6.进入线性代数的奇妙世界:向量的减法
  4. 如何改造升级大楼的综合布线系统
  5. AD PCB布局拖动元器件时出现的红线、绿线(Optimal Placement Vector)
  6. Luogu p2181
  7. Github Pages入门教程
  8. 您的数据安全保镖,全方位守护企业信息,它-功不可没!
  9. 台式机性能检查和简单配置
  10. k8s restful api 访问