题目传送门

第一次接触CDQ分治,感谢YZ大佬的教导。

CDQ分治就是一种奇特的分治方法,它用左区间的区间信息来更新右区间。

设CDQ(L,R,l,r)表示递归到区间[L,R],区间的值为[l,r]。

mid=l+r/2。

将L~R区间按<=mid和>mid的两块重新分开。

继续递归区间分治。

CDQ分治用于解决一类偏序问题,题目中所求的为三维偏序。

即计算一类ai<bi,aj<bj,ak<bk的贡献。

普通的二维偏序大家都做过,经典题目逆序对。

三维怎么做呢?

第一维依然是SORT,第三位是树状数组。

第二维是CDQ。

第一维SORT后有序,故无需考虑第一维。

第二维CDQ分治时枚举L~R区间,当a[i].y>mid时,计算在权值树状数组上的贡献,否则插入树状数组。

注意:这道题需要对重复区间判重,否则贡献值不好算。

code:

/**************************************************************
    Problem: 3262
    User: yekehe
    Language: C++
    Result: Accepted
    Time:1116 ms
    Memory:10600 kb
****************************************************************/
 
#include <cstdio>
#include <algorithm>
using namespace std;
 
char tc()
{
    static char tr[],*A=tr,*B=tr;
    return A==B&&(B=(A=tr)+fread(tr,,,stdin),A==B)?EOF:*A++;
}
 
int read()
{
    char c;while(c=tc(),c<''||c>'');
    int x=c-'';while(c=tc(),c>=''&&c<='')x=x*+c-'';
    return x;
}
 
struct node{
    int x,y,z,o;
}a[],lx[],rx[],Ne[];
int N,K,cnt;
int at[],b[],tim,ans[],tot[];
inline int cmp(node x,node y){return x.x<y.x || x.x==y.x&&x.y<y.y || x.x==y.x&&x.y==y.y&&x.z<y.z;}
 
void add(int x,int y)
{
    for(int i=x;i<=K;i+=i&-i){
        if(b[i]!=tim)at[i]=,b[i]=tim;
        at[i]+=y;
    }
    return ;
}
 
int get(int x)
{
    int tot=;
    for(int i=x;i;i-=i&-i)
        if(!(b[i]^tim))tot+=at[i];
    return tot;
}
 
void cdq(int L,int R,int l,int r)
{
    tim++;
    int mid=l+r>>,lt=,rt=;
        for(int i=L;i<=R;i++){
            if(!(l^r)){
                ans[Ne[i].o]+=get(Ne[i].z);
                add(Ne[i].z,tot[Ne[i].o]);
            }
            else{
                if(Ne[i].y<=mid)add(Ne[i].z,tot[Ne[i].o]);
                else ans[Ne[i].o]+=get(Ne[i].z);
            }
        }//统计贡献
        for(int i=L;i<=R;i++){
            if(Ne[i].y<=mid)lx[++lt]=Ne[i];
            else rx[++rt]=Ne[i];
        }
        for(int i=;i<=lt;i++)Ne[L+i-]=lx[i];
        for(int i=;i<=rt;i++)Ne[L+i-+lt]=rx[i];//类似于归并那样重组
    if(!(l^r))return ;
    cdq(L,L+lt-,l,mid);
    cdq(L+lt,R,mid+,r);
    return ;
}
 
int IS(int x,int y){
    return a[x].x==a[y].x&&a[x].y==a[y].y&&a[x].z==a[y].z;
}
 
int res[];
 
int main()
{
    N=read(),K=read();
        for(int i=;i<=N;i++){
            a[i].x=read(),a[i].y=read(),a[i].z=read();
        }
    sort(a+,a+N+,cmp);
    a[].x=a[].y=a[].z=-2e9;
        for(int i=;i<=N;i++){
            if(IS(i,i-))++tot[cnt];
            else tot[++cnt]=,Ne[cnt]=a[i],Ne[cnt].o=cnt;
        }//去重
    cdq(,cnt,,K);//注意为cnt
        for(int i=;i<=cnt;i++)res[ans[i]+tot[i]-]+=tot[i];
        for(int i=;i<N;i++)printf("%d\n",res[i]);
    return ;
}

打开CDQ的大门&BZOJ3262的更多相关文章

  1. 文科生打开python的大门

    作为唯一的一名教育学院的学生,加入python课程,一定要声明我可不是并不是被迫选课的!虽然是文科生,但是是对编程这种东西很感兴趣的文科生.从站在python门口的张望,到现在悄悄把门打开,越来越感觉 ...

  2. 第一步,怎么打开react的大门?

    前言 其实我的react的实战经验很少,大概是17年-18年写了一个react全家桶的后台管理系统.猜测这个项目应该还一直在使用 在我手里的vue项目就比较多了,技术栈一直是vue全家桶.最近也在深入 ...

  3. 菜鸟VUER学习记——零0章、打开新的大门

    是什么 基于MVVM模型,核心库只关注视图层,通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件的js框架.根据项目的复杂度和需求,渐进的加入插件以达到恰到好处的程度. 解决问题 UI组件化 ...

  4. Python打开新世界的大门-入门篇1

    目录 题记 Python技巧.避坑及心得 八种数据类型 循环 函数 Homework 题外话 之前没有写博客的习惯,现在开始写觉得入门也太晚了吧,看看同龄的大哥都写了十几万字.于是 ...

  5. echart 打开新世界的大门

    实时折线图 option = { backgroundColor:'#2B2B2B', tooltip: { trigger: 'axis' }, legend: { data:['频率'], tex ...

  6. cdq分治入门--BZOJ3262: 陌上花开

    n<=100000个人,每个人三个属性Ai,Bi,Ci,一个人i的等级为Ai>=Aj,Bi>=Bj,Ci>=Cj的人数,求每个等级有多少人. 裸的三维偏序.按照常规思路,一维排 ...

  7. GoLang——Hello World,打开新世界的大门

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Go语言系列的第一篇文章,我们来聊聊这门新的语言和它的基础语法. 浅谈Golang 作为程序员而言,往往对于学习新的语言都是有抗拒的. ...

  8. bzoj 2163: 复杂的大门

    2163: 复杂的大门 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 418  Solved: 259[Submit][Status][Discuss ...

  9. BZOJ2163: 复杂的大门

    BZOJ2163: 复杂的大门 Description 你去找某bm玩,到了门口才发现要打开他家的大门不是一件容易的事……他家的大门外有n个站台,用1到n的正整数编号.你需要对每个站台访问一定次数以后 ...

随机推荐

  1. 解决js跨域

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  2. Flask 的馈赠

    我们在之前用过装饰器  但是在装饰很多函数的时候  那么这些函数的名字都是装饰器内部函数的名字了怎么办呢? django中有functools进行保留你的函数名字保存 flask也可以使用functo ...

  3. 小鸡G4工程款 上手体验

    前言:之前只是抱着试一试的态度在小鸡活动贴下报名,说实话之前并没有抱希望能够没选中.所以非常感谢小鸡团队给我的这次机会.这应该是我第一次参与厂家的内测活动.希望能给小鸡团队,给广大玩家带来一片实用的上 ...

  4. 解决UITableView在iOS7中UINavigationController里的顶部留白问题

    解决UITableView在iOS7中UINavigationController里的顶部留白问题 出现问题时候的截图: 源码: 用到的类: UIViewController+TitleTextAtt ...

  5. 【C语言】 任意十进制数字转十六进制

    大概思路:输入任意十进制数字 首先确定位数: 使用整形数组来存储十六进制数: a[0] 表示十六进制数字的位数: #include <stdio.h> #include <stdli ...

  6. 第一篇,编译生成libcef_dll_wrapper

    因为工作原因需要在程序里面嵌入地图,在网上看了百度地图和高德地图都没有提供c++的接口,提供有web接口,那只好在程序里面嵌入web控件了,第一想到的是web browser控件,接着脑海里又想到IE ...

  7. 第2次作业——APP的案例分析

    APP的案例分析 网易有道词典APP,使用这个软件有三年之久.唯独最爱的一点就是我每天都能听到不一样的英文歌看到创作歌手的来历,当然偶尔也会有其他国家的歌.起初使用这个软件的目的是用来查单词,每天积累 ...

  8. php 访问控制和重载

    一     php 类中定义的private/protected属性,类外部是无法访问的,但是 我们可以通过public方法来访问设置这些属性 如下 <?php class test{ priv ...

  9. jupyter notebook设置主题背景,字体和扩展插件

    windows上安装Anaconda (IPython notebook) Anaconda是一个包与环境的管理器,一个Python发行版,以及一个超过1000多个开源包的集合.它是免费和易于安装的, ...

  10. 1.4 Installation and Setup(安装和设置)

    1.4 Installation and Setup(安装和设置) 这里我们用Anaconda发行版作为Python的使用环境,推荐安装Python3.6,本书就是用Python3.6代码写成的.(译 ...