[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 ...
随机推荐
- About the Importance of Aim in Life
Have an aim in life, or your energies will all be wasted. ---R. Peters 人生应该树立目标,否则你的精力会白白浪费. ---彼得 ...
- [物理学与PDEs]第2章习题3 Laplace 方程的 Neumann 问题
设 $\Omega$ 为单连通区域, 在其边界 $\vGa$ 上给定向量场 ${\bf u}_B$, 则在 $\bar\Omega$ 中存在速度场 ${\bf u}$, 使其在 $\Omega$ 中成 ...
- Webform--LinQ 分页组合查询
一.linq高级查 1.模糊查(字符串包含) public List<User> Select(string name) { return con.User.Where(r => r ...
- HttpReponse
属性: django将请求报文中的请求行.头部信息.内容主体封装成 HttpRequest 类中的属性. 除了特殊说明的之外,其他均为只读的. 0.HttpRequest.scheme 表示请 ...
- Web从入门到放弃<4>
1,插入 如下html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- Elasticsearch JAVA api轻松搞定groupBy聚合
本文给出如何使用Elasticsearch的Java API做类似SQL的group by聚合. 为了简单起见,只给出一级groupby即group by field1(而不涉及到多级,例如group ...
- lua table表判断是否为空
官方手册里早已经给了答案,那就是靠lua内置的next函数 即如此用: a = {} if next(a) == nil then next其实就是pairs遍历table时用来取下一个内容的函数. ...
- 如何查询oracle数据库中的各种角色
1. 查询oracle中所有用户信息select * from dba_users;2. 只查询用户和密码select username,password from dba_users;3. 查询当前 ...
- django 实战篇之视图层
视图层(views.py) django必会三板斧 HttpResponse >>> 返回字符串 render >>> 支持模板语法,渲染页面,并返回给前端 red ...
- SpringBoot系列三:SpringBoot自定义Starter
在前面两章 SpringBoot入门 .SpringBoot自动配置原理 的学习后,我们对如何创建一个 SpringBoot 项目.SpringBoot 的运行原理以及自动配置等都有了一定的了解.如果 ...