题目链接: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]的更多相关文章

  1. Codeforces Round #433 (Div. 2)【A、B、C、D题】

    题目链接:Codeforces Round #433 (Div. 2) codeforces 854 A. Fraction[水] 题意:已知分子与分母的和,求分子小于分母的 最大的最简分数. #in ...

  2. 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) ...

  3. 递推DP Codeforces Round #260 (Div. 1) A. Boredom

    题目传送门 /* DP:从1到最大值,dp[i][1/0] 选或不选,递推更新最大值 */ #include <cstdio> #include <algorithm> #in ...

  4. 【Codeforces Round #433 (Div. 1) C】Boredom(二维线段树)

    [链接]我是链接 [题意] 接上一篇文章 [题解] 接(点我进入)上一篇文章. 这里讲一种用类似二维线段树的方法求矩形区域内点的个数的方法. 我们可以把n个正方形用n棵线段树来维护. 第i棵线段树维护 ...

  5. 【Codeforces Round #433 (Div. 1) C】Boredom(树状数组)

    [链接]h在这里写链接 [题意] 给你一个n*n的矩阵. 其中每一列都有一个点. 任意两个点构成了矩形的两个对角点 ->即任意两个点确定了一个矩形. ->总共能确定n*(n-1)/2个矩形 ...

  6. 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 ...

  7. Codeforces Round #260 (Div. 1) A. Boredom (简单dp)

    题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...

  8. 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不可约分,如果存在多组满足 ...

  9. 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 ...

随机推荐

  1. win2003 创建nds辅助服务器 步骤

    准备条件:win2003系统DNS主机 win2003系统 DNS副机  在同一局域网下: 目标.新建个laohu.com 主机并添加副机 再 正向查找区域 右键新建区域---下一步--- 选择主要区 ...

  2. webpack学习笔记——publicPath路径问题

    output: { filename: "[name].js", path:path.resolve(__dirname,"build") } 如果没有指定pu ...

  3. 分布式系列四: HTTP及HTTPS协议

    分布式系列四: HTTP及HTTPS协议 非常全面的一篇HTTP的文章: 关于HTTP协议,一篇就够了 还有一个帮助理解HTTPS的文章: 也许,这样理解HTTPS更容易 本文的一些描述摘自这篇文章 ...

  4. mongoose 连接数据库操作

    连接数据库 var mongoose = require('mongoose'); var schema = mongoose.Schema; // 连接MongoDB mongoose.connec ...

  5. laravel5.4 导出 Excel 表格

    1.执行 composer require maatwebsite/excel 2. composer.json 文件出现(或者手动添加) 3.在config目录下 app.php 添加参数 4.导出 ...

  6. Python 爬虫 JD商品-scrapy+requests

    目标站点需求分析 JD商品信息抓取 需求信息字段 涉及的库 scrapy, requests,re lxml 获取单页源码 解析单页源码 获取总页数 获取商品url 解析商品信息 保存本地文件 保存m ...

  7. Web服务器原理

    ——————————什么是Web服务器  Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档.目前最主流的三个Web服务器是Apache Ngin ...

  8. James Munkres Topology: Theorem 16.3

    Theorem 16.3 If \(A\) is a subspace of \(X\) and \(B\) is a subspace of \(Y\), then the product topo ...

  9. sklearn模型的属性与功能-【老鱼学sklearn】

    本节主要讲述模型中的各种属性及其含义. 例如上个博文中,我们有用线性回归模型来拟合房价. # 创建线性回归模型 model = LinearRegression() # 训练模型 model.fit( ...

  10. day12.生成器;wraps初识

    生成器 在 Python 中,使用了 yield 的函数被称为生成器(generator). 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器. 在 ...