BZOJ4583 : 购物

首先,如果一家店的区间完全包含了另一家,那么可以删掉另一家,中间的可以用组合数计算方案数。

那么现在将所有店按$l$排序,那么$l$和$r$都严格递增。

设$f[i][j][k]$表示当前是第$i$天的开端,当前这家店还要卖$j$个红球,$k$个绿球的方案数。

还需要卖多少蓝球可以通过天数与$j,k$的差值得出,所以不需要记录。

如果这一天是某两家店重合的第一天,那么重合部分可以通过组合数计算方案数,然后直接跳到不重合的第一天。

其它情况都可以枚举方案暴力转移。

时间复杂度$O(TV^2)$。

#include<cstdio>
#include<algorithm>
const int N=55,T=505,V=105,P=1000000007;
int n,i,j,k,x,len,flag,del[N],v[T],id[T],C[T][T],f[T][V][V],ans;
struct E{int st,en,r,g,b;}a[N];
inline bool cmp(const E&a,const E&b){return a.st<b.st;}
inline int cal(int R,int G,int B){return 1LL*C[R+G+B][R]*C[G+B][G]%P;}
inline void up(int&x,int y){x+=y;if(x>=P)x-=P;}
int main(){
  scanf("%d",&n);
  for(i=1;i<=n;i++)scanf("%d",&a[i].st);
  for(i=1;i<=n;i++)scanf("%d",&a[i].r);
  for(i=1;i<=n;i++)scanf("%d",&a[i].g);
  for(i=1;i<=n;i++){
    scanf("%d",&a[i].b);
    a[i].en=a[i].st+a[i].r+a[i].g+a[i].b-1;
    for(j=a[i].st;j<=a[i].en;j++)v[j]++;
  }
  for(i=1;i<T;i++)if(v[i]>2)return puts("0"),0;
  for(f[0][0][0]=C[0][0]=i=1;i<T;i++)for(C[i][0]=j=1;j<=i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;
  do{
    flag=0;
    for(i=1;i<=n;i++)if(!del[i])for(j=1;j<=n;j++)if(!del[j]&&i!=j){
      if(a[i].st<=a[j].st&&a[j].en<=a[i].en){
        del[j]=1;
        f[0][0][0]=1LL*f[0][0][0]*cal(a[j].r,a[j].g,a[j].b)%P;
        a[i].r-=a[j].r,a[i].g-=a[j].g,a[i].b-=a[j].b;
        len=a[j].r+a[j].g+a[j].b;
        if(a[i].r<0||a[i].g<0||a[i].b<0)return puts("0"),0;
        if(a[i].r==0&&a[i].g==0&&a[i].b==0)del[i]=1;
        a[i].en-=len;
        for(k=1;k<=n;k++)if(!del[k]&&k!=i)if(a[k].st>a[j].en)a[k].st-=len,a[k].en-=len;
        flag=1;
        break;
      }
    }
  }while(flag);
  for(j=0,i=1;i<=n;i++)if(!del[i])a[++j]=a[i];
  n=j;
  std::sort(a+1,a+n+1,cmp);
  for(i=1;i<T;i++)v[i]=0;
  for(i=1;i<=n;i++)for(j=a[i].st;j<=a[i].en;j++)id[j]=i,v[j]++;
  for(i=0;i<502;i++)for(j=0;j<V;j++)for(k=0;k<V;k++)if(f[i][j][k]){
    if(!v[i])up(f[i+1][a[id[i+1]].r][a[id[i+1]].g],f[i][j][k]);
    else if(v[i]==1){
      if(i==a[id[i]].en)up(f[i+1][a[id[i+1]].r][a[id[i+1]].g],f[i][j][k]);
      else{
        if(j)up(f[i+1][j-1][k],f[i][j][k]);
        if(k)up(f[i+1][j][k-1],f[i][j][k]);
        if(a[id[i]].en+1-i-j-k)up(f[i+1][j][k],f[i][j][k]);
      }
    }else if(v[i]==2){
      x=a[id[i-1]].en+1-i-j-k;
      if(j>a[id[i]].r||k>a[id[i]].g||x>a[id[i]].b)continue;
      up(f[a[id[i-1]].en+1][a[id[i]].r-j][a[id[i]].g-k],1LL*f[i][j][k]*cal(j,k,x)%P);
    }
  }
  return printf("%d",f[i][0][0]),0;
}

  

时间: 2024-10-09 00:45:08

BZOJ4583 : 购物的相关文章

什么是关联挖掘?如何利用顾客的购物习惯提高销售额?

关联规则挖掘就是从大量的数据中挖掘出有价值描述数据项之间相互联系的有关知识.随着收集和存储在数据库中的数据规模越来越大人们对从这些数据中挖掘相应的关联知识越来越有兴趣.例如从大量的商业交易记录中发现有价值的关联知识就可帮助进行商品目录的设计.交叉营销或帮助进行其它有关的商业决策. 挖掘关联知识的一个典型应用实例就是市场购物分析.根据被放到一个购物袋的购物内容记录数据而发现的不同被购买商品之间所存在的关联知识无疑将会帮助商家分析顾客的购买习惯.如图所示. 发现常在一起被购买的商品关联知识将帮助商家

完成打印购物小票并计算积分

import java.util.Scanner; /** * @author 蓝色以太 * 完成打印购物小票并计算积分 */ public class ShoppingReceipt { public static void main(String[] args) { Scanner sc=new Scanner(System.in); final int NUM1=245,NUM2=570,NUM3=320; System.out.println("请输入购买T恤数量:"); in

购物意图分析

最近在读<淘宝技术这十年>一书,发觉里面常有一些很有意思的分享与概念,例如下面的这个,购物意图分析: 通常我们在逛淘宝时会使用到搜索功能,但你可能不知道你输入不同的搜索词,便体现了你的不同购物意图,搜索引擎便会根据你的意图来呈现不同的内容,让推荐更加精准,直达你内心的需求,主要有如下几种意图: 1.浏览型:没有明确想买的东西,边看边买,这样的用户例如会输入"2017年十大香水排行","今年最流行的毛衣","zippo有多少种类".使用

25.购物金额结算

import java.util.Scanner; public class ShoppingList { /** * 购物金额结算 */ public static void main(String[] args) { double[] cashes = new double[5]; double sum = 0.0; //总金额 System.out.println("请输入会员本月的消费记录"); Scanner input = new Scanner(System.in); /

亚马逊如何一步步改变消费者的购物习惯?

上市20周年,亚马逊现在的市值几乎是沃尔玛的2倍. 很难想象一家起初卖书的公司,能颠覆整个零售业,大大地改变了消费者购物及娱乐的方式.那么,最初差点被Jeff Bezos命名为"Cadabra"的网上书店,如何发展成为现在的亚马逊? 亚马逊市值目前是沃尔玛的两倍多 作为上市公司,亚马逊花了18年赶上沃尔玛,而且仅花了2年多的时间让自身的市值,达到实体零售商巨头沃尔玛的2倍多. 亚马逊股票总价值达4650亿美元,相比之下,沃尔玛市值达2290亿美元.而亚马逊的首席执行官Bezos目前身价

AppCan移动开发:仿口袋购物APP源码

近日,AppCan社区又有新的干货内容分享,社区昵称为appcan_y的开发者分享了一个仿口袋购物的App源码. 效果图: 一.UI部分 1.修改index.html标题内容为:"口袋购物" 2.在index.html页面内添加底部tab选项卡代码: <!--content结束--> <div id="footer"style="height:3em"class="footer_color"> <

了解大数据——购物平台发展

自阿里巴巴在中国推出淘宝这一购物平台,极大地改变人们的衣食住行.对于运营商阿里巴巴来说,这是一个好的发展前景,怎么很好地经营购物平台.开展多元化购物方式是它需要探讨的内容.阿里巴巴创建大数据平台,通过统计买家与卖家的各种消费与被消费行为,在保障平台稳定性前提下,还能够很好地推出各种营销策略,促进营业额增长. 下面以广东省与安徽省之间近段时间的商品销售指数为例,分析一下大数据: 从数据分析图可以清晰看出广东省与安徽省之间消费来往排行前列的商品,卖家可以根据阿里指数提供的数据,确保需求量大的商品库存

[HAOI2008]硬币购物

[HAOI2008]硬币购物 题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s 输出格式: 每次的方法数 输入输出样例 输入样例#1: 1 2 5 10 2 3 2 3 1 10 1000 2 2 2 900 输出样例#1: 4 27 说明 di,s<=100000 to

既然“购物全返”是诈骗,为何还容忍帮凶打广告?

对于当下消费者而言,网购的出现无疑是极为便利的,其也衍生出诸多模式.除了常见的B2C.C2C等正规模式,还出现了很多"陷阱"模式.这些"陷阱"模式的共同点就是炮制种种看似高大上的噱头,并与互联网高端词汇结合,再加上看似唾手可得的实惠,最终让很多人上当受骗.其中,"购物全返"就是具有代表性的"陷阱". 按照正常的商业模式而言,逐利是所有企业和商家的终极目的,也是维持商业市场的最基本规律."购物全返"明明违背商