[Codeforces Round #433][Codeforces 853C/854E. Boredom]
题目链接:853C - Boredom/854E - Boredom
题目大意:在\(n\times n\)的方格中,每一行,每一列都恰有一个被标记的方格,称一个矩形为漂亮的当且仅当这个矩形有两个角是被标记的方格(这样的矩形有\(\frac{n(n-1)}{2}\)个)。给出\(q\)组询问,询问为一个二维区间,问有多少个漂亮的矩形与之相交。
题解:考虑每一个询问,将题中的方格分为如图所示9个区间

每个区间上的数字表示该区间内包含的被标记的点的个数,其中B[1]是询问的区域,为闭区间
将这些区间标记出来后,经过分类讨论即可得出答案
询问区间内点的个数可以通过二维树状数组来解决,但在这题里空间是肯定不够的,所以需要对询问离散化处理,然后离线做
#include<bits/stdc++.h>
using namespace std;
#define N 200001
struct rua{
int l,u,r,d,id,a[],b[],c[];
void read(){scanf("%d%d%d%d",&l,&u,&r,&d);}
long long get()
{
long long res=;
a[]-=a[],a[]-=a[];
b[]-=b[],b[]-=b[];
c[]-=c[],c[]-=c[];
for(int i=;i<;i++)c[i]-=b[i],b[i]-=a[i];
res+=1ll*a[]*(b[]+c[]+b[]+c[]);
res+=1ll*a[]*(b[]+c[]+b[]+c[]+b[]+c[]);
res+=1ll*a[]*(b[]+c[]+b[]+c[]);
res+=1ll*c[]*(b[]+b[]);
res+=1ll*c[]*(b[]+b[]+b[]);
res+=1ll*c[]*(b[]+b[]);
res+=1ll*b[]*(b[]+b[]);
res+=1ll*b[]*b[];
res+=1ll*b[]*(b[]-)/2ll;
return res;
}
}q[N];
int n,m,p[N],t[N];
long long ans[N];
queue<int>Q;
int lowbit(int x){return x&(-x);}
bool cmp1(rua x,rua y){return x.l<y.l;}
bool cmp2(rua x,rua y){return x.r<y.r;}
void change(int x){while(x<N)t[x]++,x+=lowbit(x);}
int ask(int x){int res=;while(x>)res+=t[x],x-=lowbit(x);return res;}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&p[i]);
for(int i=;i<=m;i++)
q[i].read(),q[i].id=i;
sort(q+,q+m+,cmp1);
int cur=;
for(int i=;i<=m;i++)
{
while(cur<q[i].l)change(p[cur]),cur++;
q[i].a[]=ask(q[i].u-),
q[i].a[]=ask(q[i].d),
q[i].a[]=ask(N-);
}
cur=;
sort(q+,q+m+,cmp2);
memset(t,,sizeof(t));
for(int i=;i<=m;i++)
{
while(cur<q[i].r)cur++,change(p[cur]);
q[i].b[]=ask(q[i].u-),
q[i].b[]=ask(q[i].d),
q[i].b[]=ask(N-);
}
for(int i=cur+;i<=n;i++)change(p[i]);
for(int i=;i<=m;i++)
q[i].c[]=ask(q[i].u-),
q[i].c[]=ask(q[i].d),
q[i].c[]=ask(N-);
for(int i=;i<=m;i++)
{
int x=q[i].id;
ans[x]+=q[i].get();
}
//for(int i=1;i<=m;i++)
//for(int j=0;j<3;j++)
//printf("%d %d %d\n",q[i].a[j],q[i].b[j],q[i].c[j]);
for(int i=;i<=m;i++)
printf("%I64d\n",ans[i]);
}
在我的代码中,是先考虑了漂亮矩形的左边界在\(l\)左边的情况,然后加上整体在\(l\)的右边且右边界在\(r\)右边的漂亮矩形数,最后加上整体在\([l,r]\)中的矩形个数
[Codeforces Round #433][Codeforces 853C/854E. Boredom]的更多相关文章
- Codeforces Round #433 (Div. 2)【A、B、C、D题】
题目链接:Codeforces Round #433 (Div. 2) codeforces 854 A. Fraction[水] 题意:已知分子与分母的和,求分子小于分母的 最大的最简分数. #in ...
- DP Codeforces Round #260 (Div. 1) A. Boredom
题目传送门 /* 题意:选择a[k]然后a[k]-1和a[k]+1的全部删除,得到点数a[k],问最大点数 DP:状态转移方程:dp[i] = max (dp[i-1], dp[i-2] + (ll) ...
- 递推DP Codeforces Round #260 (Div. 1) A. Boredom
题目传送门 /* DP:从1到最大值,dp[i][1/0] 选或不选,递推更新最大值 */ #include <cstdio> #include <algorithm> #in ...
- 【Codeforces Round #433 (Div. 1) C】Boredom(二维线段树)
[链接]我是链接 [题意] 接上一篇文章 [题解] 接(点我进入)上一篇文章. 这里讲一种用类似二维线段树的方法求矩形区域内点的个数的方法. 我们可以把n个正方形用n棵线段树来维护. 第i棵线段树维护 ...
- 【Codeforces Round #433 (Div. 1) C】Boredom(树状数组)
[链接]h在这里写链接 [题意] 给你一个n*n的矩阵. 其中每一列都有一个点. 任意两个点构成了矩形的两个对角点 ->即任意两个点确定了一个矩形. ->总共能确定n*(n-1)/2个矩形 ...
- Codeforces Round #260 (Div. 1) A - Boredom DP
A. Boredom Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/problem/A ...
- Codeforces Round #260 (Div. 1) A. Boredom (简单dp)
题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)
A. Fraction 题目链接:http://codeforces.com/contest/854/problem/A 题目意思:给出一个数n,求两个数a+b=n,且a/b不可约分,如果存在多组满足 ...
- Codeforces Round #260 (Div. 2)C. Boredom(dp)
C. Boredom time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
随机推荐
- NOI-OJ 1.13 ID:23 区间内的真素数
整体思路 这里需要大量使用素数,必须能够想到只求出M到N之间的素数是不够的,因为M到N之间数字的反序有可能是大于M或小于N的数字,例如M=2,N=20,那么19的反序91大于20,所以使用埃拉拖色尼算 ...
- VSCode CSS自动补充前缀
1.安装AuotPrefixer. 2.代码里写css样式后,Ctrl+Shift+P,选择AutoPrefix CSS执行 结果如下
- 用 Mathematica 获取图片的 RGB 三基色
ColorConvert[*, "RGB"] // InputForm 其中 * 表示你把你的图片拖入 Mathematica 中.
- 函数语法:JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度(转载)
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- Mysql --库和表的操作
库的增删改查 系统数据库 创建数据库 数据库的相关操作 表的操作 存储引擎介绍(有点多 很啰唆) 表的介绍 表的操作 一.系统数据库 查看系统库: show databases; nformation ...
- greenplum加密
--如下为greenplum5.0数据库加解密--加密函数select encrypt('123456','aa','aes');--加解密函数select convert_from(decrypt( ...
- MySQL查询表中某个字段的重复数据
1. 查询SQL表中某个字段的重复数据 SELECT user_name,COUNT(*) AS count FROM db_user_info GROUP BY user_name HAVING c ...
- 初识C语言(一)
C语言的结构体 一个C程序就是由多个头文件和函数组成 #include<stdio.h> /* 包含头文件*/ int main() { printf('"hello world ...
- docker报错:Failed to restart docker.service: Unit not found.
前言:我之前安装好docker了,但是关机重启后,发现docker就没了 报错:Failed to restart docker.service: Unit not found. 解决方法: 1. ...
- SVN 版本控制安装
客户端 一路点击next即可 注意事项: 这个一定要选,否则后面使用会出现问题. 选择下拉菜单的第一项