bzoj2741:【FOTILE模拟赛】L

题意

先分块,预处理\(f_{i,j}\)表示从第\(i\)块的开头到第\(j\)个数的答案,之后就是分块的套路了。
注意\(l,r\)加的时候会爆int。
code:

#include
using namespace std;
#define int long long
const int maxn=12010;
const int maxt=150;
int n,m,t,cnt,tot,lastans;
int a[maxn],sum[maxn],L[maxt],R[maxt],pos[maxn],root[maxn],last[maxn*40];
int f[maxt][maxn],trie[maxn*40][2];
void insert(int pre,int now,int k,int val,int id)
{
    if(k<0){last[now]=id;return;}
    int c=(val>>k)&1;
    if(pre)trie[now][c^1]=trie[pre][c^1];
    trie[now][c]=++tot;
    insert(trie[pre][c],trie[now][c],k-1,val,id);
    last[now]=max(last[trie[now][0]],last[trie[now][1]]);
}
int query(int now,int k,int val,int lim)
{
    if(k<0)return 0;
    int c=(val>>k)&1;
    if(last[trie[now][c^1]]>=lim)return (1<

你可能感兴趣的:(bzoj2741:【FOTILE模拟赛】L)