题目链接: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. wxpython多线程通信的应用-实现边录音边绘制音谱图

    #!bin/bash/python # -*- coding=utf-8 -*- from __future__ import division import threading import wx ...

  2. 第十四节:再探MVC中路由的奥秘

    一. 基于RouteBase扩展 1. 原理 扩展RouteBase,同样使用的是MVC框架提供的MvcRouteHandler进行处理. 2. 步骤 1. 新建YpfRoute1类,继承RouteB ...

  3. TCP/IP教程

    一.TCP/IP 简介 TCP/IP 是用于因特网的通信协议. 通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信. 什么是 TCP/IP? TCP/IP 是供已连接因特 ...

  4. UE导航系统详

    配置 Navigation Crowd Manager Class 代理人管理类 可以自定义个 Navigation System Auto Create Navigation Data 导航数据在没 ...

  5. Codeforces Round #527 (Div. 3) . F Tree with Maximum Cost

    题目链接 题意:给你一棵树,让你找一个顶点iii,使得这个点的∑dis(i,j)∗a[j]\sum dis(i,j)*a[j]∑dis(i,j)∗a[j]最大.dis(i,j)dis(i,j)dis( ...

  6. JAVA进阶4

    间歇性混吃等死,持续性踌躇满志系列-------------第4天 1.静态内部类求极值 class MaxMin{ public static class Result{ //表示最大值.最小值 p ...

  7. laravel 跨库执行原生 sql 语句

    执行原生 sql 返回结果集

  8. tp5入门

    runtime目录里的文件是临时文件,可随时删除 在tp5里,命名空间对应了文件的所在目录,app命名空间通常代表了文件的起始目录为application,而think命名空间则代表了文件的起始目录为 ...

  9. from中buttone 和 input type="button" 区别

    在做一个表单提交时碰到的问题, 1.js判断阻止表单提交,如果是form 里面的button的话,恭喜你,你要再换个写法了.<button type="submit" ... ...

  10. 一张图让你懂Python安装第三方库