CodeForces - 669E cdq分治

1 篇文章 0 订阅

这题是学习cdq分治经测试的第一题,之前还有一道cdq分治和树状数组结合作为我学习的第一题,看了很久才看明白但是oj上没那题了。这个代码是抄别人的..感受到领悟了思想和会自己写出来还是两回事...    代码来源博客:http://blog.csdn.net/kg20006/article/details/51317244

#include <bits/stdc++.h>

using namespace std;
const int maxn=100005;
int ans[maxn];
struct op
{
    int tp,t,x,id;
    op(){}
    op(int a, int b, int c, int d) { tp = a, t = b, x = c, id = d; }
    bool operator < (const op& a) const{ return t < a.t; }

}qry[maxn];
map<int,int> mp;

bool cmp(op a,op b)
{
    return a.id<b.id;
}

void cdq(int l,int r)
{
    int i;
    if(l==r) return;
    int mid=(l+r)>>1;
    cdq(l,mid);
    cdq(mid+1,r);
    sort(qry+l,qry+r+1);// sort这个函数,左边加的是下标,右边加的是下标加一
    for(i=l;i<=r;i++)
    {
        op &x=qry[i];
        if(x.id<=mid)
        {
            if(x.tp==1) mp[x.x]++;
            else if(x.tp==2) mp[x.x]--;
        }
        else
            if(x.tp==3) ans[x.id]+=mp[x.x];
    }
    for(i=l;i<=r;i++)
    {
        op &x=qry[i];
        if(x.id<=mid)
        {
            if(x.tp==1) mp[x.x]--;
            else if(x.tp==2) mp[x.x]++;
        }
    }
    sort(qry+l,qry+r+1,cmp);
}

int main()
{
    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d%d",&qry[i].tp,&qry[i].t,&qry[i].x);
        qry[i].id=i;
    }
    cdq(1,n);
    for(i=1;i<=n;i++)
        if(qry[i].tp==3) printf("%d\n",ans[i]);
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值