【链接】h在这里写链接


【题意】


给你一个n*n的矩阵。
其中每一列都有一个点。
任意两个点构成了矩形的两个对角点
->即任意两个点确定了一个矩形。
->总共能确定n*(n-1)/2个矩形。
现在,给你一个圈出来的矩形区域。
问你有多少个矩形,是在这个矩形之内.或和矩形相交。

【题解】


找和询问矩形相交的矩形不好找。
我们可以反过来.
求出不和询问的矩形相交的矩形的个数。
具体的。
我们找出询问的矩形的上方,左方,下方,右方的整个矩形区域的点的个数。
显然,假设这个区域里面的点的个数为x;
则能够构成x*(x-1)/2个矩形。
用总的矩形个数n*(n-1)/2,减去这4个大矩形区域的矩形个数。就是和它相交的矩形个数了。
但是,我们会把左上方,左下方,右上方,右下方的区域多算一次。
得把它加上去。
->维护矩形区域的点的个数。
这个东西能用树状数组。
在排序的基础上,离线做出来。
具体的,只要记录一下几个点的(1,1)~(x,y)的矩形区域前缀和就好。
然后把每个询问需要的前缀和按顺序算出来。
(↓下面是8个需要离线处理的位置。)

这样就能处理出来4个方向以及4个角落的区域内的点的个数了。

【错的次数】


0

【反思】


排序之后,用树状数组,能够离线处理二维区间和问题。

【代码】

#include <bits/stdc++.h>
using namespace std; const int M = 2e5; int n, m;
vector <tuple<int, int, int, int> > a;
long long num[M * 10 + 10],ans[M+10][9]; struct BI {     int a[M + 10];     int lowbit(int x) {
        return x&(-x);
    }     void add(int x, int y) {
        while (x <= M) {
            a[x] += y;
            x += lowbit(x);
        }
    }     int sum(int x) {
        int now = 0;
        while (x > 0) {
            now += a[x];
            x -= lowbit(x);
        }
        return now;
    }     int get_sum(int l, int r) {
        return sum(r) - sum(l - 1);
    } }b; long long C(long long x) {
    return x*(x - 1) / 2;
} int main() {
    //freopen("F:\\rush.txt", "r", stdin);
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> n >> m;
    for (int i = 1,p; i <= n; i++) {
        cin >> p;
        a.push_back(make_tuple(i,p,0,0));
    }
    for (int i = 1,l,d,r,u; i <= m; i++) {
        cin >> l >> d >> r >> u;
        a.push_back(make_tuple(l-1,d-1,i,1));
        a.push_back(make_tuple(l - 1, u, i, 2));
        a.push_back(make_tuple(l - 1, n, i, 3));
        a.push_back(make_tuple(n, u, i, 4));
        a.push_back(make_tuple(n, d-1, i, 5));
        a.push_back(make_tuple(r, n, i, 6));
        a.push_back(make_tuple(r, d - 1, i, 7));
        a.push_back(make_tuple(r, u, i, 8));
    }
    sort(a.begin(), a.end());
    for (int i = 0; i <= (int)a.size() - 1; i++) {
        int x, y, j, id;
        tie(x, y, j, id) = a[i];
        if (j == 0) {
            b.add(y, 1);
        }
        else
            ans[j][id] = b.get_sum(1, y);
    }
    vector <long long> v;
    v.resize(9);
    for (int i = 1; i <= m; i++) {
        v[1] = ans[i][1];
        v[2] = ans[i][3];
        v[3] = ans[i][5];
        v[4] = n - ans[i][4];
        v[5] = ans[i][3] - ans[i][2];
        v[6] = n - ans[i][6];
        v[7] = ans[i][5] - ans[i][7];
        v[8] = n - ans[i][6] - ans[i][4] + ans[i][8];
        long long temp = 0;
        temp += C(v[2]) + C(v[4]) + C(v[6]) + C(v[3]) - C(v[5]) - C(v[1]) - C(v[7]) - C(v[8]);
        cout << C(n) - temp << endl;
    }
    return 0;
}

【Codeforces Round #433 (Div. 1) C】Boredom(树状数组)的更多相关文章

  1. Codeforces Round #401 (Div. 1) C(set+树状数组)

    题意: 给出一个序列,给出一个k,要求给出一个划分方案,使得连续区间内不同的数不超过k个,问划分的最少区间个数,输出时将k=1~n的答案都输出 比赛的时候想的有点偏,然后写了个nlog^2n的做法,T ...

  2. CF Educational Codeforces Round 10 D. Nested Segments 离散化+树状数组

    题目链接:http://codeforces.com/problemset/problem/652/D 大意:给若干个线段,保证线段端点不重合,问每个线段内部包含了多少个线段. 方法是对所有线段的端点 ...

  3. Educational Codeforces Round 10 D. Nested Segments 离线树状数组 离散化

    D. Nested Segments 题目连接: http://www.codeforces.com/contest/652/problem/D Description You are given n ...

  4. Educational Codeforces Round 10 D. Nested Segments 【树状数组区间更新 + 离散化 + stl】

    任意门:http://codeforces.com/contest/652/problem/D D. Nested Segments time limit per test 2 seconds mem ...

  5. Educational Codeforces Round 8 E. Zbazi in Zeydabad 树状数组

    E. Zbazi in Zeydabad 题目连接: http://www.codeforces.com/contest/628/problem/D Description A tourist wan ...

  6. HDU5465/BestCoder Round #56 (div.2) 二维树状数组

    Clarke and puzzle 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一个数c_{i, j}c​i ...

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

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

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

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

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

随机推荐

  1. Saltstack的API接口与调用方式

     saltstack看起来是成为一个大规模自己主动化运维和云计算管理的一个框架,类似于SDK,并非像puppet仅仅成为一个工具.基于良好设计的API和清楚的思路,让salt的二次开发变得非常easy ...

  2. Linux局域网登陆响应时间过长

    在局域网中,使用ssh登陆到其他机器上时,有时会出现等待10s以上才能正常登陆的问题. 原因: Linux默认使用dns解析登陆IP,但是在局域网,并没有dns服务器,而且机器上也没有添加 IP与域名 ...

  3. C++ Primer高速入门之六:数组和指针

    更新:勘误,delete [] 猪 我们知道,C语言以及早期的面向结构的语言差点儿都支持数组定义.比方整形数组int 女神[2].表示有俩数: 女神[0], 女神[1].她们都是整数. C++ 语言为 ...

  4. 扩展: 简介pyinstaller: py文件压缩成exe文件

    写在开始: 后缀 .py 的文件, 必须在装有python解释器, 和相对应的模块下才能运行. 对于装13来说,比较不方便. 如果人家电脑上也装上了python解释器,  说不好一眼就看穿了 自己写的 ...

  5. qgis显示引擎研究(一)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 Qgis是一个著名的开源地理信息系统软件.今天研究了一下它的显示那一块,算是有一点眉目了. 在Windows环境下所有 ...

  6. vue 点击事件阻止冒泡 用stop

    1.使用vue阻止子级元素的click事件冒泡,很简单,用stop.eg: @click.stop='xxx'

  7. 怎样在nat方式的虚拟机下做ssh连接

    很多人在本机做測试都是用桥接的方式让虚拟机上网. 假设ip地址紧张或者根本就不同意我们拥有一个局域网的ip.这时候便能够使用NAT方式+putty来远程操作. 第一步,打开设备-Network-更改网 ...

  8. android sdk 镜象网站

    因为一些原因.Google相关非常多服务都无法訪问,所以在非常多时候我们SDK也无法升级,当然通过技术手段肯定能够解决,可是比較麻烦,并且下载速度也不怎么样. 这里笔者介绍一个国内的Android镜像 ...

  9. opera mini 改服

    opera mini 改服 下载 opera 和 opera mini ftp://ftp.opera.com/pub/opera/android/mini/ ftp://ftp.opera.com/ ...

  10. Vue render: h => h(App) $mount

    $mount()手动挂载 当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中: 假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载.例如: new Vue({ //el: ...