[HDU 5845] Best Division (xor-trie+dp)
来源:互联网 发布:js prompt多个输入 编辑:程序博客网 时间:2024/05/17 07:02
HDU - 5845
给定一段数列,将其划分成最多的段
并且每段长度不超过 L且异或和不超过 X
有一个很显然的
然后从前面最多
但是对前面
这样一来时间复杂度就是
每次将当前位置的前缀异或和插入trie,
并且在叶子节点维护一下当前位置的 dp值,其他节点维护出子树的 dp最大值
做到
而小于
长度超过
所以只需将 dp值标记成 -1即可
由于 dp肯定是递增的,所以后来的值肯定更优,
所以前缀异或和相同的只需要保存最后一个即可
#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <iostream>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <cctype>#include <map>#include <set>#include <queue>#include <bitset>#include <string>#include <complex>using namespace std;typedef pair<int,int> Pii;typedef long long LL;typedef unsigned long long ULL;typedef double DBL;typedef long double LDBL;#define MST(a,b) memset(a,b,sizeof(a))#define CLR(a) MST(a,0)#define SQR(a) ((a)*(a))#define PCUT puts("\n----------")const int maxn=1e5+10, MOD=1<<28, Len=28;struct Trie{ struct node { int tmax, pos, nxt[2]; } tr[maxn*28]; int siz; void init(){siz=1; CLR(tr); tr[0].tmax=-1;} void addstr(int,int,int,int=0,int=27); int findstr(int,int,int=0,int=27); void delstr(int,int,int=0,int=27);};int N,X,L,P,Q,A[maxn],dp[maxn];Trie trie;int main(){ #ifdef LOCAL freopen("1002.in", "r", stdin); freopen("out.txt", "w", stdout); #endif int T; scanf("%d", &T); for(int ck=1; ck<=T; ck++) { scanf("%d%d%d%d%d%d", &N, &X, &L, &A[1], &P, &Q); for(int i=2; i<=N; i++) A[i] = ((LL)A[i-1]*P+Q)%MOD; for(int i=2; i<=N; i++) A[i] ^= A[i-1]; trie.init(); trie.addstr(0,0,0); for(int i=1; i<=N; i++) { dp[i] = trie.findstr( A[i], X); if(~dp[i]) trie.addstr( i, A[i], ++dp[i]); if(i>=L && ~dp[i-L]) trie.delstr(i-L, A[i-L]); } if(~dp[N]) printf("%d\n", dp[N]); else puts("0"); } return 0;}void Trie::addstr(int pos, int num, int tmax, int np, int npos){ if(npos<0) { tr[np].pos = pos; tr[np].tmax = tmax; return; } int now = (num>>npos)&1, &nxt = tr[np].nxt[now]; if(!nxt) nxt = siz++; addstr(pos,num,tmax,nxt,npos-1); if(np) tr[np].tmax = max(tr[np].tmax, tmax);}int Trie::findstr(int num, int lim, int np, int npos){ if(npos<0) return tr[np].tmax; int now = (num>>npos)&1, lnow = (lim>>npos)&1, nxt, res=-1; if(nxt=tr[np].nxt[now]) { if(0<lnow) res = max(res, tr[nxt].tmax); else res = max(res, findstr(num, lim, nxt, npos-1)); } if(nxt=tr[np].nxt[now^1]) { if(1==lnow) res = max(res, findstr(num, lim, nxt, npos-1)); } return res;}void Trie::delstr(int pos, int num, int np, int npos){ if(npos<0) { if(tr[np].pos == pos) tr[np].tmax = -1; return; } int now = (num>>npos)&1, nxt = tr[np].nxt[now]; delstr(pos, num, nxt, npos-1); if(np) tr[np].tmax = max(tr[tr[np].nxt[now]].tmax, tr[tr[np].nxt[now^1]].tmax);}
0 0
- [HDU 5845] Best Division (xor-trie+dp)
- hdu5845 Best Division (xor-trie+dp)
- Hdu-5845 Best Division (trie+DP)
- hdu 5845 Best Division(trie+dp,好题)
- HDU 5845 Best Division(dp+01字典树)
- hdoj 5845 Best Division 【字典树 + dp】
- hdu 3480 Division(DP-DP优化)
- hdu 5715 XOR 游戏(trie)
- HDU 3480 Division (斜率DP)
- HDU 4825 Xor Sum(trie树+贪心)
- HDU 4825 Xor Sum [trie]【思维&字符串】
- HDU-4570 Multi-bit Trie (DP)
- Division (斜率dp)
- HDU-3480 Division 【DP+斜率优化(二维)】
- hdu 3480 Division (四边形不等式优化DP)
- Trie/Xor
- hdu-4833-Best-Financing(DP)
- HDU 5715 XOR 游戏(二分+dp+01字典树)
- POJ 1258 Agri-Net(最小生成树Prim算法)
- WCF服务自托管(Self-Hosting)
- Java中Scanner类和BufferReader类的区别
- Android Studio真机调试问题
- Android数据库安全解决方案,使用SQLCipher
- [HDU 5845] Best Division (xor-trie+dp)
- Java6中与Synchronized相关的锁机制
- windows和linux删除指定目录及其该目录下的文件
- 掌阅Android App插件补丁实践(ZeusPlugin)
- spring mvc4.3源码分享
- 使用ubuntu16搭建apache—tomcat服务器详细教程
- 孤独是生命的常态 苍凉才是永恒
- background和background-Color的区别
- Summary for LeetCode 2Sum, 3Sum, 4Sum, K Sum