bzoj3262: 陌上花开(树套树)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 100005
#define maxm 200005
#define maxk 2000005
using namespace std; int n,K,temp,tot,root[maxm*],ans[maxn],Ans[maxn],sum[maxn],fa[maxk],size[maxk],times[maxk],son[maxk][],val[maxk];
struct seg{
int x,y,z;
}a[maxn],b[maxn];
bool comp(seg x,seg y){
if (x.x!=y.x) return x.x<y.x;
if (x.y!=y.y) return x.y<y.y;
return x.z<y.z;
}
struct Tsegment{
void prepare(){tot=,memset(times,,sizeof(times)),memset(son,,sizeof(son));}
void query(int k,int x,int op){
int y=root[k]; if (y==) return; bool bo;
for (;;){
if (y==) break;
bo=;
if (val[y]==x) ans[op]+=(size[son[y][]]+times[y]),bo=;
else if (x>val[y]) ans[op]+=(size[son[y][]]+times[y]),y=son[y][];
else y=son[y][];
if (bo==) break;
}
}
int which(int x){
return son[fa[x]][]==x;
}
void update(int x){
size[x]=size[son[x][]]+size[son[x][]]+times[x];
}
void rotata(int x){
int y=fa[x],d=which(x),dd=which(y);
if (fa[y]) son[fa[y]][dd]=x; fa[x]=fa[y];
fa[son[x][d^]]=y,son[y][d]=son[x][d^];
fa[y]=x,son[x][d^]=y,update(y);
}
void splay(int x,int goal,int op){
while (fa[x]!=goal){
if (fa[fa[x]]==goal) rotata(x);
else if (which(x)==which(fa[x])) rotata(fa[x]),rotata(x);
else rotata(x),rotata(x);
}
update(x); if (goal==) root[op]=x;
}
void insert(int k,int x,int z){
int y=root[k]; bool bo;
if (y==){
root[k]=++tot,val[tot]=x,size[tot]=times[tot]=z,fa[tot]=son[tot][]=son[tot][]=;
return;
}
for (;;){
bo=;
if (val[y]==x) times[y]+=z,size[y]+=z,bo=,splay(y,,k);
else if (x<val[y]){
if (!son[y][]) val[++tot]=x,son[y][]=tot,fa[tot]=y,size[tot]=times[tot]=z,bo=,splay(tot,,k);
else y=son[y][];
}else{
if (!son[y][]) val[++tot]=x,son[y][]=tot,fa[tot]=y,size[tot]=times[tot]=z,bo=,splay(tot,,k);
else y=son[y][];
}
if (bo==) break;
}
}
}Splay;
struct Fsegment{
void prepare(){memset(root,,sizeof(root));}
void query(int k,int l,int r,int x,int y,int z,int op){
if (l>=x&&r<=y){
Splay.query(k,z,op);
return;
}int mid=(l+r)/;
if (x<=mid) query(k*,l,mid,x,y,z,op);
if (y>mid) query(k*+,mid+,r,x,y,z,op);
}
void insert(int k,int l,int r,int x,int y,int z){
Splay.insert(k,y,z);
if (l==r) return; int mid=(l+r)/;
if (x<=mid) insert(k*,l,mid,x,y,z);
else insert(k*+,mid+,r,x,y,z);
}
}Tree;
struct Ksegment{
void work(){
memset(ans,,sizeof(ans));
for (int i=;i<=temp;i++){
Tree.query(,,K,,b[i].y,b[i].z,i);
Tree.insert(,,K,b[i].y,b[i].z,sum[i]);
}
memset(Ans,,sizeof(Ans));
for (int i=;i<=temp;i++) Ans[ans[i]+sum[i]-]+=sum[i];
for (int i=;i<n;i++) printf("%d\n",Ans[i]);
}
}Task;
int main(){
memset(fa,,sizeof(fa));
memset(son,,sizeof(son));
memset(val,,sizeof(val));
a[].x=a[].y=a[].z=;
scanf("%d%d",&n,&K);
for (int i=;i<=n;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sort(a+,a+n+,comp);
memset(sum,,sizeof(sum));
temp=tot=;
for (int i=;i<=n;i++){
if (a[i].x==a[i-].x&&a[i].y==a[i-].y&&a[i].z==a[i-].z) sum[temp]++;
else sum[++temp]=,b[temp].x=a[i].x,b[temp].y=a[i].y,b[temp].z=a[i].z;
}
Tree.prepare();
Task.work();
return ;
}
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3262
题目大意:见题目。
做法:上次我用的是cdq分治+树状数组,这次写的是线段树套splay,比较裸的树套树了,,,一维排序,另外两维在树套树上维护一下即可。
树套树。
bzoj3262: 陌上花开(树套树)的更多相关文章
- 【BZOJ3262】陌上花开(树套树)
[BZOJ3262]陌上花开(树套树) 题面 对于权限题,我这种苦逼肯定是从别的OJ上搞的对不对??? CJOJ 洛谷 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味 ...
- 树套树【bzoj3262】陌上花开
/* [bzoj3262]陌上花开 2014年6月19日1,2430 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的 ...
- [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)
题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- BZOJ4170 极光(CDQ分治 或 树套树)
传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...
- bzoj3295: [Cqoi2011]动态逆序对(树套树)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- BZOJ 3110 k大数查询 & 树套树
题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...
- BZOJ 3110 树套树 && 永久化标记
感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
随机推荐
- Nodejs生态圈的TypeScript+React
基于Nodejs生态圈的TypeScript+React开发入门教程 基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程 ...
- spring mvc4:异常处理
前面学习过struts2的异常处理,今天来看下spring mvc4的异常处理: 一.Servlet配置文件修改 <bean id="exceptionResolver" c ...
- unity3d 我的面试经历
昨天在上海的一家公司面试成功了 这是我第一次面试,也是我的第一份工作 先上我的简历给大家参考下吧 个人简历 个人信息: 姓 名: 廖旭升 学 历: 无 民 族: 汉 ...
- 也议 js闭包和ie内存泄露原理
可以, 但小心使用. 闭包也许是 JS 中最有用的特性了. 有一份比较好的介绍闭包原理的文档. 有一点需要牢记, 闭包保留了一个指向它封闭作用域的指针, 所以, 在给 DOM 元素附加闭包时, 很可能 ...
- web性能优化——简介
简介 性能优化的第一准则:加缓存.几乎绝大部分优化都围绕这个来进行的.让用户最快的看到结果. 性能优化的第二准则:最小原则.绝不提供多余的信息.比如,静态资源(图片.css.js)压缩,图片的滚动加载 ...
- [BZOJ3144][HNOI2013]切糕(最小割)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3144 分析:神题不解释 http://www.cnblogs.com/zig-zag/ ...
- matlab画图形函数 semilogx
matlab画图形函数 semilogx loglog 主要是学习semilogx函数,其中常用的是semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数.loglog是x y轴都取 ...
- Repeater——数据库控件学习
1.Repeater控件的使用:(用于重复加载一些内容,把要重复加载的代码写在ItemTemplate里面) 脱完控件后,在设计视图中配置数据源即可~ 2.ListView(数据显示,分页此控件一拖千 ...
- js中递归函数的使用介绍
所谓的递归函数就是在函数体内调用本函数.使用递归函数一定要注意,处理不当就会进入死循环.递归函数只有在特定的情况下使用 ,比如阶乘问题 递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示: ...
- ElasticSearch入门系列(五)数据
序言:无论程序如何写,最终都是为了组织数据为我们服务.在实际应用中,并不是所有相同类型的实体的看起来都是一样的.传统上我们使用行和列将数据存储在关系型数据库中相当于使用电子表格,这种固定的存储方式导致 ...