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,在每个区间 ...
随机推荐
- JSTL中的TLD配置和使用。
一,JSTL介绍: JSTL标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一 ...
- linux基本工具使用(二)
1 查找某个目录下面一个所有的可执行文件,并且删除(对删除一个工程的可执行文件格外有用) find . -maxdepth 1 -file f -perm -111 | xargs rm
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 省市区数据权限的实现效果
折腾了2-3周,终于把全国网点数据权限,省.市.县数据规范化,查询权限规范化,基础数据规范化的思路理清楚了, 今天应该是一个里程碑式的一天 省市区数据规范化后 1:网点的基础数据可以更加严谨规范化. ...
- Gruntjs: grunt-usemin使用心得
grunt-usemin: Replaces references to non-optimized scripts or stylesheets into a set of HTML files u ...
- mybatis 3.x 缓存Cache的使用
mybatis 3.x 已经支持cache功能了,使用很简单,在mappper的xml文件里添加以下节点: <mapper namespace="com.cnblogs.yjmyzz. ...
- 教你如何反编译Android安装文件apk来偷窥源代码
本文章首发于浩瀚先森博客,地址:http://www.guohao1206.com/2016/08/23/970.html 1. 准备 - java环境 安装java并配置环境 => JAVA环 ...
- Ionic实战四:ionic 即时通讯_ionic仿雅虎邮箱
此产品是一款Ionic版微博.微信.朋友圈效果(微博.微信.聊天列表.聊天窗口.个人界面.编辑个人信息等)购买后二次开发方便快捷.    
- opencv4-highgui之视频的输入和输出以及滚动条
这是<opencv2.4.9tutorial.pdf>的highgui的三个例子.通过简短的介绍来实现不同函数的理解,省去一些不需要说的东西. 一.增加滑动条 这是opencv中为数不多的 ...
- c#自动关闭 MessageBox 弹出的窗口
我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的.所以如果有以下代码: MessageBox.Show("内容',"标题"); 则只有关闭 ...
- android之广播(一)
Android中的广播 系统在运行过程中会产生很多事件,某些事件产生的时候,比如:电量的改变,收发短信.拨打电话.屏幕解锁.开机等等,系统会发送广播.只要应用程序接受到这条广播就知道系统发生了相应的事 ...