[cf1434E]A Convex Game
暴力求SG,结论:每一个序列的SG上限为$\sqrt{2\max a_{i}}+1$
证明:将SG的转移看作一张DAG,归纳每一个点的SG值不超过其开始的最长路,显然成立
那么本题中最长路即在$a_{i}$中最多能选多少次,假设选择的权值依次为$v_{1},v_{2},...,v_{m}$,则$v_{i+1}-v_{i}\ge i$,累加即$v_{m}-v_{1}\ge \frac{m(m-1)}{2}$,放缩得$(m-1)^{2}<2v_{m}$,$m$也即SG的上限为$\sqrt{2\max a_{i}}+1$
考虑dp,令$f_{i,j}$表示最后两次分别选了$a_{i}$和$a_{j}$的SG值,转移为$f_{i,j}=mex(\{f_{k,i}|a_{k}-a_{i}>a_{i}-a_{j}\})$,利用$k$的单调性,倒序枚举$j$,可以做到$o(n^{2})$,最终答案即为$mex(\{f_{i,0}|1\le i\le n\})$
令$g_{i,j}=\min_{f_{i,k}>j}k$,根据上面的结论,$g$的总数量为$o(n\sqrt{n})$,考虑直接转移$g$
根据单调性,有$g_{i,j}\ge g_{i,j-1}$,这也就保证了$f_{i,g_{i,j}}$后面的集合包含了$[1,j)$,同时$j$也需要出现,因此即要求$\exists k,a_{g_{i,j}}>2a_{i}-a_{k}且f_{k,i}=j$,后者又等价于$g_{k,j-1}\le i<g_{k,j}$,贪心求出满足后者的$k$中最大值即可
考虑先枚举$j$,维护线段树,每一次先查询$i$上的值并判断,再令区间$[g_{i,j-1},g_{i,j})$的值对$i$取max,时间复杂度为$o(n\sqrt{n}\log_{2}n)$,略微卡常
进一步优化,由于插入的区间单调递增,因此可以看作对未被修改的部分修改,维护两个并查集,分别表示:1.上一个未被覆盖的点;2.同一种类型的上一个点,时间复杂度为$o(n\sqrt{n}\alpha(n))$

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 int t,n,ans,a[N],f[2][N],fa[N],pre[N],v[N];
8 int find(int k){
9 if (fa[k]==k)return k;
10 return fa[k]=find(fa[k]);
11 }
12 int get_pre(int k){
13 if (k==pre[k])return k;
14 return pre[k]=get_pre(pre[k]);
15 }
16 void update(int l,int r,int x){
17 r=get_pre(r);
18 if (v[r])r--;
19 if (l>r)return;
20 while (1){
21 int nex=get_pre(r-1);
22 if (v[nex])nex--;
23 if (nex<l){
24 v[r]=x;
25 return;
26 }
27 fa[r]=nex;
28 r=nex;
29 }
30 }
31 void merge(int l,int r){
32 if ((r<=n)&&(pre[r+1]==r+1)&&(v[r+1]))pre[r+1]=r;
33 r=get_pre(r);
34 while (l<r){
35 pre[r]=r-1;
36 r=get_pre(r-1);
37 }
38 if ((l==r)&&(l>1)&&(v[get_pre(l-1)]))pre[r]=r-1;
39 }
40 int query(int k){
41 return v[find(k)];
42 }
43 int main(){
44 scanf("%d",&t);
45 while (t--){
46 scanf("%d",&n);
47 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
48 int s=0,p=0,flag=0;
49 for(int i=1;i<=n;i++)f[p][i]=1;
50 while (!flag){
51 flag=1;
52 s++;
53 p^=1;
54 for(int i=1;i<=n;i++){
55 fa[i]=pre[i]=i;
56 v[i]=0;
57 }
58 for(int i=n;i;i--){
59 int k=query(i);
60 if(!k)f[p][i]=n+1;
61 else f[p][i]=upper_bound(a+1,a+n+1,2*a[i]-a[k])-a;
62 if (f[p^1][i]>=f[p][i])f[p][i]=f[p^1][i];
63 else{
64 update(f[p^1][i],f[p][i]-1,i);
65 merge(f[p^1][i],f[p][i]-1);
66 }
67 if (f[p][i]<=n)flag=0;
68 }
69 }
70 ans^=s;
71 }
72 if (ans)printf("YES");
73 else printf("NO");
74 }
[cf1434E]A Convex Game的更多相关文章
- [LeetCode] Convex Polygon 凸多边形
Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...
- Leetcode: Convex Polygon
Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...
- low-rank 的相关求解方法 (CODE) Low-Rank Matrix Recovery and Completion via Convex Optimization
(CODE) Low-Rank Matrix Recovery and Completion via Convex Optimization 这个是来自http://blog.sina.com.cn/ ...
- 关于shape_trans (ConnectedRegions, ConvexRegions, 'convex')的作用于对比
* crystal.hdev: extraction of hexagonally shaped crystals via local thresholding and region post-pro ...
- 论文阅读之 A Convex Optimization Framework for Active Learning
A Convex Optimization Framework for Active Learning Active learning is the problem of progressively ...
- 凸包(Convex Hull)构造算法——Graham扫描法
凸包(Convex Hull) 在图形学中,凸包是一个非常重要的概念.简明的说,在平面中给出N个点,找出一个由其中某些点作为顶点组成的凸多边形,恰好能围住所有的N个点. 这十分像是在一块木板上钉了N个 ...
- convex optimization
##凸优化总结所有这些想法基本是来自于书籍[convex optimization](http://book.douban.com/subject/1888111/),主要包括凸优化的基本理论,主要的 ...
- Convex Hull 实现理论+自制Python代码
Convex Hull 概述 计算n维欧式空间散点集的凸包,有很多的方法.但是如果要实现快速运算则其难点在于:如何快速判断散点集的成员是否是在凸集的内部.如果可以简化判断的运算过程,则可以极大简化迭代 ...
- Convex(扫描线降维)
Convex Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
随机推荐
- 每日总结:charcter方法(2021.10.5)
\t 在文中该处插入一个tab键 \b在文中该处插入一个后退键 \n 换行 \r 在文中该处回车 \f 在文中该处插入换页符 方法: isLetter()是否是一个字母 isDigit()是否是一个 ...
- javascript-jquery的基本方法
1.去除字符串中两端的空格$.trim(str) var str1=" 123 " $.trim(str1);//123 2.遍历对象的数据并进行操作$.each(obj,func ...
- python查询对像所有方法
鉴于学习时好多参数对像都不知道是什么玩意有什么方法,搜了半天一个 """arg为一个对像,下面是打印所有对像方法"""for i, func ...
- Scrum Meeting 11
第11次例会报告 日期:2021年06月01日 会议主要内容概述: 汇报了进度,开始爆肝. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下记录仅为保证公开性: ...
- 一个C#开发搭建Android框架的心路历程
前言 Java框架实在是太多了,因为是初学乍练,所以,只好以百度为标准选择框架了. Java的框架文章太难写了,因为他引用了太多框架,而没一个框架都有很繁琐的配置,把每个框架都写一遍,就等于写书了:所 ...
- 数字设计中的时钟与约束(gate)
转载:https://www.cnblogs.com/IClearner/p/6440488.html 最近做完了synopsys的DC workshop,涉及到时钟的建模/约束,这里就来聊聊数字中的 ...
- Qt信号与槽传递自定义数据类型——两种解决方法
信号与槽作为qt中的核心机制,在qt应用开发中经常会用的,但是原生的信号与槽连接传参,只支持基本的数据类型,比如char,int, float,double. 如果想要在信号与槽之间传递自定义参数,比 ...
- RocketMQ源码详解 | Broker篇 · 其二:文件系统
概述 在 Broker 的通用请求处理器将一个消息进行分发后,就来到了 Broker 的专门处理消息存储的业务处理器部分.本篇文章,我们将要探讨关于 RocketMQ 高效的原因之一:文件结构的良好设 ...
- Django项目部署到阿里云服务器无法发送邮件,发送邮件超时问题解决
前言 今天, 博主将写了好久的一个Django小项目尝试在阿里云部署上线,由于项目中需要发送邮件,博主调用了163邮箱接口,在本地测试邮件功能正常,可是上线后,邮件功能一直超时崩溃.在百度一番查资料后 ...
- JavaScript高阶函数之filter、map、reduce
JavaScript高阶函数 filter(过滤) 用法: 用于过滤,就是把数组中的每个元素,使用回调函数func进行校验,回调函数func返回一个布尔值,将返回值为 true 的元素放入新数组 参数 ...