假设两个操作者分别为$A$和$B$,其中$A$希望最大、$B$希望最小

(并不默认$A$为整局游戏的先手,仅是最终的结果考虑$A$为先手时)

记第$i$个队列第$j$个元素为$a_{i,j}$(其中$1\le i\le k,1\le j\le n_{i}$)

特判$n_{i}=1$的队列,直接把队列中的元素加到最后的和中即可

当$k=1$时且$A$为先手时,答案为(为了方便,均省略$n_{1}$和$a_{1,i}$中的1)
$$
\begin{cases}\max(a_{\frac{n}{2}},a_{\frac{n}{2}+1})&(n\equiv 0(mod\ 2))\\\min(a_{\frac{n+1}{2}},\max(a_{\frac{n-1}{2}},a_{\frac{n+3}{2}}))&(n\equiv 1(mod\ 2))\end{cases}
$$
若$B$为先手,将$\max$和$\min$交换(改为另一种)即可

(正确性把所有情况一起按照$n$归纳即可)

下面,考虑若$A$可以选择哪一方为先手,此时$A$会选择谁(仍在$k=1$的基础上)

对两种情况分别讨论,不难得到$A$会在$n\equiv 0(mod\ 2)$时选择$A$,$n\equiv 1(mod\ 2)$时选择$B$

同理,$B$会在$n\equiv 0(mod\ 2)$时选择$B$,$n\equiv 1(mod\ 2)$时选择$A$

通俗的来说,即序列长度为偶数时双方会去操作,而奇数时双方希望对方先操作

(关于这个结论,仅仅是方便思考,并不能证明下面做法的正确性)

由此,当所有序列长度都为奇数,显然当先手操作某一个序列,后手都跟着操作即可,独立求出每一个序列的$A$为先手的答案并求和即可

对于长度为偶数的序列,双方的策略即先手选择一个长度为偶数的序列,后手选择另一个长度为偶数的序列,不断选择直至没有偶数的序列,最后根据奇偶性即可判定谁先选长度为奇数的序列

关于选择哪一个,显然按照两种情况的差值排序后贪心选择即可

总复杂度为$o(k\log k)$,可以通过

(正确性把所有情况一起按照$\sum_{i=1}^{k}n_{i}$归纳即可)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 vector<int>v,a[N];
5 int n,x,s,m[N];
6 long long ans;
7 int main(){
8 scanf("%d",&n);
9 for(int i=1;i<=n;i++){
10 scanf("%d",&m[i]);
11 if (m[i]==1){
12 scanf("%d",&x);
13 ans+=x;
14 i--,n--;
15 continue;
16 }
17 for(int j=1;j<=m[i];j++){
18 scanf("%d",&x);
19 a[i].push_back(x);
20 }
21 if (m[i]%2==0)s++;
22 }
23 if (s%2==0){
24 for(int i=1;i<=n;i++){
25 if (m[i]&1)ans+=min(a[i][m[i]/2],max(a[i][m[i]/2-1],a[i][m[i]/2+1]));
26 else{
27 int x=a[i][m[i]/2-1],y=a[i][m[i]/2];//最中间两个
28 ans+=min(x,y);
29 if (m[i]==2)v.push_back(abs(x-y));
30 else v.push_back(max(min(x,max(a[i][m[i]/2-2],y)),min(y,max(x,a[i][m[i]/2+1])))-min(x,y));
31 }
32 }
33 sort(v.begin(),v.end());
34 for(int i=1;i<s;i+=2)ans+=v[i];
35 printf("%lld",ans);
36 return 0;
37 }
38 for(int i=1;i<=n;i++){
39 if (m[i]&1)ans+=max(a[i][m[i]/2],min(a[i][m[i]/2-1],a[i][m[i]/2+1]));
40 else{
41 int x=a[i][m[i]/2-1],y=a[i][m[i]/2];
42 ans+=max(x,y);
43 if (m[i]==2)v.push_back(-abs(x-y));
44 else v.push_back(min(max(x,min(a[i][m[i]/2-2],y)),max(y,min(x,a[i][m[i]/2+1])))-max(x,y));
45 }
46 }
47 sort(v.begin(),v.end());
48 for(int i=1;i<s;i+=2)ans+=v[i];
49 printf("%lld",ans);
50 }

[atARC116F]Deque Game的更多相关文章

  1. C++ std::deque

    std::deque template < class T, class Alloc = allocator > class deque; Double ended queue deque ...

  2. collections 模块(namedtuple, deque, Counter )

    基本介绍 我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型 ...

  3. vector、list、deque三者比较

    1.vector是一段连续的内存块,而deque是多个连续的内存块,list是所有数据元素分开保存,可以是任何两个元素都没有连续. 2.vector的查询性能最好,并且的末端增加数据也很好,除非它重新 ...

  4. STL之deque

    deque是一种优化了的,对序列两段进行添加和删除操作的基本序列容器.它允许较为快速的随机访问,但它不像vector把所有对象保存在一块连续的内存块,而是采用多个连续的存储块.向deque两段添加或删 ...

  5. Deque的部分成员函数 解析,关于这个类,百度有很多解析,唯独没有其函数介绍

    函数 描述 c.assign(beg,end) c.assign(n,elem) 将[beg; end)区间中的数据赋值给c. 将n个elem的拷贝赋值给c. c.at(idx) 传回索引idx所指的 ...

  6. Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...

  7. 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuq ...

  8. 利用python的双向队列(Deque)数据结构实现回文检测的算法

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

  9. Python强化训练笔记(七)——使用deque队列以及将对象保存为文件

    collections模块中的deque对象是一个队列,它有着正常队列的先进先出原则.我们可以利用这个对象来实现数据的保存功能. 例如,现有一个猜数字大小的游戏,系统开始会随机roll点一个0-100 ...

随机推荐

  1. 《面试八股文》之 JVM 20卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...

  2. SAE助力南瓜电影7天内全面Severless

    作者:李刚(寻如),阿里云解决方案架构师 南瓜电影APP是国内领先的专注于影视精品化运营的垂直类视频产品,在移动互联网.IPTV.OTT等客户端,面向广大中产阶级精英群体,提供有异于院线及其他视频平台 ...

  3. HTML5元素背景知识

    目录 HTML5元素背景知识 语义与呈现分离 元素选用原则 少亦可为多 别误用元素 具体为佳,一以贯之 对用户不要想当然 元素说明体例 ol元素 元素速览 文档和元数据元素 文档和元数据元素 文本元素 ...

  4. Python - faker

    安装 faker pip install Faker pip install Dumper 设置生成器 from faker import Faker fake = Faker() 它可以通过访问以想 ...

  5. 靶场渗透CH4INRULZ_v1.0.1

    最新文章见我个人博客:点此 靶机环境下载地址:[下载] ova下载下来后直接导入virtualbox即可(https://www.vulnhub.com/entry/ch4inrulz-101,247 ...

  6. 安卓开发——WebView+Recyclerview文章详情页,解决高度问题

    安卓开发--WebView+Recyclerview文章详情页,解决高度问题 最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章,下面评论.出现了W ...

  7. CentOS 用户与群组

    目录 1.用户管理 1.1.切换用户 1.2.添加用户 1.3.删除用户 1.4.修改用户 2.群组管理 2.1.查看群组 2.2.添加群组 2.3.删除群组 2.4.修改群组 1.用户管理 Linu ...

  8. 一文看懂JVM内存区域分布与作用

    那么我们在开始介绍Java内存区域之前,我们先放一张内存区域的图,方便我们后面介绍的时候可以对照着看. 须知,本文是根据JDK8来介绍的. 程序计数器 首先它是线程私有的,它也称为代码的行号指示器,字 ...

  9. [no code][scrum meeting] Beta 12

    $( "#cnblogs_post_body" ).catalog() 例会时间:5月27日11:30,主持者:乔玺华 一.工作汇报 人员 昨日完成任务 明日要完成的任务 乔玺华 ...

  10. 常用JAVA API :HashSet 和 TreeSet

    set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E e)//如果容器中不包含此元素,则添加. clear()//清空 contain ...