[博弈论]JZOJ 3339 wyl8899和法法塔的游戏
分析
取火柴游戏,发现就是要求s[r-1]^s[x] (a<=x<=b)最小
s是异或前缀和,s[r-1]是固定的,求s[x]
那么我们看到异或的题目可以考虑trie,可是区间询问的问题一颗trie怎么搞?
那么我们利用分块加trie可以随便切完这题,在trie上找答案时可以从高位开始找异或值为0贪心,正确性显然
然鹅我打的是n^2暴力也过了
#include <iostream> #include <cstdio> #include <cmath> using namespace std; const int N=5e5+10; int n,m,s[N]; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&s[i]); scanf("%d",&m); for (int i=1;i<=m;i++) { int R,A,B,k,ans=0; scanf("%d%d%d",&R,&A,&B); if (s[R]==0) { printf("-1\n"); continue; } if (R==B) { printf("%d\n",s[R]); s[R]=0; continue; } k=0; for (int j=R-1;j>=A;j--) { k^=s[j]; if (B>=j&&s[R]>=k) ans=max(ans,s[R]-k); if (ans==s[R]) break; } if (ans==0) printf("-1\n"); else printf("%d\n",ans); s[R]-=ans; } }
在日渐沉没的世界里,我发现了你。