BZOJ 3262 陌上花开 ——CDQ分治
【题目分析】
多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间。
然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可。
挺有套路的一种算法。
时间的抽象很巧妙。
同种的花需要处理,合并在一起计算即可。
【代码】
#include <cstdio> #include <cstring> #include <iostream> #include <vector> #include <algorithm> using namespace std; #define ll long long #define maxn 300005 struct flo{int a,b,c,id;}q[maxn],eq[maxn],nq[maxn]; int cnt,k,top=0,ans[maxn],T,c[maxn]; vector <int> v[maxn]; bool cmp(flo x,flo y) { if (x.a==y.a&&x.b==y.b) return x.c<y.c; if (x.a==y.a) return x.b<y.b; return x.a<y.a; } bool cmp2(flo x,flo y) { if (x.b==y.b&&x.c==y.c) return x.a<y.a; if (x.b==y.b) return x.c<y.c; return x.b<y.b; } struct Bit_Tree{ int v[maxn]; void init(){memset(v,0,sizeof v);} void add(int x,int f) {for (;x<=k;x+=x&(-x)) v[x]+=f;} int sum(int x) { int ret=0; for (;x;x-=x&(-x)) ret+=v[x]; return ret; } }t; void solve(int l,int r) { if (l==r) return ; int mid=(l+r)/2; for (int i=l;i<=r;++i) { if (eq[i].a<=mid) t.add(eq[i].c,v[eq[i].id].size()); if (eq[i].a>mid) { int tmp=t.sum(eq[i].c); for (int j=0;j<v[eq[i].id].size();++j) ans[v[eq[i].id][j]]+=tmp; } } int p1=l,p2=mid+1; for (int i=l;i<=r;++i) if (eq[i].a<=mid) t.add(eq[i].c,-v[eq[i].id].size()); for (int i=l;i<=r;++i) if (eq[i].a<=mid) nq[p1++]=eq[i]; else nq[p2++]=eq[i]; for (int i=l;i<=r;++i) eq[i]=nq[i]; solve(l,mid); solve(mid+1,r); } int main() { scanf("%d%d",&cnt,&k); for (int i=1;i<=cnt;++i) scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].c),q[i].id=i; sort(q+1,q+cnt+1,cmp); for (int i=1;i<=cnt;++i) { if (!top) eq[++top]=q[i],v[top].push_back(q[i].id); else if (eq[top].a!=q[i].a||eq[top].b!=q[i].b||eq[top].c!=q[i].c) eq[++top]=q[i],v[top].push_back(q[i].id); else v[top].push_back(q[i].id); eq[top].id=top; } for (int i=1;i<=top;++i) eq[i].a=i; sort(eq+1,eq+top+1,cmp2); solve(1,top); for (int i=1;i<=top;++i) for (int j=0;j<v[eq[i].id].size();++j) ans[v[eq[i].id][j]]+=v[eq[i].id].size()-1; for (int i=1;i<=cnt;++i) c[ans[i]]++; for (int i=0;i<cnt;++i) printf("%d\n",c[i]); }
BZOJ 3262 陌上花开 ——CDQ分治的更多相关文章
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 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 3262: 陌上花开 CDQ
这个题大部分人用了离散然后水之,然而.....作为一只蒟蒻我并没有想到离散,而是直接拿两个区间一个对应n,一个对应k来搞,当然这两个区间是对应的,我把第一维排序,第二维CDQ,第三维树状数组,然而由于 ...
- [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 三个属性 ...
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
随机推荐
- 弹框控件 UIAlertView UIActionSheet
// 创建弹框 从底部弹出,一般用于危险操作 UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"恭喜通关" ...
- 用VC2010以上版本编译可以在低版本XP和2003的运行程序的方法
2013-09-17 作者:佚名 来源:本站整理 浏览:2001 评论:1 一直以来倍受此事困拢,vc2010以上版本编译出的exe或dll总是会引用kernel32.dll的En ...
- git+github上传与管理
1.首先下载并安装git,方便管理github上的代码 https://git-scm.com/downloads 2.然后点击安装好的git bash(注册好自己的github) git confi ...
- delphi tidhttp 超时设置无效的解决方法
现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...
- iOS coredata 数据库的加密(待研究)
https://github.com/project-imas/encrypted-core-data 使用起来很方便,底层还是使用了SQLCipher,有时间要研究一下! 数据库的密码不能用固定字符 ...
- win8 app GridView点击子项布局变更
要触发点击必须设置IsItemClickEnabled="True" 要变更布局代码如下: private void gridView_ItemClick_1(object sen ...
- 循环冗余码crc
待编码的有效信息组多项式:M(x) 生成多项式(产生校验码的多项式):G(x) 余数多项式:R(x) 商:Q(x) 生成多项式是四次的,所以某个多项式除以生成多项式的余式肯定是三次的,所以要加四位00 ...
- spring+redis 集群下的操作
文章就是记录一下工作当中的用到的点,与测试方法以备用,会不断更新. 配置文件spring-redis.xml: <?xml version="1.0" encoding=&q ...
- STM32F412应用开发笔记之五:结合W5500实现以太网通讯
因实际使用需求我们测试一下网络通讯,在NUCLEO-F412ZG测试板上没有以太网部分,我们选择外接一个W5500的实验板.W5500支持SPI接口通讯,DC3.3V供源.而NUCLEO-F412ZG ...
- vim /vi中对字符串的查找并替换
vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询. :s/vivian/sky/ 替换当前行第一个 vivian ...