241. 楼兰图腾(树状数组) 逃离我推掉我的手 2021-11-11 13:02 256阅读 0赞 题目链接: [https://www.acwing.com/activity/content/6/][https_www.acwing.com_activity_content_6] 在完成了分配任务之后,西部314来到了楼兰古城的西部。 相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(‘V’),一个部落崇拜铁锹(‘∧’),他们分别用V和∧的形状来代表各自部落的图腾。 西部314在楼兰古城的下面发现了一幅巨大的壁画,壁画上被标记出了N个点,经测量发现这N个点的水平位置和竖直位置是两两不同的。 西部314认为这幅壁画所包含的信息与这N个点的相对位置有关,因此不妨设坐标分别为(1,y1),(2,y2),…,(n,yn) ,其中y1~yn 是1到n的一个排列。 西部314打算研究这幅壁画中包含着多少个图腾。 如果三个点(i,yi),(j,yj),(k,yk) 满足1≤i<j<k≤n且yi>yj,yj<yk ,则称这三个点构成V图腾; 如果三个点(i,yi),(j,yj),(k,yk) 满足1≤i<j<k≤n且yi<yj,yj>yk ,则称这三个点构成∧图腾; 西部314想知道,这n个点中两个部落图腾的数目。 因此,你需要编写一个程序来求出V的个数和∧的个数。 输入格式 第一行一个数n。 第二行是n个数,分别代表y1,y2,…,yn 。 输出格式 两个数,中间用空格隔开,依次为V的个数和∧的个数。 数据范围 对于所有数据,n≤200000 ,且输出答案不会超过int64。 输入样例: 5 1 5 3 2 4 输出样例: 3 4 分析: 看到题目,自然而然的相到排序了。其实这个题目,已经是简化版本了。 我们可以把y2当作一个关键点考虑。 首先,我们考虑V。 首先,y1>y2 并且 y3>y2.然后x1<x2<x3。观察这个,我们发现好像就是在x有序的时候,y是一个序列。我们找到对于每个y值左边大于y的个数Left,和右边大于y的个数RIght。 然后,以这个y为V 底的个数就是Left\* Right。 同理,考虑^。 #include"stdio.h" #include"string.h" #include"algorithm" using namespace std; typedef long long ll; int n; int a[200100],left[200100],right[200100]; int Left[200100],Right[200100]; int C[200100]; int lowbit(int x) { return x & (-x); } int ask(int x) { int sum = 0; while(x > 0) { sum += C[x]; x = x - (lowbit(x)); } return sum; } void add(int x,int v) { for(int i = x; i <= n; i+= lowbit(i)) { C[i] += v; } } int main() { scanf("%d",&n); for(int i = 1; i <= n;i ++) { scanf("%d",&a[i]); left[i] += ask(a[i] - 1); add(a[i],1); } for(int i = 1; i <= n;i ++) C[i] = 0; for(int i = n;i >= 1;i --) { right[i] = ask(a[i] - 1); add(a[i],1); } ll cnt = 0; for(int i = 1; i <= n;i ++) { cnt += (ll)left[i] * right[i]; } for(int i = 1; i <= n; i ++) C[i] = 0; for(int i = 1; i <= n;i ++) { Left[i] += (ll)ask(n) - ask(a[i]); add(a[i],1); } for(int i = 1; i <= n;i ++) C[i] = 0; for(int i = n; i >= 1;i --) { Right[i] += ask(n) - ask(a[i]); add(a[i],1); } ll cont = 0; for(int i = 1; i <= n;i ++) { cont += (ll)Left[i] * Right[i]; } printf("%lld %lld\n",cont,cnt); } [https_www.acwing.com_activity_content_6]: https://www.acwing.com/activity/content/6/
相关 树状数组 详细介绍:[https://www.cnblogs.com/xenny/p/9739600.html][https_www.cnblogs.com_xenny_p_973960 我不是女神ヾ/ 2023年08月17日 16:26/ 0 赞/ 100 阅读
相关 狼图腾 1:没有捕捉不到的猎物,就看你有没有野心去捕;没有完成不了的事情,就看你有没有野心去做。 2:没有猎物我们就去寻找猎物,发现猎物我们就去追逐猎物。寻找、发现、追求、获得— 今天药忘吃喽~/ 2022年08月27日 11:42/ 0 赞/ 167 阅读
相关 树状数组 1、概述 树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组\{a 朱雀/ 2022年08月10日 10:53/ 0 赞/ 234 阅读
相关 树状数组 树状数组 树状数组:用线性数据结构的方法解决动态统计子树权和的问题。 类似于线段树,将区间分成小段,方便计算权和。 举个栗子,将a数组构造成树状数组c。 如果a 忘是亡心i/ 2022年07月26日 08:44/ 0 赞/ 220 阅读
相关 树状数组模板 include <stdio.h> include <string.h> int n, c[100004]; int lo 阳光穿透心脏的1/2处/ 2022年06月16日 01:58/ 0 赞/ 212 阅读
相关 树状数组模板 1. int lowbit(int t) 2. `{` 3. `return t&(-t);` 4. `}` 1. `void add(int x,int y)` 水深无声/ 2022年05月31日 10:42/ 0 赞/ 230 阅读
相关 树状数组 树状数组单点修改,单点查询 洛谷oj :[点我][Link 1] 模板: include<iostream> include<cstdio> 心已赠人/ 2022年05月16日 05:17/ 0 赞/ 261 阅读
相关 树状数组板子 树状数组 重点是在树状的数组 大家都知道二叉树吧 叶子结点代表A数组A\[1\]~A\[8\] ![786945-20161206222443741-120171603 r囧r小猫/ 2022年03月15日 15:22/ 0 赞/ 273 阅读
相关 241. 楼兰图腾(树状数组) 题目链接: [https://www.acwing.com/activity/content/6/][https_www.acwing.com_activity_content 逃离我推掉我的手/ 2021年11月11日 13:02/ 0 赞/ 257 阅读
相关 树状数组模板 \define lowbit(x) (x&(-x)) int c\[Max\], n;//n为元素个数 void add(int x, int v)//单点给元素+ 朱雀/ 2021年07月16日 14:44/ 0 赞/ 406 阅读
还没有评论,来说两句吧...