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,在每个区间 ...
随机推荐
- Java核心技术点之注解
本博文是对Java中注解相关知识点的简单总结,若有叙述不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.什么是注解 我们大家都知道Java代码中使用注释是为了向以后阅读这份代码的人解释说明一 ...
- JS/JQ常见兼容辅助插件
1.Respond.js Respond.js 是一个快速.轻量的 polyfill,用于为 IE6-8 以及其它不支持 CSS3 Media Queries 的浏览器提供媒体查询的 min-widt ...
- DEDECMS之五 单页
在网站开发中经常碰到关于我们.联系方式等简单的页面,那么在DEDECMS中如何实现? 一.效果 以上左侧导航的链接都是单页,右边为内容部分 二.单页的实现 创建频道封来实现 1.常规选项 2.高级选项 ...
- Native code on Windows Phone 8(转)
Windows Phone 8 introduces the ability to use native code to implement Windows Phone. In this sectio ...
- zabbix-proxy3.0.4编译安装
数据库配置: innodb_file_per_table=1 安装mysql rpm -ivh http://dev.mysql.com/get/mysql-community-release-e ...
- 杭电1008 Elevator
#include <stdio.h> #include <stdlib.h> int main() { int n; int i,j; int num[101]; while( ...
- java之yield(),sleep(),wait()区别详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- Last-Modified,Etag,Expire区别
Last-Modified 是什么 Last-Modified 是 HttpHeader 中的资源的最后修改时间,如果带有 Last-Modified ,下一次发送 Http 请求时,将会发生带 If ...
- 整合Apache与PHP教程
Apache下载安装完成后,PHP下载解压后,最重要的是如何将他们连接起来,就是整合到一起,让它们之间有联系,笔者根据自己多次配的经验和帮学弟学妹配时他们的理解程度整理了一个比较详细易理解的版本,下面 ...
- 用node.js实现简单的web服务器
node.js实现web服务器还是比较简单的,我了解node.js是从<node入门>开始的,如果你不了解node.js也可以看看! 我根据那书一步一步的练习完了,也的确大概了解了node ...