Codeforces Round #573 (Div

题意:题目的意思还是比较好懂的—给定一个平面点集, 求用一个没有上界的矩形去框这些点有几种框法

>> face <<

strategy: wa了几发,很容易把区间算重复, 其实可以这样想, 我们沿着y轴扫, 如果这一条线上只有一个点, 那么这个点对答案的贡献就很好求, 即囊括这一个点的区间数,在该点上方的空间里,横坐标小于等于该点的横坐标的坐标数乘上纵坐标大于等于该点的坐标数,然后消去该点. 如果有若干个点, 如果还按上述的方法会算重复区间, 为了避免计算重复区间,我们可以这样–对于每一个点Pn,我们算横坐标大于Pn-1 且小于等于Pn的坐标数乘以大于等于Pn的横坐标的坐标数. (如果看不明白请务必画图)

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define oo INT_MAX
#define ll long long
#define db double
#define all(a) a.begin(), a.end()
#define met(a, b) memset(a, b, sizeof(a))
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rev(i, a, b) for (int i = (a); i >= (b); --i)
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define lowbit(x) x &(-x)
#define pi acos(-1.0)
using namespace std;
using namespace __gnu_pbds;
const db eps = 1e-6;
const int maxn = 2e5 + 9;
// FILE *o = freopen("C:\\Users\\Jason.Z\\Desktop\\in.txt", "r", stdin);
// assert(o != NULL);
// FILE *e = freopen("C:\\Users\\Jason.Z\\Desktop\\y[i].txt", "w", stdout);
// assert(e != NULL);
vector<int> bit(maxn);
map<int, int> cnt,id;
map<int, vector<int> > q;
void add(int v, int x){
    for(;x <= maxn; x += lowbit(x))
        bit[x] += v;
}
inline int ask(int x){
    int ret = 0;
    for(;x; x -= lowbit(x))
        ret += bit[x];
    return ret;
}
inline int alr(int l,int r){
    return ask(r) - ask(l - 1);
}
int num = 0;
int main(){
    ios::sync_with_stdio(0);
    int n;
    cin >> n;
    _rep(i, 1, n){
        int xx, yy ;
        cin >> xx >> yy;
        cnt[xx]++;
        q[yy].push_back(xx);
    }  
    for(auto t:cnt)
        id[t.first] = ++ num, add(1, num);
    ll ans = 0;
    for(auto t:q){
        sort(t.second.begin(), t.second.end());
        int cur_id, l = 1;
        for(auto c:t.second){
            cur_id = id[c];
            ans += (ll)alr(l, cur_id) * alr(cur_id, num);
            if(!--cnt[c])add(-1, cur_id);
            l = cur_id + 1;
        }
    }
    cout << ans << endl;
}

欢迎各位提问哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值