$dp$,字典树。

$dp$递推式很容易知道。dp[i]=max{dp[j]+1} a[j]^..^a[i]<=X,并且$[j,i]$长度不能超过$L$。

但是暴力来复杂度极高,所以需要用字典树维护这个东西。将前缀异或和插入到字典树中,然后不断维护$a[i]$位置之前$L$个前缀异或和就好了。

跑了$405ms$,第一次排到第一,有点激动~~~

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar(); x = ;while(!isdigit(c)) c = getchar();
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
} const LL mod=(LL);
const int maxn=;
LL a[maxn],X,P,Q;
int T,n,L,dp[maxn],h;
struct Node { int cnt,mx,nx[]; }s[*maxn];
int sz; bool fail,f[maxn]; int add()
{
s[sz].mx=; s[sz].cnt=;
s[sz].nx[]=s[sz].nx[]=-; sz++;
return sz-;
} void Delete(LL num)
{
int p=;
for(int i=;i>=;i--)
{
int x; LL g=(LL)(<<i); if(num&g) x=; else x=;
int t=p; p=s[p].nx[x]; s[p].cnt--;
if(s[p].cnt==) { s[t].nx[x]=-; return; }
}
} void Insert(LL num,int val)
{
int p=;
for(int i=;i>=;i--)
{
int x; LL g=(LL)(<<i); if(num&g) x=; else x=;
if(s[p].nx[x]==-) s[p].nx[x]=add();
p=s[p].nx[x]; s[p].cnt++; s[p].mx=max(s[p].mx,val);
}
} void Find(LL num)
{
int p=;
for(int i=;i>=;i--)
{
int x; LL g=(LL)(<<i); if(num&g) x=; else x=;
int y; if(X&g) y=; else y=; if(y==)
{
p=s[p].nx[x]; if(p==-) return;
if(i==) h=max(h,s[p].mx),fail=;
}
else
{
if(s[p].nx[x]!=-) h=max(h,s[s[p].nx[x]].mx),fail=;
p=s[p].nx[x^]; if(p==-) return;
if(i==) h=max(h,s[p].mx),fail=;
}
}
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%lld%d",&n,&X,&L);
scanf("%lld%lld%lld",&a[],&P,&Q);
for(int i=;i<=n;i++) a[i]=(a[i-]*P%mod+Q)%mod; sz=; s[sz].cnt=; s[sz].nx[]=s[sz].nx[]=-; sz++; for(int i=;i<=n;i++) f[i]=;
for(int i=;i<=n;i++)
{
if(i-L->=&&f[i-L-] ) Delete(a[i-L-]);
dp[i]=; a[i]=a[i]^a[i-]; if(a[i]<=X) dp[i]=;
h=; fail=; Find(a[i]); if(fail==) dp[i]=h+;
if(dp[i]!=) { Insert(a[i],dp[i]); f[i]=; }
} printf("%d\n",dp[n]);
}
return ;
}

HDU 5845 Best Division的更多相关文章

  1. 【HDU - 5845】Best Division(xor-trie、01字典树、dp)

    BUPT2017 wintertraining(15) #7E 题意 把数组A划分为k个区间,每个区间不超过L长度,每一个区间异或和之和为S.现在求:S不超过X,区间个数的最大值. 且A是这样给你的: ...

  2. 【HDU】3480 Division

    http://acm.hdu.edu.cn/showproblem.php?pid=3480 题意:一个n个元素的集合S要求分成m个子集且子集并为S,要求$\sum_{S_i} (MAX-MIN)^2 ...

  3. 【HDU 6036】Division Game (NTT+数学)

    多校1 1004 HDU-6036 Division Game 题意 有k堆石头(0~k-1),每堆n个.\(n=\prod_{i=0}^{m}p_i^{e_i}\).\(0\le m,k \le 1 ...

  4. hdu 3718 Different Division

    Different Division Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. hdu 3480 Division(斜率优化DP)

    题目链接:hdu 3480 Division 题意: 给你一个有n个数的集合S,现在让你选出m个子集合,使这m个子集合并起来为S,并且每个集合的(max-min)2 之和要最小. 题解: 运用贪心的思 ...

  6. HDU 6036 - Division Game | 2017 Multi-University Training Contest 1

    /* HDU 6036 - Division Game [ 组合数学,NTT ] | 2017 Multi-University Training Contest 1 题意: k堆石子围成一个圈,数量 ...

  7. HDU 6036 Division Game

    HDU 6036 Division Game 考虑每堆石头最多操作 $ \sum e $ 次,考虑设 $ f(x) $ 表示某一堆石头(最开始都是一样的)操作 $ x $ 次后变成了 $ 1 $ 的方 ...

  8. hdu 1034 (preprocess optimization, property of division to avoid if, decreasing order process) 分类: hdoj 2015-06-16 13:32 39人阅读 评论(0) 收藏

    IMO, version 1 better than version 2, version 2 better than version 3. make some preprocess to make ...

  9. HDU 3480 Division(斜率优化+二维DP)

    Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Tota ...

随机推荐

  1. apns关于APP数字角标的理解

    前两天群里有兄弟在吐槽,做远程推送的时候:老板要求APP桌面图标的右上角显示红色未读数字(数字角标)要精准,有多少未读通知就显示数字几:但是后台的弟兄在发送推送通知的时候,每次的角标是1,然后要移动端 ...

  2. Oracle / PLSQL函数 - NUMTODSINTERVAL和NUMTOYMINTERVAL

    最近在学习数据库方面的知识,做个标记. 这里有英文解释,建议多看看英文文档: https://www.techonthenet.com/oracle/functions/ 下面开始记录一下,自己在Or ...

  3. buildroot 重新编译 package

    /************************************************************************* * buildroot 重新编译 package ...

  4. InnoDB的Named File Formats

    随着InnoDB存储引擎的发展,新的页数据结构有时用来支持新的功能特性.比如前面提到的InnoDB Plugin,提供了新的页数据结构来支持表压缩功能,完全溢出的(Off page)大变长字符类型字段 ...

  5. UIView类绘图出现错误提示

    一:问题: Jan 16 15:49:53  CUBOT Band Ⅲ[2082] <Error>: CGContextSetLineWidth: invalid context 0x0. ...

  6. 深入分析:微信小程序与H5的区别

    作为前端工程师,从前端的视角,为大家分析下微信小程序和HTML5与之间的主要区别 第一条是运行环境的不同. 传统的HTML5的运行环境是浏览器,包括webview,而微信小程序的运行环境并非完整的浏览 ...

  7. 移动APP脚本录制

    1.安装补丁--LR_03105_patch4----mobile app(http/html) 2.录制软件和移动设备同处同一环境(160wifi连接移动设备),创建wifi热点 3.创建脚本-协议 ...

  8. 第17章 使用PHP和MySQL实现身份验证

    1.对密码进行加密:sha1(string str,bool raw_output) //将返回一个40个字符的伪随机字符串,若raw_output为true,着得到一个20个字符的二进制字符串数据 ...

  9. linux 查看磁盘占用情况

    查看"/usr/local/"路径下,所有文件大小总和.只列出总和,不显示该路径下各子文件的大小. du -sh /usr/local/ 结果显示如下图: 如果要详细显示出各子文件 ...

  10. mysql添加为成绩表添加名次

    对于一种这样的表,为score添加名次