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

那么现在将所有店按$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;
}

  

BZOJ4583 : 购物的更多相关文章

  1. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  2. 【BZOJ4583】购物(组合计数)

    题意:商店出售3种颜色的球,分别为红.绿.蓝. 城市里有n个商店,第i个商店在第First_i天开始营业,连续营业Red_i+Green_i+Blue_i天,每个商店每天只能出售一种颜色的球. 每天最 ...

  3. 【原】彻底解决WPS弹出热点广告、WPS购物图标的办法

    一直用WPS,但一直有一个问题迟迟没有解决,那就是讨厌的WPS广告问题! 每次开机都会自动在托盘上闪烁图标:“WPS购物”和“WPS热点”! 用自定义托盘图标隐藏都不管用,自动又会给改回来!这简直是流 ...

  4. Java Web之网上购物系统(提交订单、查看我的订单)

    作业终于做完了,好开心......虽然这一周经历不是那么顺利,但是觉得还是收获了不少,有过想哭的冲动,代码不会写,事情办不好,各种发愁.空间里发小发了带父母出去游玩的照片,瞬间能量值不知道是被击退的多 ...

  5. Java Web之网上购物系统(注册、登录、浏览商品、添加购物车)

    眼看就要期末了,我的专业课也迎来了第二次的期末作业---------<网上购物系统>.虽然老师的意图是在锻炼我们后台的能力,但是想着还是不利用网上的模板,准备自己写,以来别人写的静态页看不 ...

  6. 第八章 交互技术,8.1 VR电商购物(作者:宋五)

    8.1 VR电商购物 前言 GM LAB在2016年3月成立,是一个旨在探索最新电商购物体验的实验室.在探索VR购物的过程中,有两个需要核心解决的问题:一个是VR购物的产品形态是什么,另一个是VR环境 ...

  7. 模拟淘宝购物,运用cookie,记录登录账号信息,并且记住购物车内所选的商品

    1.登录界面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn ...

  8. C算法编程题(七)购物

    前言 上一篇<C算法编程题(六)串的处理> 有些朋友看过我写的这个算法编程题系列,都说你写的不是什么算法,也不是什么C++,大家也给我提出用一些C++特性去实现问题更方便些,在这里谢谢大家 ...

  9. 微信小程序购物商城系统开发系列-目录结构

    上一篇我们简单介绍了一下微信小程序的IDE(微信小程序购物商城系统开发系列-工具篇),相信大家都已经蠢蠢欲试建立一个自己的小程序,去完成一个独立的商城网站. 先别着急我们一步步来,先尝试下写一个自己的 ...

随机推荐

  1. doT.js

    最近用到的数据模板引擎有很多,今天讲的doT.js也是其中一种. doT.js的特点是体积小,速度快,并且不依赖其他插件. 官网下载:http://olado.github.io 下面是用法: 模板引 ...

  2. HTTP缓存

    本文是<HTTP权威指南>读书笔记 Web缓存是可以自动保存常见文档副本的设备.当Web请求抵达缓存时,如果本地在“已缓存”的的副本,就可以从本地存储设备而不是原始服务器中提取这个文档.使 ...

  3. python2.7 报错(UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128))

    报错: 原来用的python3.5版本后来改为2.7出现了这个错误里面的中文无法显示 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 ...

  4. Integer与int的区别

    简述:int与Integer的区别: 对于它们,我们可能只是知道简单的区别.Integer是int的一个封装类,int的初始值为0,而Integer的初始值为null.但是他们之间真的仅仅只有这些区别 ...

  5. JAVA基础学习——1.3 关于JAVA环境变量设定 Path,Java_Home,ClassPath

    在安装完JDK以后,要设定JAVA环境变量. 刚接触的时候,我很困惑,这特么什么玩意啊,然后知其然不知其所以然的 按照说明做完了却不知道为什么这么做,这里简单做一些总结说明. 首先,什么是环境变量 环 ...

  6. jemalloc在linux上从安装到使用

    jemalloc在linux上从安装到使用 上次在引导大家安装Redis时提到可能会报错:  发现了redis有用到jemalloc. 首先,jemalloc是干什么的? 我们看看作者自己的介绍: j ...

  7. Python之路,Day7 - Python基础7 面向对象

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...

  8. js创建命名空间

    CreateNameSpace: function () { var nameSpaceObjec = arguments[0].split('.'); var currentNameSpaceNam ...

  9. 为RecyclerView的不同item项实现不同的布局(添加分类Header)

    最近在做一个应用的时候,需要为GridLayoutManager添加头部header,然后自然而然就想到了用不同的itemType去加载不同的布局. 1.实现多item布局,用不同的itemType去 ...

  10. asp.net 读取导入的project(mpp)文件

    公司项目有用到读取project文件(.mpp)并保存到指定数据库类似的功能. 查了一下大家总结的方法. 找到一哥们代码,初步判断可行,特此收藏. using System.IO; using Mic ...