[DP 分块] UOJ #300. 【CTSC2017】吉夫特

来源:互联网 发布:网络教育网上报名 编辑:程序博客网 时间:2024/05/17 01:20

DP的转移是一个子集和的形式
直接做是318
按照高9位 低9位分块可以做到29×39=69

#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;#define read(x) scanf("%d",&(x))const int N=1<<18;const int P=1000000007;int n,a[N];int f[N];inline void add(int &x,int y){  x+=y; if (x>=P) x-=P;}inline void Add(int x,int y){  int a=x>>9,b=x&511;  for (int i=a;i;i=(--i)&a)    add(f[(i<<9)|b],y);  add(f[b],y);}inline int Query(int x){  int a=x>>9,b=(~x)&511; int ret=0;  for (int i=b;i;i=(--i)&b)    add(ret,f[(a<<9)|((~i)&511)]);  add(ret,f[(a<<9)|511]);  return ret;}int main(){  freopen("t.in","r",stdin);  freopen("t.out","w",stdout);  read(n); for (int i=1;i<=n;i++) read(a[i]);  int ans=0;  for (int i=1;i<=n;i++){    int t=Query(a[i])+1;    add(ans,t);    Add(a[i],t);  }  printf("%d\n",(ans+P-n)%P);  return 0;}
原创粉丝点击