文章目录

  • 1. 树状数组维护
  • 2.线段树维护

题目描述
艾洛喜欢吃甜食,他有n个甜甜圈,现在叠成了两叠(如下图所示),第一叠有 n1n1n1个,第二叠有 n2n2n2个 (n1+n2=n)(n1+n2=n)(n1+n2=n),要解决的问题如下:

  • ​ 每个甜甜圈都有一个唯一的甜度值sis_isi​,甜度值两两不同;
  • ​ 每次艾洛可以把任意一叠位于顶端的一个甜甜圈移动到另一叠顶端,若该甜甜圈是当前所有甜甜圈中最甜的(甜度值最大),那么艾洛不会移动甜甜圈,而是直接吃掉;

请你求出艾洛吃完所有甜甜圈的最小移动步数;

输入描述:

第一行,两个正整数n1,n2(1≤n1+n2≤100000)n1,n2 (1≤n1+n2≤100000)n1,n2(1≤n1+n2≤100000),分别表示两叠甜甜圈的个数。
第二行,n1n1n1个整数,按从顶到底的顺序排列,表示第一叠甜甜圈的甜度值。
第三行,n2n2n2个整数,按从顶到底的顺序排列,表示第二叠甜甜圈的甜度值。
保证1≤si≤6∗1061≤si≤6∗10^61≤si≤6∗106且两两互不相同。

输出描述:

总共一行,一个整数,表示最少步数。

输入

3 3
1 4 5
2 7 3

输出

6
1. 树状数组维护
#include <bits/stdc++.h>
using namespace std;
#define MAIN signed main()
#define int long long
const int maxn = 1e5+5;struct Node {int v,pos;
}a[maxn*2];int C[maxn*2]; //树状数组
int n;
int query(int i)
{int ans = 0;while(i > 0){ans += C[i];i -= i & -i;}return ans;
}void update(int i,int x)
{while(i <= n){C[i] += x;i += i & -i;}
}MAIN
{int n1,n2;scanf("%lld%lld",&n1,&n2);n = n1 + n2;for(int i=n1;i>=1;--i) //反向存储 {scanf("%lld",&a[i].v);a[i].pos = i;update(i,1);}for(int i=n1+1;i<=n1+n2;++i) //正向存储 Value and index {scanf("%lld",&a[i].v);a[i].pos = i;update(i,1);}sort(a+1,a+n+1,[](Node a,Node b){return a.v > b.v;});int p = a[1].pos;//分界线 update(a[1].pos,-1);int res = p > n1 ? (p - n1 - 1): (n1 - p);for(int i=2;i<=n;++i){update(a[i].pos,-1);//减去1 变0 int q = abs(query(a[i].pos) - query(p)); //queryres += q;p = a[i].pos;}printf("%lld\n",res);return 0;
}
2.线段树维护
#include <bits/stdc++.h>
using namespace std;
#define MAIN signed main()
#define int long long
const int maxn = 1e5+5;int n;struct Node {int v,pos;
}a[maxn*2];struct tree{int l ,r;int v;
}tr[maxn*8];void pushup(int u)
{tr[u].v = tr[u<<1].v + tr[u<<1|1].v;
}void build(int u,int l,int r)
{tr[u] = {l,r};if(l == r){tr[u] = {l,r,1};return;}int mid = l + r >> 1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);pushup(u);
}void modify(int u,int x,int v)
{if(tr[u].l==x && tr[u].r == x){tr[u].v = v;return;}int mid = tr[u].l + tr[u].r >> 1;if(x <= mid) modify(u<<1,x,v);else modify(u<<1|1,x,v);pushup(u);
}
///查询一个区间的属性
int query(int u,int l,int r)
{if(l > r) swap(l,r);if(l <= tr[u].l && tr[u].r <= r)return tr[u].v;int mid = tr[u].l + tr[u].r >> 1;int res = 0;if(l <= mid) res +=query(u<<1,l,r);if(r >  mid) res += query(u<<1|1,l,r);return res;
}MAIN
{int n1,n2;scanf("%lld%lld",&n1,&n2);n = n1 + n2;build(1,1,n);for(int i=n1;i>=1;--i) //反向存储 {scanf("%lld",&a[i].v);a[i].pos = i;modify(1,i,1);}for(int i=n1+1;i<=n1+n2;++i) //正向存储 Value and index {scanf("%lld",&a[i].v);a[i].pos = i;modify(1,i,1);}sort(a+1,a+n+1,[](Node a,Node b){return a.v > b.v;});int p = a[1].pos;//分界线 modify(1,a[1].pos,0);int res = p > n1 ? (p - n1 - 1): (n1 - p);for(int i=2;i<=n;++i){modify(1,a[i].pos,0);//减去1 变0 int q = abs(query(1,a[i].pos,p)); //queryres += q;p = a[i].pos;}printf("%lld\n",res);return 0;
}

甜甜圈(树状数组)(线段树)相关推荐

  1. D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)

    English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...

  2. HDU 1556 前缀和 树状数组 线段树

    解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数  对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...

  3. jzoj3854-分组【树状数组,线段树】

    正题 题目链接:https://jzoj.net/senior/#contest/show/2990/2 题目大意 一个小队满足要求 队长的地位最高 所有队员和队长的年龄差不超过kkk 给出nnn个人 ...

  4. 模板三连击:树状数组+线段树+主席树

    没事儿干,复习模板...... 1.树状数组 本来不想写这个的,但是反正就几分钟就打完了,所以就写了,水AC数. 洛谷 P3374 [模板]树状数组 1 1 #include<cstdio> ...

  5. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  6. CCF201709-5 除法(100分)【树状数组+线段树】

    试题编号: 201709-5 试题名称: 除法 时间限制: 10.0s 内存限制: 256.0MB 问题描述: 问题描述 小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次 ...

  7. POJ2182 HDU2711 Lost Cows【树状数组+线段树】

    Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17113 Accepted: 10664 Descripti ...

  8. P2357 守墓人(树状数组/线段树)

    题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然..... 因为....守墓人 ...

  9. 差分+树状数组 线段树【P2357】 守墓人

    题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...

最新文章

  1. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式
  2. mybatis使用foreach进行批量保存
  3. centos7安装ansible
  4. flash cs3 代码提示 应该加强
  5. 如何直观理解拉格朗日乘子法与KKT条件
  6. Photo Size Changer三步压缩太大的jpg照片
  7. 定制问卷|表单收集系统-对接特殊接口(表单系统)
  8. 将cron表达式解析成中文,方便客户理解
  9. 惠普HP Laser 107a 打印机驱动
  10. 服务器主机密码忘记了怎么破解?
  11. mysql查询条件为空时不作为条件_怎么实现当查询值为空时,不作为查询条件
  12. html摄氏度转换华氏度,摄氏和华氏转换器-JavaScript
  13. 金蝶中间件公司CTO袁红岗
  14. 教您如何查看Win7详细系统版本号
  15. 今日头条面试——测试工程师
  16. spark封神之路(1)-spark简介
  17. lesson5画表情包
  18. Qt键盘事件(二)——长按按键反复触发event事件问题解决
  19. qq手机浏览器不支持HTML5,手机QQ浏览器:响应HTML5未来 着眼当下
  20. 【概念理解】typedef-Lnode-*Linklist

热门文章

  1. java jolt_Java使用Jolt连接Tuxedo服务器
  2. [原谅杯]Web部分WP
  3. delivery route配送路线
  4. 基于深度学习的视觉里程计算法
  5. Potplayer播放器“打开链接”卡住的解决方法
  6. oracle里面如何查询sqlid,CSS_oracle中如何查看sql, --查询表状态:select uo.O - phpStudy...
  7. JAVA日期转换YY和yy_转:如何在JAVA中使用日期
  8. ❓[杂谈小记]lean‘s LEDE or OPENWRT
  9. 大数据之电商推荐系统
  10. FMC150配置和使用(一)cdce72010