bzoj 3263 陌上花开(cdq分治,BIT)
【题意】
求满足Ai<=Aj,Bi<=Bj,Ci<=Cj的数对的数目。
【思路】
cdq分治
借网上一句话:第一维排序,第二维cdq分治,第三维树状数组维护。
首先合并三维都是相同的项。
先按照第一维排序然后cdq分治。
定义solve(l,r)为解决区间l,r内所有询问且solve结束后区间有序,设mid=(l+r)/2,
1) Solve(l,mid)
2) Solve(mid+1,r)
//因为经过第一维排序,所以左区间的a都小于等于右区间的a。
3) 处理跨立影响。因为已经排过序,所以左区间的a都要小于右区间的a,因为solve后区间有序,所以左右区间都各自按照b排好了序。按照归并排序的思路,计算左区间对每一个右区间内点的贡献:处理到右区间的l2时,将所有左区间内比他的b小的加入BIT,这时候只要查询一次就可以得出左区间对l2的贡献。
4) 清理BIT,并按照b c大小将左右区间合并使区间有序
最后根据题目要求转化一下。
总的时间为O(nlog^2n),bingo
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int N = *1e5+; struct Node {
int a,b,c,s,ans;
}que[N],a[N]; bool cmp1(const Node& x,const Node& y) {
return x.b<y.b||(x.b==y.b&&x.c<y.c);
}
bool cmp2(const Node& x,const Node& y) {
if(x.a==y.a&&x.b==y.b) return x.c<y.c;
else if(x.a==y.a) return x.b<y.b;
else return x.a<y.a;
} int n,K,C[N],ans[N]; void add(int x,int v)
{
for(;x<=K;x+=x&-x) C[x]+=v;
}
int query(int x)
{
int res=;
for(;x;x-=x&-x) res+=C[x];
return res;
}
Node t[N];
void solve(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>;
solve(l,mid) , solve(mid+,r);
int l1=l,l2=mid+;
while(l2<=r) {
while(l1<=mid && que[l1].b<=que[l2].b) {
add(que[l1].c,que[l1].s);
l1++;
}
que[l2].ans+=query(que[l2].c);
l2++;
}
for(int i=l;i<l1;i++)
add(que[i].c,-que[i].s);
l1=l,l2=mid+; int pos=l;
while(l1<=mid||l2<=r) {
if(l2>r||(l1<=mid&&cmp1(que[l1],que[l2]))) t[pos++]=que[l1++];
else t[pos++]=que[l2++];
}
for(int i=l;i<=r;i++) que[i]=t[i];
}
void read(int& x)
{
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*+c-'',c=getchar();
}
int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);
read(n),read(K);
for(int i=;i<=n;i++)
read(a[i].a),read(a[i].b),read(a[i].c);
sort(a+,a+n+,cmp2);
int cnt=,sz=;
for(int i=;i<=n;i++) {
cnt++;
if(a[i].a!=a[i+].a||a[i].b!=a[i+].b||a[i].c!=a[i+].c)
{
que[++sz]=a[i];
que[sz].s=cnt;
cnt=;
}
}
solve(,sz);
for(int i=;i<=sz;i++)
ans[que[i].ans+que[i].s-]+=que[i].s;
//评级为0~n-1的每级花的数量
for(int i=;i<n;i++)
printf("%d\n",ans[i]);
return ;
}
bzoj 3263 陌上花开(cdq分治,BIT)的更多相关文章
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- BZOJ 3262 陌上花开 ——CDQ分治
[题目分析] 多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间. 然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可. 挺有套路的一种算法. 时间的抽象很巧妙. 同种 ...
- BZOJ 3262 陌上花开 CDQ分治
= =原来复杂度还是nlog^2(n) Orz 被喷了 #include<cstdio> #include<cstdlib> #include<algorithm> ...
- BZOJ 3262: 陌上花开 (cdq分治,三维偏序)
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; c ...
- [BZOJ 3456]城市规划(cdq分治+FFT)
[BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...
- [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)
[BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
- [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...
随机推荐
- hdu 4681
将c串从a,b串中删去后求最长公子列 直接暴会超时 #include <cstdio> #include <cstdlib> #include <algorithm&g ...
- mac 升级后 web 服务器起不来 问题
4. Apache 要本地调试代码的时候发现Apache也不能幸免地跪了.执行apachectl -v发现Apache已经更新到2.4.9版本了.一定又是因为版本更新出了什么差错. 4.1 修改htt ...
- Qt之QtSoap(访问WebService)
http://blog.csdn.net/u011012932/article/details/51673800
- VC++的文件格式详解
.APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度.资源辅助文件. .BMP:位图资源文件. .BSC:浏览信息文件,由浏览信息维护工具( ...
- POJ3660——Cow Contest(Floyd+传递闭包)
Cow Contest DescriptionN (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a prog ...
- POJ2240——Arbitrage(Floyd算法变形)
Arbitrage DescriptionArbitrage is the use of discrepancies in currency exchange rates to transform o ...
- C# 模拟POST提交文件
http://blog.csdn.net/hellowjwang/article/details/19975635 public class HttpPost { /// <summary> ...
- 怎么知道RTL Schematic中的instance与哪段代码对应呢
2013-06-23 20:15:47 ISE综合后可以看到RTL Schematic,但我们知道在RTL编码时,要经常问自己一个问题“我写的这段代码会综合成什么样的电路呢”.对于一个简单的设计,比如 ...
- 宏page_t
/** Type of the index page */ typedef byte page_t;
- HNOI2008Cards
看了一下polya和burnside定理,感觉还行(就是不会证……) 这题用的是burnside ans=在每个置换群下不动的方案数之和除以置换数 这题有个难点在取模 关于对p(p为素数)取模(涉及到 ...