Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest(dp+线段树)

题目链接

题意:

给定3个人互不相同的多个数字,可以把数字移动给别人,问最少移动几次后可以使第一个人的数字为1m1,第二个人m1m2,第三个人m2~n(可以没有数字)

题解:

设c[1][i]为第一个人m1为i时需要移动的次数,c[3][i]为m2为i是第三个人需要操作的次数,当其他两个人数字合法时,第二个人的数字也会合法.枚举第一个人的每个i,查询m2为(i+1~n+1)的最小操作次数,ans = min{c[1][i]+min(c[3]k)} 查询操作可用线段树维护

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 250000;
  4. int t[4*N],a[5][N],b[5][N],c[5][N];
  5. void build(int x,int l,int r)
  6. {
  7. if (l == r)
  8. {
  9. t[x] = c[3][l];
  10. return;
  11. }
  12. int mid = (l + r) >>1;
  13. build(x<<1,l,mid);
  14. build(x<<1|1,mid+1,r);
  15. t[x] = min(t[x<<1] , t[x<<1|1]);
  16. }
  17. int query(int x,int l,int r,int ll,int rr)
  18. {
  19. if (ll <= l && r <= rr) return t[x];
  20. int mid = (l + r) >> 1;
  21. int ans = 1<<30;
  22. if (ll <= mid) ans = min(ans,query(x<<1,l,mid,ll,rr));
  23. if (rr > mid ) ans = min(ans,query(x<<1|1,mid+1,r,ll,rr));
  24. return ans;
  25. }
  26. int main()
  27. {
  28. int k1,k2,k3;
  29. cin >> k1 >> k2 >> k3;
  30. int n = k1+k2+k3;
  31. memset(b,0,sizeof(b));
  32. memset(c,0,sizeof(c));
  33. for (int i = 1; i <= k1; i++)
  34. {
  35. cin >> a[1][i];
  36. b[1][a[1][i]] = 1;
  37. }
  38. for (int i = 1; i <= k2; i++) cin >> a[2][i];
  39. for (int i = 1; i <= k3; i++)
  40. {
  41. cin >> a[3][i];
  42. b[3][a[3][i]] = 1;
  43. }
  44. c[1][0] = k1;
  45. for (int i = 1; i <= n; i++)
  46. {
  47. b[1][i] = b[1][i-1]+b[1][i]; //记录第一个人前i个数中拥有几个
  48. c[1][i] = i - b[1][i] + k1 - b[1][i];//i-b[1][i]为需要移动到第一个人的操作数,k1-b[1][i]为第一个人把数移动出去的操作数
  49. }
  50. c[3][n+1] = k3;
  51. for (int i = n; i; i--)
  52. {
  53. b[3][i] = b[3][i+1] + b[3][i];
  54. c[3][i] = n-i+1-b[3][i] +k3 - b[3][i]-(k1-b[1][i-1]); //如果是第一个人可以移动到第三个人的数会重复需要减掉
  55. }
  56. for (int i = 1; i < n; i++)
  57. c[1][i] -= k3-b[3][i+1];//第三个人可以移动到第一个人的数
  58. build(1,0,n+1);
  59. int ans = c[1][n];
  60. for (int i = 0; i < n; i++)
  61. {
  62. ans = min(ans, c[1][i] + query(1,0,n,i+1,n+1));
  63. }
  64. cout << ans << endl;
  65. }

Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest的更多相关文章

  1. Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest dp

    E. The Contest A team of three programmers is going to play a contest. The contest consists of

  2. Educational Codeforces Round 76 (Rated for Div. 2)E(dp||贪心||题解写法)

    题:https://codeforces.com/contest/1257/problem/E 题意:给定3个数组,可行操作:每个数都可以跳到另外俩个数组中去,实行多步操作后使三个数组拼接起来形成升序 ...

  3. Educational Codeforces Round 76 (Rated for Div. 2)

    传送门 A. Two Rival Students 签到. Code /* * Author: heyuhhh * Created Time: 2019/11/13 22:37:26 */ #incl ...

  4. Educational Codeforces Round 76 (Rated for Div. 2) D. Yet Another Monster Killing Problem 贪心

    D. Yet Another Monster Killing Problem You play a computer game. In this game, you lead a party of

  5. Educational Codeforces Round 76 (Rated for Div. 2) C. Dominated Subarray 水题

    C. Dominated Subarray Let's call an array

  6. Educational Codeforces Round 76 (Rated for Div. 2) B. Magic Stick 水题

    B. Magic Stick Recently Petya walked in the forest and found a magic stick. Since Petya really likes ...

  7. Educational Codeforces Round 76 (Rated for Div. 2) A. Two Rival Students 水题

    A. Two Rival Students There are

  8. Educational Codeforces Round 76 (Rated for Div. 2) D题

    题意: 给你n个关卡,每个关卡有一个怪物,怪物的攻击力为a[i],你有n个英雄,每个英雄有一个攻击力,和疲劳值,只要英雄的攻击力比怪物的高就算打过了,同时疲劳减一,一天只能出战一个英雄,一个英雄可以打 ...

  9. Educational Codeforces Round 76 (Rated for Div. 2) D

    D题 原题链接 题意:就是给你n个怪兽有一个属性(攻击力),m个英雄,每个英雄有两种属性(分别为攻击力,和可攻击次数),当安排最好的情况下,最少的天数(每选择一个英雄出战就是一天) 思路:因为怪兽是不 ...

随机推荐

  1. notpad++使用cmd的快捷键设置

    notepad++运行批处理的设置: 运行 --> 输入运行程序名"$(FULL_CURRENT_PATH)" --> 保存(自定义的快捷键即可运行)

  2. MySQL数据库(三)

    前提要述:参考书籍<MySQL必知必会> 2.1 MySQL简介 2.1.1 什么是MySQL MySQL是一种关系数据库管理系统.负责数据库中数据的存储,检索,管理和处理. 2.1.2 ...

  3. 【Java基础总结】网络编程

    网络编程 InetAddress tcp udp

  4. 使用内存映射文件MMF实现大数据量导出时的内存优化

    前言 导出功能几乎是所有应用系统必不可少功能,今天我们来谈一谈,如何使用内存映射文件MMF进行内存优化,本文重点介绍使用方法,相关原理可以参考文末的连接 实现 我们以单次导出一个excel举例(csv ...

  5. FastOne专业计算平台助力生命科学研发

    11月16日,由AWS主办的云计算行业沙龙在中油阳光酒店举行,速石科技CEO陈熹就高性能计算如何助力生命科学领域发表了精彩的演讲. 面临的问题及挑战 在算力及高性能领域,随着行业客户的业务需求量,数据 ...

  6. 简单易学的Linux 命令整理

    Linux 是目前应用最广泛的服务器操作系统,基于 Unix,开源免费,由于系统的稳定性和安全性,市场占有率很高,几乎成为程序代码运行的最佳系统环境.linux 不仅可以长时间的运行我们编写的程序代码 ...

  7. 本地Git绑定Github仓库

    前言 Window的小伙伴如果还没在本地配好Git环境可以参考:https://www.cnblogs.com/poloyy/p/12185132.html 创建Github仓库 Github绑定本地 ...

  8. 编写自己的 GitHub Action,体验自动化部署

    本文将介绍如何使用 GitHub Actions 部署前端静态页面,以及如何自己创建一个 Docker 容器 Action. 简介 Actions GitHub Actions 是 GitHub 官方 ...

  9. Jenkins Job构建

    Jenkins job介绍 ​ Jenkins Freestyle与Pipeline Job区别 ​ ​ Jenkins Job构建配置 一 .环境准备 1.配置Jenkins server本地Git ...

  10. python简易计算器

    import re """ 过程:(最内部的括号->先乘除,替换->整理表达式->加减)->替换 """ def m ...