【BZOJ3262】陌上花开 cdq分治
【BZOJ3262】陌上花开
Description
Input
Output
Sample Input
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1
Sample Output
1
3
0
1
0
1
0
0
1
HINT
1 <= N <= 100,000, 1 <= K <= 200,000
题解:先按第一维排序;然后cdq分治,具体做法是将整个区间[l,r]分成[l,mid]和[mid+1,r],然后递归处理左右两半,这样我们就只需要求出有多少跨过mid的关系了。这个我们一边分治一边将第二维归并排序,然后将第三维扔到树状数组里,顺便再树状数组里统计一下答案
注意本题需要判重,即如果两朵花所有属性都相等,那么它们都比对方美丽
珍爱生命,远离memset
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=100010;
struct node
{
int x,y,z;
}s[maxn];
int s1[maxn],s2[maxn],ss[maxn],ans[maxn],tr[maxn<<1],p[maxn],q[maxn],sta[maxn];
int n,m,nn;
bool cmp(node a,node b)
{
if(a.x==b.x&&a.y==b.y) return a.z<b.z;
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
void updata(int a,int v)
{
for(int i=a;i<=m;i+=i&-i) tr[i]+=v;
}
int query(int a)
{
int i,ret=0;
for(i=a;i;i-=i&-i) ret+=tr[i];
return ret;
}
void dfs(int l,int r)
{
if(l==r)
{
p[l]=l;
return ;
}
int i,mid=l+r>>1,h1=l,h2=mid+1;
dfs(l,mid),dfs(mid+1,r);
for(i=l;i<=r;i++)
{
if(h2<=r&&(h1>mid||s1[p[h1]]>s1[p[h2]])) ans[p[h2]]+=query(s2[p[h2]]),q[i]=p[h2++];
else updata(s2[p[h1]],ss[p[h1]]),q[i]=p[h1++];
}
for(i=l;i<=mid;i++) updata(s2[i],-ss[i]);
for(i=l;i<=r;i++) p[i]=q[i];
}
int main()
{
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=n;i++) scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].z);
sort(s+1,s+n+1,cmp);
for(i=1;i<=n;i++)
{
if(s[i].x!=s[i-1].x||s[i].y!=s[i-1].y||s[i].z!=s[i-1].z) s1[++nn]=s[i].y,s2[nn]=s[i].z;
ss[nn]++;
}
dfs(1,nn);
for(i=1;i<=nn;i++) sta[ans[i]+ss[i]-1]+=ss[i];
for(i=0;i<n;i++) printf("%d\n",sta[i]);
return 0;
}
【BZOJ3262】陌上花开 cdq分治的更多相关文章
- bzoj3262陌上花开 cdq分治
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2794 Solved: 1250[Submit][Status][Discus ...
- bzoj3262陌上花开 cdq分治入门题
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
- bzoj3262 陌上花开 cdq分治(入门)
题目传送门 思路:cdq分治处理偏序关系的模板题,主要就是学cdq分治吧,还在入门中. 代码其实也很好理解,记得树状数组操作的上限是 z的最大值,不是n的最大值,这个细节wa了好久. #include ...
- bzoj3262 陌上花开——CDQ分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 第一道CDQ分治题! 看博客:https://www.cnblogs.com/Narh ...
- 【学术篇】bzoj3262 陌上花开. cdq分治入门
花儿们已经很累了-- 无论是花形.颜色.还是气味, 都不是为了给人们摆出来欣赏的, 更不是为了当做出题的素材的, 她们并不想自己这些属性被没有生命的数字量化, 并不想和其它的花攀比, 并无意分出个三六 ...
- BZOJ3262:陌上花开(CDQ分治)
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...
- [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)
题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
随机推荐
- c#生成rsa公钥和私钥
c#生成rsa公钥和私钥的类库,包括加密解密,可以用在网站和winform项目 源码地址: http://download.csdn.net/detail/jine515073/8383809
- Logrotate日志轮巡missingok: 在日志轮循期间,任何错误将被忽略
Linux日志文件总管——logrotate 编译自:http://xmodulo.com/2014/09/logrotate-manage-log-files-linux.html ...
- LINQ操作符三:限制操作符
where是限制操作符,它将过滤标准应用在序列上,按照提供的逻辑对序列中的数据进行过滤. where操作符不启动查询的执行.当开始对序列进行遍历时才开始执行,此时过滤条件将被应用到查询中. 示例: / ...
- Laravel 多where组合
$model=DB::table("user"); foreach($request as $value){ if($value->name){ $model->whe ...
- js学习笔记12----json数据格式,语法,遍历
1.json数据格式:var json={} 示例一: var user = {'name':'sese','age':'24','sex':'女'} console.log(user.age); / ...
- 获取页面中更新删除传过来的id
利用uri辅助函数 $id=$this->uri->segment(4); 其中segment(参数) 是表示你要截取获得第几个数据.
- 【转】Mac下升级python2.7到python3.6
1. 前言 Mac系统自带python2.7,本文目的是将自带的python升级到3.6版本. 网上有本多的做法是让python2.7和python3.X两个版本共存,博主并不知道,是两版本共存好,还 ...
- thinkphp 前台测试
配置文件 <?php return array( 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => 'localhost', // 服务器地址 ...
- 第三百一十七节,Django框架,缓存
第三百一十七节,Django框架,缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返 ...
- 【Java面试题】18 java中数组有没有length()方法?string没有lenght()方法?下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
数组没有length()这个方法,有length的属性.String有有length()这个方法. int a[]; a.length;//返回a的长度 String s; s.length();// ...