树套树


  orz zyf

  这题的思路……算是让我了解到了树套树的一种用途吧

三维。。。第一维排序,第二维树状数组,第三维treap
具体实现就是每个树状数组的节点保存一颗treap,然后就可以查询了。
  好神啊……
  树套树可以方便的进行特殊的区间求和,大多数满足区间加法的运算都可以用树套树来搞,比如这题的对所有第二维坐标小于当前点(相当于一段前缀)求第三维坐标小于当前点的和。= =啊……就是一个特殊的前缀和嘛……
 
  还有就是这题其实有个K的……表示坐标的范围……所以树状数组要一直到k,而不是n
 /**************************************************************
Problem: 3262
User: Tunix
Language: C++
Result: Accepted
Time:6728 ms
Memory:99128 kb
****************************************************************/ //BZOJ 3262
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
#define CC(a,b) memset(a,b,sizeof(a))
using namespace std;
int getint(){
int v=,sign=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,M=,INF=~0u>>;
const double eps=1e-;
/*******************template********************/
int n,k,tot,l[M],r[M],s[M],rnd[M],w[M],v[M];
#define L l[x]
#define R r[x]
inline void Push_up(int x){ s[x]=s[L]+s[R]+w[x]; }
inline void zig(int &x){int t=L; L=r[t]; r[t]=x; s[t]=s[x]; Push_up(x); x=t;}
inline void zag(int &x){int t=R; R=l[t]; l[t]=x; s[t]=s[x]; Push_up(x); x=t;}
void ins(int &x,int num,int z){
if (!x){
x=++tot; v[x]=num; s[x]=w[x]=z; L=R=; rnd[x]=rand(); return;
}
s[x]+=z;
if (v[x]==num) w[x]+=z;
else if(num<v[x]){
ins(L,num,z); if(rnd[L]<rnd[x]) zig(x);
}else{
ins(R,num,z); if(rnd[R]<rnd[x]) zag(x);
}
}
int rank(int x,int num){
if (!x) return ;
if (v[x]==num) return s[L]+w[x];
else if(num<v[x]) return rank(L,num);
else return s[L]+w[x]+rank(R,num);
}
#undef L
#undef R
/*********************Treap*********************/
int rt[N];
void update(int x,int y,int z){
for(int i=x;i<=k;i+=i&-i) ins(rt[i],y,z);
}
int query(int x,int y){
int ans=;
for(int i=x;i;i-=i&-i) ans+=rank(rt[i],y);
return ans;
}
/*******************Fenwick*********************/
struct data{
int s,c,m;
}a[N];
bool cmp(data a,data b){
if (a.s==b.s){
if (a.c==b.c) return a.m<b.m;
return a.c<b.c;
}
return a.s<b.s;
}
int ans[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("3262.in","r",stdin);
freopen("3262.out","w",stdout);
#endif
n=getint(); k=getint();
F(i,,n){
a[i].s=getint();
a[i].c=getint();
a[i].m=getint();
}
sort(a+,a+n+,cmp);
int num=;
F(i,,n){
if (a[i].s==a[i+].s &&
a[i].c==a[i+].c &&
a[i].m==a[i+].m) num++;
else{
ans[query(a[i].c,a[i].m)+num-]+=num;
update(a[i].c,a[i].m,num);
num=;
}
}
rep(i,n) printf("%d\n",ans[i]);
return ;
}

【BZOJ】【3262】陌上花开的更多相关文章

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

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

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

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

  3. BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)

    题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...

  4. BZOJ 3262 陌上花开 ——CDQ分治

    [题目分析] 多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间. 然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可. 挺有套路的一种算法. 时间的抽象很巧妙. 同种 ...

  5. bzoj 3262 陌上花开

    本质是一个三维偏序,一位排序后cdq分治,一维在子函数里排序,一维用树状数组维护. 把三维相等的合并到一个里面. #include<iostream> #include<cstdio ...

  6. BZOJ 3262 陌上花开 CDQ分治

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

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

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

  8. 【刷题】BZOJ 3262 陌上花开

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

  9. BZOJ 3262: 陌上花开 CDQ

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

  10. bzoj 3262 陌上花开 【CDQ分治】

    三维偏序 首先把所有花按 x一序,y二序,z三序 排序,然后去重,con记录同样的花的个数,然后进行cdq 现在假设有[l.r]区间,其中[l,mid] [mid+1,r],已经递归处理完毕.我们把区 ...

随机推荐

  1. LoadRunner 参数化之 连接数据库进行参数化

    LoadRunner 参数化之 连接数据库进行参数化 Loadrunner(简称“LR”)对性能测试的脚本进行参数化时,由于数据量偏大,大家往往都会把数据录入到数据库表里,然后关联到LR,本文将详细介 ...

  2. Dubbo的直接提供者

    1.场景 在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从 ...

  3. 使用Generator(小黑鸟)反向生成Java项目(IDEA + Maven)

    一.生成Maven项目 二.配置pom.xml文件 通用代码 <properties> <!-- 设置项目编码编码 --> <project.build.sourceEn ...

  4. 分布式系统的烦恼------《Designing Data-Intensive Applications》读书笔记11

    使用分布式系统与在单机系统中处理问题有很大的区别,分布式系统带来了更大的处理能力和存储容量之后,也带来了很多新的"烦恼".在这一篇之中,我们将看看分布式系统带给我们新的挑战. 1. ...

  5. C# NPOCO 轻量级ORM框架(入门)

    目前公司使用这个框架,搜不到很详细的中文资料. 只有英文wiki,所以翻译学习一下. 因为博主也是低水平的,可能会有一些理解不到位的地方. 可能会有错误的地方,如果有园友发现可以指出. wiki地址: ...

  6. 【干货】PHP常见危险函数

    passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec(). 危险等级:高 exec() 功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等). 危 ...

  7. BZOJ 4197 NOI 2015 寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  8. oracle_创建表空间、用户、授权等步骤

    --创建表空间(在system用户下才可以创建) //connect system/manager as sysdba:切换到system用户 create tablespace tz datafil ...

  9. 电子数据识别软件ABBYY FineReader

    ABBYY 是一家俄罗斯软件公司,在文档识别,数据捕获和语言技术的开发中居世界领先地位.其获奖产品 FineReader OCR 软件可以把静态纸文件和 PDF 文件转换成可管理的电子数据,可以大大节 ...

  10. Send custom commands to Mass Storage device

    http://stackoverflow.com/questions/14363152/send-custom-commands-to-mass-storage-device I have devel ...