【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[ ...
随机推荐
- svn回退到具体的版本
svn回退到具体的版本 找到项目的版本号 命令行中输入相关命令 到指定地点找到项目即可
- UNIX高级环境编程(4)Files And Directories - umask、chmod、文件系统组织结构和链接
本篇主要介绍文件和文件系统中常用的一些函数,文件系统的组织结构和硬链接.符号链接. 通过对这些知识的了解,可以对Linux文件系统有更为全面的了解. 1 umask函数 之前我们已经了解了每个文件 ...
- zabbix日常监控项TCP连接状态(六)
TCP的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了攻击,或是time_wait值比较高的话,我们要考虑看 ...
- 面向对象程序设计__Task3_Calculator
The initial part of the Calculator program 题目链接:Click Here github链接:Click Here 看到这个题目的话,想到就是有3个任务要去做 ...
- python第十三课——嵌套循环
2.嵌套循环: 概念:循环中再定义循环,称为嵌套循环: [注意]嵌套循环可能有多层,但是一般我们实际开发最多两层就可以搞定了(99%的情况) 格式: 1).while中套while常用 2).whil ...
- python第二课——数据类型1
day02(上午)主要讲了进制问题,小编之前已经发过了 day02(下午): 1.数据类型: 分类: 1).整数型:int浮点型(小数):float布尔型(True/False):bool 2).字符 ...
- Golang包管理工具glide简介
Golang包管理工具glide简介 前言 Golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一些好处: 没有少了许多代码格式风格的争论, ...
- 1503. [NOI2004]郁闷的出纳员【平衡树-splay】
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经 ...
- vue2.* 事件 定义方法 执行方法 获取数据 改变数据 执行方法传值 以及事件对象 05
<template> <div id="app"> <button v-on:click="run1()">执行事件的第一种 ...
- Apache AB的安装和使用(Ubuntu16.04)
步骤很简单一共两步,安装一步,使用一步. sudo apt-get install apache2-utils ab -n 10000 -c 100 https://www.baidu.com/ 注意 ...