暴力求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的更多相关文章

  1. [LeetCode] Convex Polygon 凸多边形

    Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...

  2. Leetcode: Convex Polygon

    Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...

  3. 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/ ...

  4. 关于shape_trans (ConnectedRegions, ConvexRegions, 'convex')的作用于对比

    * crystal.hdev: extraction of hexagonally shaped crystals via local thresholding and region post-pro ...

  5. 论文阅读之 A Convex Optimization Framework for Active Learning

    A Convex Optimization Framework for Active Learning Active learning is the problem of progressively ...

  6. 凸包(Convex Hull)构造算法——Graham扫描法

    凸包(Convex Hull) 在图形学中,凸包是一个非常重要的概念.简明的说,在平面中给出N个点,找出一个由其中某些点作为顶点组成的凸多边形,恰好能围住所有的N个点. 这十分像是在一块木板上钉了N个 ...

  7. convex optimization

    ##凸优化总结所有这些想法基本是来自于书籍[convex optimization](http://book.douban.com/subject/1888111/),主要包括凸优化的基本理论,主要的 ...

  8. Convex Hull 实现理论+自制Python代码

    Convex Hull 概述 计算n维欧式空间散点集的凸包,有很多的方法.但是如果要实现快速运算则其难点在于:如何快速判断散点集的成员是否是在凸集的内部.如果可以简化判断的运算过程,则可以极大简化迭代 ...

  9. Convex(扫描线降维)

    Convex Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. 使用CEF(四)— 在QT中集成CEF(1):基本集成

    QT作为C++下著名的跨平台软件开发框架,实现了一套代码可以在所有的操作系统.平台和屏幕类型上部署.我们前几篇文章讲解了如何构建一款基于CEF的简单的样例,但这些样例的GUI都是使用的原生的或者是控件 ...

  2. VirtualBox上安装Debian10个人备忘笔记

    准备 VirtualBox 下载链接:Downloads – Oracle VM VirtualBox,下载完成后安装即可. Debian 下载链接:通过 HTTP/FTP 下载 Debian CD/ ...

  3. 题解 有标号DAG计数

    题目传送门 题目大意 给出\(n\),求出对于任意\(t\in[1,n]\),点数为\(t\)的弱联通\(\texttt{DAG}\)个数.答案对\(998244353\)取模. \(n\le 10^ ...

  4. 题解 [BJOI2017]开车

    题目传送门 题目大意 有\(n\)个汽车和\(n\)个加油站,坐标分别为\(a_{1,2,...,n}\)和\(b_{1,2,...,n}\).每辆汽车会到一个加油站,求出最小移动距离之和.有\(m\ ...

  5. pandas 取 groupby 后每个分组的前 N 行

    原始数据如下: (图是从 excel 截的,最左1行不是数据,是 excel 自带的行号,为了方便说明截进来的) 除去首行是标题外,有效数据为 28行 x 4列 目前的需求是根据 partition ...

  6. 免费 CDN 玩法 —— 文件一键上传到 NPM

    前言 unpkg.jsdelivr 等站点可加速 NPM 包文件,适合作为个人网站或演示案例的免费 CDN. 虽然上传文件到 NPM 很简单,创建 package.json 然后 npm publis ...

  7. 敏捷 Scrum Master 的難點

    什麼是 Scrum Master? Scrum master 是一個團隊角色,負責確保團隊遵守敏捷方法和原則並符合團隊的流程和實踐. Scrum Master 促進敏捷開發團隊成員之間的協作.Scru ...

  8. Coursera Deep Learning笔记 改善深层神经网络:优化算法

    笔记:Andrew Ng's Deeping Learning视频 摘抄:https://xienaoban.github.io/posts/58457.html 本章介绍了优化算法,让神经网络运行的 ...

  9. 常用Java API:大数类

    摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1, 对应的十进制数是9223372036854775807,也就是说只要运算过程中会超过这个数,就会造成数据溢出,从而造成错 ...

  10. Windows 2008 R2 NTP 时钟同步配置

    一.配置 本地组策略 a.windows+R 或  "开始菜单"  | "运行"  ,打开运行窗口. 输入gpedit.msc打开本地组策略 b.在 本地组策略 ...