HDU 5845 Best Division
$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的更多相关文章
- 【HDU - 5845】Best Division(xor-trie、01字典树、dp)
BUPT2017 wintertraining(15) #7E 题意 把数组A划分为k个区间,每个区间不超过L长度,每一个区间异或和之和为S.现在求:S不超过X,区间个数的最大值. 且A是这样给你的: ...
- 【HDU】3480 Division
http://acm.hdu.edu.cn/showproblem.php?pid=3480 题意:一个n个元素的集合S要求分成m个子集且子集并为S,要求$\sum_{S_i} (MAX-MIN)^2 ...
- 【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 ...
- hdu 3718 Different Division
Different Division Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 3480 Division(斜率优化DP)
题目链接:hdu 3480 Division 题意: 给你一个有n个数的集合S,现在让你选出m个子集合,使这m个子集合并起来为S,并且每个集合的(max-min)2 之和要最小. 题解: 运用贪心的思 ...
- HDU 6036 - Division Game | 2017 Multi-University Training Contest 1
/* HDU 6036 - Division Game [ 组合数学,NTT ] | 2017 Multi-University Training Contest 1 题意: k堆石子围成一个圈,数量 ...
- HDU 6036 Division Game
HDU 6036 Division Game 考虑每堆石头最多操作 $ \sum e $ 次,考虑设 $ f(x) $ 表示某一堆石头(最开始都是一样的)操作 $ x $ 次后变成了 $ 1 $ 的方 ...
- 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 ...
- HDU 3480 Division(斜率优化+二维DP)
Division Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 999999/400000 K (Java/Others) Tota ...
随机推荐
- AI(三):微信与luis结合(上)
目录 基本原理 公众号申请及配置 验证服务器有效性 微信请求消息类型 基本原理 基本原理如上图:腾讯微信服务器就相当于一个转发服务器,终端(手机.Pad等)发起请求至微信服务器,微信服务器然后将请求转 ...
- Python学习笔记---形式参数(parameter)和实际参数(argument)
def mydemo(name): '函数定义过程中的name是叫形参' #因为它只是一个形式,表示占据一个参数位置 print('传递进来的' + name + '叫做实参,因为它是具体的参数值!' ...
- 手机端H5 header定义样式
<meta content="width=device-width,initial-scale=1.0, maximum-scale=1.0, user-scalable=0" ...
- jquery中这句 .stop(false,true); 什么意思
.stop 是jQuery中用于控制页面动画效果的方法.运行之后立刻结束当前页面上的动画效果.stop在新版jQuery中添加了2个参数:第一个参数的意思是是否清空动画序列,也就是stop的是当前元素 ...
- 使用ObjectInputStream和ObjectOutputStream注意问题
1.对象序列化,类实现Serializable接口 不需要序列化的属性,使用transient声明 2.使用套接字流在主机之间传递对象注意问题: 学习自:Socket同时使用ObjectInputSt ...
- 关于Two-Pass标记连通域个数
关于Two-Pass标记连通域个数 背景 在完成图像的一系列处理后,得到二值图,一般会统计目标数量,即是获取连通域个数,这里采用TwoPass的方法. 基本思想 在Two-pass连通域标记中,第一次 ...
- linux的基本命令
find: find [路径] [选项] [查找规则] [动作] -print 打印出找到的文件,以\n结束 -print0 打印出找到的文件,无换行 -exec command 对找到的文件执行命令 ...
- 重要的几个热键[Tab], [ctrl]-c, [ctrl]-d
来源于:鸟哥的Linux私房菜 在继续后面的章节之前,这里很需要跟大家再来报告一件事,那就是我们的文字模式里头具有很多的功能按键, 这些按键可以辅助我们进行指令的编写与程序的中断呢!这几个按键请大家务 ...
- android app安全问题设置
1.应用签名未校验风险:检测 App 程序启动时是否校验签名证书. 2.应用数据任意备份风险 Android 2.1 以上的系统可为 App 提供应用程序数据的备份和恢复功能,该 由 AndroidM ...
- Hex Workshop(16进制编辑利器) 6.7.2绿色版
软件名称: Hex Workshop 6.7.2绿色版(16进制编辑利器) 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 1.8MB 图片预览: 软件简介 ...