【CJOJ2433】陌上花开 树状数组套替罪羊树
【CJOJ2433】陌上花开 树状数组套替罪羊树
蛤?bzoj?没权限QAQ
蛤?CDQ?看了好久没看懂QwQ
好吧我会拿cdq再写一遍的
为啥我感觉这东西比cdq好写
只好拿树状数组套替罪羊树水水了。
先排序一遍,保证对于所有的花,比这朵花美丽的都在它后面。(重复不算)
然后按照b建树状数组,树状数组每个节点按照c建替罪羊树。(只有插入)
然后就水过去了,,,
数组开小身败名裂QwQ因为数组开小调了一个多小时
SGT空间理论上\(O(nlgn)\),实际上max_=1e6也能过。
// It is made by XZZ
#include<cstdio>
#include<algorithm>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=0;rg bool flg=0;rg char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')flg=1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return flg?-x:x;
}
const int maxn=100002,maxk=200001;
typedef const int& fast;
namespace sgt{
const double alpha=0.7233333;
const int max_=1e6+2333;
int cnt,gg[maxk],sum[max_],cov[max_],ch[max_][2],siz[max_],val[max_],root[maxk],id=0;
il vd dfs(fast x){if(x)dfs(ch[x][0]),gg[++cnt]=x,dfs(ch[x][1]);}
il int divide(int l,int r){
if(l>r)return 0;
#define mid ((l+r)>>1)
ch[gg[mid]][0]=divide(l,mid-1);
ch[gg[mid]][1]=divide(mid+1,r);
siz[gg[mid]]=r-l+1;
cov[gg[mid]]=cov[ch[gg[mid]][0]]+cov[ch[gg[mid]][1]]+sum[gg[mid]];
return gg[mid];
#undef mid
}
il int*_ins(int&x,fast num,fast total){
if(!x){x=++id,val[x]=num,siz[x]=1,sum[x]=total,cov[x]=total;return NULL;}
if(val[x]==num){cov[x]+=total,sum[x]+=total;return NULL;}
int*p=_ins(ch[x][num>val[x]],num,total);
if(siz[x]*alpha+3<min(siz[ch[x][0]],siz[ch[x][1]]))p=&x;
siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
cov[x]=cov[ch[x][0]]+cov[ch[x][1]]+sum[x];
return p;
}
il vd ins(int rt,int num,int total){
int*p=_ins(root[rt],num,total);
if(p)cnt=0,dfs(root[rt]),root[rt]=divide(1,cnt);
}
il int query(int rt,int num){
int ret=0,x=root[rt];
while(x){
if(val[x]==num)return ret+cov[ch[x][0]]+sum[x];
if(val[x]>num)x=ch[x][0];
else ret+=cov[ch[x][0]]+sum[x],x=ch[x][1];
}
return ret;
}
}
struct frog{int a,b,c;}f[maxn];
bool operator == (const frog&a,const frog&b){return a.a==b.a&&a.b==b.b&&a.c==b.c;}
il bool cmp(const frog&a,const frog&b){
if(a.a^b.a)return a.a<b.a;
if(a.b^b.b)return a.b<b.b;
return a.c<b.c;
}
int ans[maxn];
#define lb(o) ((o)&-(o))
int main(){
int n=gi(),k=gi();
using namespace sgt;
rep(i,1,n)f[i].a=gi(),f[i].b=gi(),f[i].c=gi();
sort(f+1,f+n+1,cmp);
int __ans,cnt=0;
rep(i,1,n){
++cnt;
if(f[i]==f[i+1])continue;
__ans=0;
for(int j=f[i].b;j;j-=lb(j))__ans+=query(j,f[i].c);
ans[__ans+cnt-1]+=cnt;
for(int j=f[i].b;j<=k;j+=lb(j))ins(j,f[i].c,cnt);
cnt=0;
}
rep(i,1,n)printf("%d\n",ans[i-1]);
return 0;
}
【CJOJ2433】陌上花开 树状数组套替罪羊树的更多相关文章
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
- BZOJ1901 - Dynamic Rankings(树状数组套主席树)
题目大意 给定一个有N个数字的序列,然后又m个指令,指令种类只有两种,形式如下: Q l r k 要求你查询区间[l,r]第k小的数是哪个 C i t 要求你把第i个数修改为t 题解 动态的区间第k ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
随机推荐
- 用以替换系统NSLog的YouXianMingLog
用以替换系统NSLog的YouXianMingLog 这是本人自己使用并改良的用以替换系统NSLog的类,非常好用,以下是使用示例,现在开源出来并提供源码,好用的话顶一下吧^_^ 效果: YouXia ...
- 11 个 Git 面试题
源自:https://mp.weixin.qq.com/s/ghF27N0XjgG0pw2XpGDCYA 在今年的 Stack Overflow 开发者调查报告中,超过 70% 的开发者使用 Git, ...
- saltstack-把执行结果存储到mysql服务内
saltstack把执行的结果保存到mysql中,以便进行命令安全审计 mysql负责存储数据,mysql-python负责收集数据 master需要安装mysql和MySQL-python,mini ...
- 第八章 计时器(DIGCLOCK)
/*-------------------------------------- DIGCLOCK.C -- Digital Clock (c) Charles Petzold, 1998 ----- ...
- Altium制作DC002的PCB封装和3D模型
Altium制作DC002的PCB封装和3D模型 常用的电源连接器(Dc Power Jack Connector)DC002.DC005等等型号的3D模型在网上很难找到合适的,我们可以选择CUI 公 ...
- java StringBuilder案例
实现输出字符串的长度,容量(容量不够则扩容),及内容 import java.util.Arrays; public class MyStringBuilderDemo { //任务:存储字符串并输出 ...
- Linux - Confluence搭建
0. 摘要 Confluence自身携带内置数据库,对于生产环境建议搭建外置数据库,Confluence通过相应驱动连接上.并操作数据库.Confluence支持多种数据库,本文采用MySQL. 1. ...
- mongodb的学习-5-概念解析
http://www.runoob.com/mongodb/mongodb-databases-documents-collections.html mongodb中基本的概念是文档.集合.数据库 S ...
- 初识Qt涂鸦板绘制
1.新建一个Qt Gui应用,项目名称为myPalette,基类选择为QMainWindow,类名设置为MainWindow. 2.在mainwindow.h头文件中添加以下代码,同时添加#inclu ...
- web常用的正则表达式
1. 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2. "^\d+$" //非负整数(正整数 + 0) 3. "^[0 ...