【题目分析】

多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间。

然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可。

挺有套路的一种算法。

时间的抽象很巧妙。

同种的花需要处理,合并在一起计算即可。

【代码】

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

#define ll long long
#define maxn 300005

struct flo{int a,b,c,id;}q[maxn],eq[maxn],nq[maxn];
int cnt,k,top=0,ans[maxn],T,c[maxn];
vector <int> v[maxn];

bool cmp(flo x,flo y)
{
    if (x.a==y.a&&x.b==y.b) return x.c<y.c;
    if (x.a==y.a) return x.b<y.b;
    return x.a<y.a;
}

bool cmp2(flo x,flo y)
{
    if (x.b==y.b&&x.c==y.c) return x.a<y.a;
    if (x.b==y.b) return x.c<y.c;
    return x.b<y.b;
}

struct Bit_Tree{
    int v[maxn];
    void init(){memset(v,0,sizeof v);}
    void add(int x,int f)
    {for (;x<=k;x+=x&(-x)) v[x]+=f;}
    int sum(int x)
    {
        int ret=0;
        for (;x;x-=x&(-x)) ret+=v[x];
        return ret;
    }
}t;

void solve(int l,int r)
{
    if (l==r) return ;
    int mid=(l+r)/2;
    for (int i=l;i<=r;++i)
    {
        if (eq[i].a<=mid) t.add(eq[i].c,v[eq[i].id].size());
        if (eq[i].a>mid)
        {
            int tmp=t.sum(eq[i].c);
            for (int j=0;j<v[eq[i].id].size();++j)
                ans[v[eq[i].id][j]]+=tmp;
        }
    }
    int p1=l,p2=mid+1;
    for (int i=l;i<=r;++i) if (eq[i].a<=mid) t.add(eq[i].c,-v[eq[i].id].size());
    for (int i=l;i<=r;++i) if (eq[i].a<=mid) nq[p1++]=eq[i]; else nq[p2++]=eq[i];
    for (int i=l;i<=r;++i) eq[i]=nq[i];
    solve(l,mid);
    solve(mid+1,r);
}

int main()
{
    scanf("%d%d",&cnt,&k);
    for (int i=1;i<=cnt;++i) scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].c),q[i].id=i;
    sort(q+1,q+cnt+1,cmp);
    for (int i=1;i<=cnt;++i)
    {
        if (!top) eq[++top]=q[i],v[top].push_back(q[i].id);
        else if (eq[top].a!=q[i].a||eq[top].b!=q[i].b||eq[top].c!=q[i].c) eq[++top]=q[i],v[top].push_back(q[i].id);
        else v[top].push_back(q[i].id);
        eq[top].id=top;
    }
    for (int i=1;i<=top;++i) eq[i].a=i;
    sort(eq+1,eq+top+1,cmp2);
    solve(1,top);
    for (int i=1;i<=top;++i)
        for (int j=0;j<v[eq[i].id].size();++j)
            ans[v[eq[i].id][j]]+=v[eq[i].id].size()-1;
    for (int i=1;i<=cnt;++i) c[ans[i]]++;
    for (int i=0;i<cnt;++i) printf("%d\n",c[i]);
}

  

BZOJ 3262 陌上花开 ——CDQ分治的更多相关文章

  1. bzoj 3262 陌上花开 - CDQ分治 - 树状数组

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  2. BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  3. BZOJ 3262 陌上花开 CDQ分治

    = =原来复杂度还是nlog^2(n) Orz 被喷了 #include<cstdio> #include<cstdlib> #include<algorithm> ...

  4. BZOJ 3262: 陌上花开 (cdq分治,三维偏序)

    #include <iostream> #include <stdio.h> #include <algorithm> using namespace std; c ...

  5. BZOJ 3262: 陌上花开 CDQ

    这个题大部分人用了离散然后水之,然而.....作为一只蒟蒻我并没有想到离散,而是直接拿两个区间一个对应n,一个对应k来搞,当然这两个区间是对应的,我把第一维排序,第二维CDQ,第三维树状数组,然而由于 ...

  6. [BZOJ 3456]城市规划(cdq分治+FFT)

    [BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...

  7. [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)

    [BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

  8. P3810 陌上花开 CDQ分治

    陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...

  9. Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治

    Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...

随机推荐

  1. 【Make a H5 game】JS for beginner——FROM U2B

    https://www.youtube.com/watch?v=F2Dc-JlwgN4&feature=iv&src_vid=WfL4LNUL3R0&annotation_id ...

  2. 写一个适应所有环境的js模块

    说下背景: 在ES6以前,JS语言没有模块化,如何让JS不止运行在浏览器,且能更有效的管理代码, 于是应运而生CommonJS这种规范,定义了三个全局变量: require,exports,modul ...

  3. win10 Vmware12装mac os X10.11虚拟机教程

    1.下载安装VMware 12,具体教程在网上都能看见. 2.下载mac os的镜像,最好下载cdr格式的. 3.在导入虚拟机的时候,到选择客户机操作系统的时候,没有网上出现的Mac os,如下图所示 ...

  4. less入门

    less入门 安装 首先安装node,执行命令 node install -g less安装完成后可以在任意窗口中使用lessc命令,将.less文件编译成css文件. 变量 可以像其他语言一样声明变 ...

  5. BZOJ 4184: shallot

    Description 在某时刻加入或删除一个点,问每个时刻的集合中能异或出来的最大值是多少. Sol 线段树+按时间分治+线性基. 按时间分治可以用 \(logn\) 的时间来换取不进行删除的操作. ...

  6. python之路十八

    1.JS 正则    test   - 判断字符串是否符合规定的正则        rep = /\d+/;        rep.test("asdfoiklfasdf89asdfasdf ...

  7. java中面向对象的一些知识(一)

    一:基本概念 举例:写一个程序,实现如下功能: 一群宠物,宠物有各种类型,如猫.狗.企鹅等 让这群宠物,按照各自的能力不同,进行各种比赛(如爬树.游泳.跳水):扩展性需求: 游泳比赛游泳池的参数.飞盘 ...

  8. 【TortoiseGit】TortoiseGit将本地库push到远端

    以前也在使用GitHub,2年前电脑上就装了TortoiseGit和SVN,公司也在用Git,但是并没有刻意去做一些事情,未免觉得有些生疏,今天闲来无聊.玩了一把.[做中成长] 对于GitToiseG ...

  9. 设计模式--代理模式Proxy(结构型)

    一.代理模式 为其他对象提供一种代理以控制对这个对象的访问. 代理模式分为四种: 远程代理:为了一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在于不同地址空间的事实. 虚拟代理:根据需要 ...

  10. C++小结

    1.输入:cin>>变量名: 输出:cout<<变量名<<endl: 2.类 public 公有,此类及其他类中使用   private 私有,只能在本类中使用   ...