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,在每个区间 ...
随机推荐
- npm换源
作者一介布衣:http://yijiebuyi.com/blog/b12eac891cdc5f0dff127ae18dc386d4.html npm 是node.js 环境下的包管理器,非常强大智能. ...
- java多线程系类:基础篇:07线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- Dynamics CRM 2016 的新特性
新版本CRM (2016 with update 0.1) 发布已有几个月了,总结一下新特性,从几个方面来看: 1. 针对整合功能的新特性 (1) 增加了CRM App for Outlook. 这个 ...
- C#/JS 获取二维数组组合
C#获取二维数组组合 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...
- QT UDP聊天小程序
利用QT的UDP技术,实现两个QT程序之间的聊天程序. #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include < ...
- echo使用说明,参数详解
简介 echo [OPTION]... [STRING]... 描述 -n 末尾不加换行 -e 开启输出字串中对反斜杠的转译 -E 禁用反斜杠转译 只有开启-e参数的时候,下面的命令才能起作用: \0 ...
- 批处理将字符串输出到Windows剪贴板
批处理将字符串输出到Windows剪贴板 2016-06-30 23:29 339人阅读 评论(0) 收藏 举报 版权声明:作者:N3verL4nd 出处:http://blog.csdn.net/x ...
- windows7下启动mysql服务出现服务名无效
出现提示: WIN 7 cmd命令行下,net start mysql,出现 服务名无效提示: 问题原因: mysql服务没有安装. 解决办法: 在 mysql bin目录下 以管理员的权限 执行 m ...
- [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法
一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...
- [已开源/文章教程]独立开发 一个社交 APP 的源码/架构分享 (已上架)
0x00 背景 真不是和被推荐了2天的博客园一位大神较真,从他那篇文章的索引式文章内容也学习到了很多东西,看评论区那么多对社交APP源码有兴趣的,正巧我上周把我的一个社交APP开源了,包括androi ...