BZOJ 3262: 陌上花开 (cdq分治,三维偏序)
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
const int maxk=2e5+10;
int n,k;
struct Triple {
    int a,b,c,cnt,ans;
}a[maxn],A[maxn];
bool cmp(const Triple &a,const Triple &b) {
    if (a.a!=b.a) {
        return a.a<b.a;
    }
    else if (a.b!=b.b) {
        return a.b<b.b;
    }
    return a.c<b.c;
}
struct BitIndexTree {
    int a[maxk];
    int lowbit(const int x) {
        return x&(-x);
    }
    void Update(const int x,const int delta) {
        for (int i=x;i<=k;i+=lowbit(i)) {
            a[i]+=delta;
        }
    }
    void Clean(const int x) {
        for (int i=x;i<=k;i+=lowbit(i)) {
            if (a[i]) {
                a[i]=0;
            }
            else {
                break;
            }
        }
    }
    int Query(const int x) {
        int ans=0;
        for (int i=x;i>0;i-=lowbit(i)) {
            ans+=a[i];
        }
        return ans;
    }
}bit;   
void CDQ(Triple *l,Triple *r)
{
    if (l==r) {
        l->ans+=l->cnt-1;
        return ;
    }
    Triple *mid=l+(r-l)/2;
    CDQ(l,mid);
    CDQ(mid+1,r);
    static Triple tmp[maxn];
    for (Triple *p=tmp,*p1=l,*p2=mid+1;p<=tmp+(r-l);p++) {
        if ((p1<=mid&&p1->b<=p2->b)||p2>r) {
            *p=*p1++;
            bit.Update(p->c,p->cnt);
        }
        else {
            *p=*p2++;
            p->ans+=bit.Query(p->c);
        }
    }
    for (Triple *p=tmp,*q=l;q<=r;p++,q++) {
        bit.Clean(p->c);
        *q=*p;
    }
}
template <typename T>
inline void read(T &x)
{
    int f=1;
    x=0;
    register char ch;
    ch=getchar();
    while (ch>'9'||ch<'0') {
        if (ch=='-') {
            f=-f;
        }
        ch=getchar();
    }
    while (ch>='0'&&ch<='9') {
        x=x*10+ch-'0';
        ch=getchar();
    }
    x*=f;
}
inline void write(int x)
{
    if (x<0) {
        putchar('-');
    }
    if (x>9) {
        write(x/10);
    }
    putchar(x%10+'0');
}
int main()
{
    scanf("%d%d",&n,&k);
    for (int i=0;i<n;i++) {
        read(a[i].a),read(a[i].b),read(a[i].c);
        // scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].c);
        a[i].cnt=1;
    }
    sort(a,a+n,cmp);
    int cnt=0;
    for (int i=0;i<n;i++) {
        if (i==0||!(a[i].a==a[i-1].a&&a[i].b==a[i-1].b&&a[i].c==a[i-1].c)) {
            A[cnt++]=a[i];
        }
        else {
            A[cnt-1].cnt+=1;
        }
    }
    CDQ(A,A+cnt-1);
    static int ans[maxn];
    for (int i=0;i<cnt;i++) {
        ans[A[i].ans]+=A[i].cnt;
    }
    for (int i=0;i<n;i++) {
        write(ans[i]);
        putchar('\n');
        // printf("%d\n",ans[i]);
    }
    return 0;
}
BZOJ 3262: 陌上花开 (cdq分治,三维偏序)的更多相关文章
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
		Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ... 
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
		Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ... 
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
		好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ... 
- BZOJ 3262 陌上花开 ——CDQ分治
		[题目分析] 多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间. 然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可. 挺有套路的一种算法. 时间的抽象很巧妙. 同种 ... 
- BZOJ 3262 陌上花开 CDQ分治
		= =原来复杂度还是nlog^2(n) Orz 被喷了 #include<cstdio> #include<cstdlib> #include<algorithm> ... 
- BZOJ - 1935 / 1176 cdq分治 三维偏序
		题意:给定n*m的网格,且给出n个(x,y)表示该网格已被占有,q次询问(x1,y1)到(x2,y2)的网格中有多少个被占有,n,m范围1e7,q范围5e5 cdq按x轴排序,树状数组维护y轴 #in ... 
- BZOJ 2244: [SDOI2011]拦截导弹 (CDQ分治 三维偏序 DP)
		题意 略- 分析 就是求最长不上升子序列,坐标取一下反就是求最长不下降子序列,比较大小是二维(h,v)(h,v)(h,v)的比较.我们不看概率,先看第一问怎么求最长不降子序列.设f[i]f[i]f[i ... 
- cdq分治·三维偏序问题
		转载自FlashHu大佬的博客CDQ分治总结(CDQ,树状数组,归并排序),在讲述部分有部分删改,用了自己的代码 CDQ分治的思想 CDQ分治是基于时间的离线分治算法.这一类分治有一个重要的思想——用 ... 
- 【算法】CDQ分治 -- 三维偏序 & 动态逆序对
		初次接触CDQ分治,感觉真的挺厉害的.整体思路即分而治之,再用之前处理出来的答案统计之后的答案. 大概流程是(对于区间 l ~ r): 1.处理 l ~mid, mid + 1 ~ r 的答案: 2. ... 
随机推荐
- vue  项目初始化
			初始化 vue init webpack-simple myproject 安裝 npm install 运行 npm run dev 访问地址 http://localhost:8080/ 安装we ... 
- 0004 继承django系统用户表
			1 创建基础模型 在本项目中,所有表都有两个自动产生的完全相同的字段,即创建时间和更新时间,因此,可以创建一个基础模型,让所有的表都来继承这个模型. 找到工程目录下的PublicMethod目录,创建 ... 
- SGD 讲解,梯度下降的做法,随机性。理解反向传播
			SGD 讲解,梯度下降的做法,随机性.理解反向传播 待办 Stochastic Gradient Descent 随机梯度下降没有用Random这个词,因为它不是完全的随机,而是服从一定的分布的,只是 ... 
- NMF: non-negative matrix factorization.
			1. 矩阵分解可以用来解决什么方法, 以及how? 利用矩阵分解来解决实际问题的分析方法很多,如PCA(主成分分析).ICA(独立成分分析).SVD(奇异值分解).VQ(矢量量化)等.在所有这些方法中 ... 
- mac环境下,pycharm2018 配置 anaconda。
			2018版的pycharm与之前的版本在配置anaconda上流程略有不同.直接上图 1.新建工程,展开会看到系统默认的编译环境名叫virtualenv,是基于python3.5的环境(如果没有安装过 ... 
- RPA项目所遇知识点
			1艺赛旗 RPA 技术分享常见问题汇总贴 2python标准库之glob介绍 3RPA基础 4RPA答疑 5python3 遍历windows下 所有句柄及窗口名称 import win32gui h ... 
- TCP/IP详解,卷1:协议--RARP:逆地址解析协议
			引言 具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取 I P地址.但是无盘机, 如X终端或无盘工作站,则需要采用其他方法来获得 I P地址. 网络上的每个系统都具有唯一的硬件地址,它是由网络 ... 
- 华为:向充电宝说再见!有它,手机24h不断电
			编辑 | 于斌 出品 | 于见(mpyujian) 虽然,美国与中国的谈判还在协商中,不知道最后的消息是好是坏. 但最近华为公司的成绩,却值得让我们为其喝彩和感到骄傲. 据悉,30日,华为在上半年业绩 ... 
- Gevent和猴子补丁
			定义 在2018年看Flutent python时了解到猴子补丁,知道咋回事,但是现在通过代码更深刻认识猴子补丁. 猴子补丁:在运行时修改类或模块,而不改动源码. 例子1 没有用猴子补丁 import ... 
- 有关C/C++中,表达式计算顺序的问题,以及表达式内部变量“副作用”问题(转)
			经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ... 
