[BZOJ3262] 陌上花开

2024-01-09 12:49
文章标签 bzoj3262 陌上

本文主要是介绍[BZOJ3262] 陌上花开,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

http://www.lydsy.com/JudgeOnline/problem.php?id=3262

题目大意

(xi,yi,zi)xi<=xj,yi<=yj,zi<=zji<j,

题解

三维偏序
cdq分治
我们对三维按x为第一关键字,y为第二关键字.z为第三关键字排序
这样我们得到的每个点前面的点x那维一定小于等于自己
然后我们分治y那维,这个过程类似归并排序的过程
对于我们分治时相邻的区间,我们把两个区间内的点只看y那维合并成一个区间
对于左边的区间会对右边区间产生贡献(因为x值<=右边的任意一个)
这个贡献我们把他们的z值插进树状数组中
当右区间指针的点因为比左区间指针的点而踢出时,查询树状数组中小于等于它z值得点个数
这样就可以优化掉一位
不清楚的画图看看,注意相同的先和成一个点,插进树状数组时是sum值不是1,每次树状数组要清0

typedata=recordx,y,z,num,ans:longint; end;
vart,temp:array[0..100005]of data;bite,ans:array[0..200005]of longint;i,j,k:longint;n,m,s:longint;
procedure sort(l,r:longint);
var i,j,a,b,c:longint; d:data;
begini:=l; j:=r; a:=t[(l+r) div 2].x; b:=t[(l+r)div 2].y; c:=t[(l+r)div 2].z;repeatwhile (t[i].x<a)or((t[i].x=a)and(t[i].y<b))or((t[i].x=a)and(t[i].y=b)and(t[i].z<c)) do inc(i);while (a<t[j].x)or((t[j].x=a)and(t[j].y>b))or((t[j].x=a)and(t[j].y=b)and(t[j].z>c)) do dec(j);if not(i>j) thenbegind:=t[i]; t[i]:=t[j]; t[j]:=d;inc(i); dec(j);end;until i>j;if l<j then sort(l,j);if i<r then sort(i,r);
end;procedure update(a,b:longint);
var tt:longint;
begintt:=a;while tt<=s dobegininc(bite[tt],b);inc(tt,tt and (-tt));end;
end;function query(a:longint):longint;
var tt,sum:longint;
begintt:=a; sum:=0;while tt>0 dobegininc(sum,bite[tt]);dec(tt,tt and (-tt));end;exit(sum);
end;procedure cdq(l,r:longint);
var i,j,k,mid,len:longint;
beginif l=r then exit;mid:=(l+r)>>1;cdq(l,mid); cdq(mid+1,r);i:=l; j:=mid+1; len:=l;while (i<=mid)and(j<=r) dobeginif (t[i].y<=t[j].y)then begin update(t[i].z,t[i].num); temp[len]:=t[i]; inc(i); inc(len); continue; endelse begin inc(t[j].ans,query(t[j].z)); temp[len]:=t[j]; inc(j); inc(len); end;end;for k:=j to r dobegin inc(t[k].ans,query(t[k].z)); temp[len]:=t[k]; inc(len); end;for k:=l to mid doif k>=ithen begin temp[len]:=t[k]; inc(len); endelse update(t[k].z,-t[k].num);for i:=l to r dot[i]:=temp[i];
end;beginreadln(n,s);for i:=1 to n doreadln(t[i].x,t[i].y,t[i].z);sort(1,n); {t[i].x}m:=0; t[0].x:=0; t[0].y:=0; t[0].z:=0;for i:=1 to n dobegin t[i].ans:=0; t[i].num:=0; end;for i:=1 to n doif (t[i].x=t[i-1].x)and(t[i].y=t[i-1].y)and(t[i].z=t[i-1].z)then inc(t[m].num)else begin inc(m); t[m]:=t[i]; t[m].num:=1; end;cdq(1,m);fillchar(ans,sizeof(ans),0);for i:=1 to n doinc(ans[t[i].ans+t[i].num-1],t[i].num);for i:=0 to n-1 dowriteln(ans[i]);
end.

这篇关于[BZOJ3262] 陌上花开的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/587168

相关文章

陌上花开,聆听那一曲旧时光的伤

流年的风景划过眼前,陌上的花儿已开,陌上人却早已不在。只能躲在角落聆听一首旧时光里的伤。 ——锦瑟柠檬 【一】 我一直以为,既是被上苍安排到了尘世,生而为人,就免不了在人间应景。这世上应景的,又何止是人,凡尘万物皆如此。草木山石、飞禽虫蚁,都有其无法推卸的使命。它们的到来,也许有前世今生之约,为了某个人,为了某种生物。我相信,每一段缘分,每一个故事,都意义非凡,耐人寻味。 时常生出一种预感,今生,

[BZOJ3262] 陌上花开 —— CDQ三维分治

Description 有n朵花,每朵花有三个属性:花形(s)、颜色©、气味(m),用三个整数表示。 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。 定义一朵花A比另一朵花B要美丽,当且仅Sa>=Sb,Ca>=Cb,Ma>=Mb。 显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。 Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <

马思维二十四小时语音_陌上纤尘:一天内语音写作17小时完成20万字的感想

作者:陌上纤尘 放飞灵魂的产品工程师 有趣有温度的梦想实践家 菁灵族晨型人部落的创始人 一件事有没有意义,在于赋予了它什么意义。——陌上纤尘 如果说,有什么东西是世界上最公平的事物?那一定是时间。 每个人一天只有24小时,每个人都会用24小时度过不一样的一天。 注意力在哪里,成果就在哪里。 2019年3月2日,我用17小时做了一件事。 挑战一天语音写作20万字。 从5:00到22:40,痛并

红尘陌上,为谁一抹忧伤:QQ伤感日志

红尘陌上,为谁一抹忧伤:QQ伤感日志 — 红尘陌上,为谁一抹忧伤:QQ伤感日志   月影朦胧,星倦无声,夜已深了。我却毫无睡意,独守荧幕缕一丝月夜的缱倦与孤寂,凝思你的身影。   千朝相思红颜老,岁月流芳心已碎。舞着心绪在子夜独醉,看似无意却泪眼纷飞。寂冷的月下声声的轻叹,心绪轻舞薄如纱翼的思念,眼帘环绕每个有你的片段。不愿承认自己心已沉沦,却早已与你紧紧相随,不曾想过自己会迷失自己,走

[BZOJ3262]陌上花开 CDQ+树状数组

三维的有序 第一维排序 第二维CDQ 第三维树状数组  注意要把完全相同的两个点合在一起 他们都互相比对方美丽 #include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<queue>#define SF scanf#define PF printf#define lowbit(

[bzoj3262][cdq分治][树状数组]陌上花开

Description 有n朵花,每朵花有三个属性:花形(s)、颜色(c)、气味(m),用三个整数表示。 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。 定义一朵花A比另一朵花B要美丽,当且仅Sa>=Sb,Ca>=Cb,Ma>=Mb。 显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。 Input 第一行为N,K (1 <= N <= 100,0