BZOJ 2287 POJ Challenge 消失之物 分治+背包

来源:互联网 发布:用php编辑九九乘法表 编辑:程序博客网 时间:2024/06/05 05:02

题目大意:给定n个物品,每个物品有一个体积,对于所有的1in,1jm输出在不使用第i个物品的情况下装满大小为j的背包的方案数

我这傻逼居然真的去写了分治背包……
第i个物品存在的时间为[1,i1][i+1,n]两个区间
然后分治……
时间复杂度O(n2logn)
黄学长我仰慕您

#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 2020using namespace std;struct abcd{    int l,r,x;    abcd() {}    abcd(int _,int __,int ___):        l(_),r(__),x(___) {}};int n,m;void Divide_And_Conquer(int x,int y,vector<abcd> &v,vector<int> a){    int i,j,mid=x+y>>1;    vector<abcd> l,r;    for(i=0;i<(signed)v.size();i++)    {        abcd temp=v[i];        if(temp.l==x&&temp.r==y)            for(j=m;j>=temp.x;j--)                (a[j]+=a[j-temp.x])%=10;        else if(temp.r<=mid)            l.push_back(temp);        else if(temp.l>mid)            r.push_back(temp);        else            l.push_back(abcd(temp.l,mid,temp.x)),r.push_back(abcd(mid+1,temp.r,temp.x));    }    if(x==y)    {        for(i=1;i<=m;i++)            printf("%d",a[i]);        puts("");        return ;    }    Divide_And_Conquer(x,mid,l,a);    Divide_And_Conquer(mid+1,y,r,a);}int main(){    int i,x;    cin>>n>>m;    vector<abcd> v;    for(i=1;i<=n;i++)    {        scanf("%d",&x);        if(i!=1)            v.push_back(abcd(1,i-1,x));        if(i!=n)            v.push_back(abcd(i+1,n,x));    }    vector<int> a(m+1,0);a[0]=1;    Divide_And_Conquer(1,n,v,a);    return 0;}
0 0
原创粉丝点击