hdu5845 Best Division (xor-trie+dp)
来源:互联网 发布:中国科学院论文数据库 编辑:程序博客网 时间:2024/05/17 01:51
题意:给定一段数列,将其划分成最多的段 并且每段长度不超过 L且异或和不超过 X
有一个很显然的
然后从前面最多
但是对前面
这样一来时间复杂度就是
每次将当前位置的前缀异或和插入trie,
并且在叶子节点维护一下当前位置的 dp值,其他节点维护出子树的 dp最大值
做到
而小于
长度超过
所以只需将 dp值标记成 -1即可
由于 dp肯定是递增的,所以后来的值肯定更优,
所以前缀异或和相同的只需要保存最后一个即可
#include <vector>#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;#define MAX 100005#define MAXN 1000005#define maxnode 205#define sigma_size 26#define mem(x,v) memset(x,v,sizeof(x))long long sum[MAX];int ch[32*MAX][2];int val[32*MAX];int num[32*MAX];int sz;int dp[MAX];int n,m,l;void init(){ mem(ch[0],0); sz=1;}void inser(int a,int id,int i,int u){ if(i==-1){ val[u]=dp[id]; //cout<<dp[id]<<" "<<id<<endl; return; } int c=((a>>i)&1); if(!ch[u][c]){ mem(ch[sz],0); val[sz]=-1; num[sz]=0; ch[u][c]=sz++; } num[ch[u][c]]++; inser(a,id,i-1,ch[u][c]); val[u]=max(val[u],val[ch[u][c]]);}int query(int a,int x,int i,int u){ if(i==-1){ return val[u]; } int c=((a>>i)&1); int d=((x>>i)&1); int ans=-1; //if(c==1) cout<<i<<" "<<d<<endl; if(d==1){ if(ch[u][c]&&num[ch[u][c]]) ans=max(ans,val[ch[u][c]]); if(ch[u][c^1]&&num[ch[u][c^1]]) ans=max(ans,query(a,x,i-1,ch[u][c^1])); } else{ if(ch[u][c]&&num[ch[u][c]]) ans=max(ans,query(a,x,i-1,ch[u][c])); } //if(c==1) cout<<ans<<endl; return ans;}void del(int a,int i,int u){ if(i==-1){ if(num[u]==0) val[u]=-1; return; } int c=((a>>i)&1); num[ch[u][c]]--; del(a,i-1,ch[u][c]); val[u]=val[ch[u][c]]; if(ch[u][c^1]&&num[ch[u][c^1]]) val[u]=max(val[u],val[ch[u][c^1]]);}int main(){ int t; cin>>t; while(t--) { int n,x,l; long long a,p,q; sum[0]=0; scanf("%d%d%d",&n,&x,&l); cin>>a>>p>>q; for(int i=1;i<=n;i++) { sum[i]=sum[i-1]^a; a=(a*p+q)%268435456LL; } init(); mem(dp,0); inser(0,0,30,0); dp[0]=1; for(int i=1;i<=n;i++) { if(i>l&&dp[i-l-1]) del(sum[i-l-1],30,0); int cnt=query(sum[i],x,30,0); if(cnt>=0) { dp[i]=cnt+1; inser(sum[i],i,30,0); } } printf("%d\n",dp[n]); } return 0;}
0 0
- hdu5845 Best Division (xor-trie+dp)
- [HDU 5845] Best Division (xor-trie+dp)
- Hdu-5845 Best Division (trie+DP)
- 2016多校训练Contest9: 1002 Best Division hdu5845
- hdu 5845 Best Division(trie+dp,好题)
- hdoj 5845 Best Division 【字典树 + dp】
- 多校联合训练hdu5845---Best Divison
- Division (斜率dp)
- Trie/Xor
- HDU 5845 Best Division(dp+01字典树)
- HDU4825 - Xor Sum(Trie 字典树)
- pojThe xor-longest Path(trie树)
- Contestants Division (树形dp)
- hdu4825 Xor Sum【Trie、Xor】
- hdu 3480 Division(DP-DP优化)
- poj 3140 Contestants Division(树dp)
- poj 3140 Contestants Division(树dp)
- HDU 3480 Division (斜率DP)
- sqlite delete无效
- win7安装心得
- 牛人博文
- 基于TFT的ZLG_GUI和3D显示的移植
- 如何在 Linux 中不输入密码运行 sudo 命令
- hdu5845 Best Division (xor-trie+dp)
- 京东亿级商品搜索核心技术解密
- jsp1 脚本与指令
- CKeditor的引用
- 用CPU来加速你的Linux命令
- M--二分查找 递归实现
- Docker与Kubernetes系列(一): Docker的基本概念
- SolrCloud定时增量更新
- HTTP状态码大全