Description

有N个人出去旅行,第i个人去A国有Ai种游玩方式,去B国有Bi种游玩方式,问至少有C个人去A国的情况下,所有人的游玩方式有多少种不同的可能。

两种所有人的游玩方式不同当且仅当存在一个人选择的游玩方式不同,或选择去的国家不同。

接下来有P次修改,每次修改一个人的Ai和Bi。

Input

第一行两个正整数,表示N,C,含义如题所示。

接下来一行N个整数,第i个整数表示Ai。

接下来一行N个整数,第i个整数表示Bi。

接下来一行一个正整数表示P。

接下来P行,每行三个整数i,x,y,表示修改Ai为x,Bi为y。

Output

对每次修改输出一行一个整数,表示总方案数 mod 10007。

Sample Input

4 2

1 2 3 4

1 2 3 4

1

4 1 1

Sample Output

66

Data Constraint

对于100%的数据满足:Ai,Bi,x,y在int范围内。



时间限制:1.5s

空间限制:128MB

Solution

正难则反!!!我一定要记住!

\(c\) 的范围很小,正着不好求就反着求,用总共的方案数减去不合法的方案数

总共的方案数就是所有的游玩方式,\(total=\prod_{i=1}^n(A_i+B_i)\)

然后就是要减去只有 \(0\) 个到 \(c-1\) 个人去A国的方案数

设计DP,\(f[l][r][i]\)代表在第 \(l\) 到 \(r\) 这一段人中,有 \(i\) 个人去A国的游玩方式

暴力的转移:\(f[l][r][i]=\sum_{j=1}^if[l][Mid][j]*f[Mid+1][r][i-j](Mid=(l+r)/2)\)

这个方程设计的真的是巧妙

然后发现就可以用线段树了,这个 \(l\) 和 \(r\)正好对应上线段树的区间,pushup的时候暴力 \(O(c^2)\) 转移就行了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100000+10,MAXC=25,Mod=1e4+7;
int n,c,q,A[MAXN],B[MAXN];
ll total=1;
#define Mid ((l+r)>>1)
#define lson rt<<1,l,Mid
#define rson rt<<1|1,Mid+1,r
struct SEG{
int f[MAXN<<2][MAXC];
inline void PushUp(int rt)
{
for(register int i=0;i<c;++i)f[rt][i]=0;
for(register int i=0;i<c;++i)
for(register int j=0;i+j<c;++j)(f[rt][i+j]+=f[rt<<1][i]*f[rt<<1|1][j])%=Mod;
}
inline void Build(int rt,int l,int r)
{
if(l==r)f[rt][0]=B[l],f[rt][1]=A[l];
else
{
Build(lson);
Build(rson);
PushUp(rt);
}
}
inline void Update(int rt,int l,int r,int pos)
{
if(l==r&&r==pos)f[rt][0]=B[l],f[rt][1]=A[l];
else
{
if(pos<=Mid)Update(lson,pos);
else Update(rson,pos);
PushUp(rt);
}
}
};
SEG T;
#undef Mid
#undef lson
#undef rson
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char c='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(c!='\0')putchar(c);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline ll qexp(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1)res=res*a%Mod;
a=a*a%Mod;
b>>=1;
}
return res;
}
int main()
{
read(n);read(c);
for(register int i=1;i<=n;++i)read(A[i]),A[i]%=Mod;
for(register int i=1;i<=n;++i)read(B[i]),B[i]%=Mod;
for(register int i=1;i<=n;++i)(total*=A[i]+B[i])%=Mod;
T.Build(1,1,n);
read(q);
while(q--)
{
int p,x,y;
ll res=0;
read(p);read(x);read(y);
total=total*qexp(A[p]+B[p],Mod-2)%Mod;
A[p]=x%Mod;B[p]=y%Mod;
total=total*(A[p]+B[p])%Mod;
T.Update(1,1,n,p);
for(register int i=0;i<c;++i)(res+=T.f[1][i])%=Mod;
write((total-res+Mod)%Mod,'\n');
}
return 0;
}

【模考】2018.04.08 Travel的更多相关文章

  1. 【模考】2018.04.08 Connection

    Description 给定一张N个点M条边的连通无向图,问最少需要断开多少条边使得这张图不再连通. Input 第一行两个整数N,M含义如题所示. 接下来M行,每行两个正整数x,y,表示x和y之间有 ...

  2. 2018/04/25 基于 编译安装的 PHP7 安装 swoole 扩展

    在上一篇文章我们知道了如何去编译安装一个自己需要的 PHP 版本. 2018/04/25 PHP7的编译安装 这里还没有完,我们还需要安装我们的扩展,才算完成今天的任务. -- 下载扩展 还是官网下载 ...

  3. 20172319 2018.04.01-04.11 《Java程序设计》第5周学习总结

    20172319 2018.04.01-04.11 <Java程序设计>第5周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错 ...

  4. 20172319 2018.04.11-16 《Java程序设计教程》 第6周学习总结

    20172319 2018.04.11-16 <Java程序设计教程>第6周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题 ...

  5. 20172319 2018.04.11 《Java程序设计教程》第7周课堂测验(补写博客)

    20172319 2018.04.11 <Java程序设计教程>第7周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  6. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  7. 2018/04/25 PHP7的编译安装

    为什么要编译安装? 因为最近要学习 swoole ,想使用目前最新的 PHP7.2.4 ,但是我所在的 Ubuntu-16.04 的 apt 下只有 PHP7.0 的版本. 加上自己也想学习一下源码的 ...

  8. 更新SAS 9.4(64位) SID的简单方法(可以使用至2018.04.30)

    打开SAS,在程序窗口输入: PROC SETINIT RELEASE='9.4'; SITEINFO NAME='NATIONAL PINGTUNG UNI OF SCIENCE&TECH' ...

  9. 最新版IntelliJ IDEA2019.1破解教程(2019.04.08更新)

    [原文链接]:https://www.tecchen.xyz/idea-crack.html 我的个人博客:https://www.tecchen.xyz,博文同步发布到博客园. 由于精力有限,对文章 ...

随机推荐

  1. requests.get()解析

    1.requests.get(url, params=None, headers=None, cookies=None, auth=None, timeout=None) Sends a GET re ...

  2. Python之Django的Model详解

    一.创建数据库 创建数据库 进入数据库: mysql -uroot -p 创建数据库: CREATE DATABASE test1 CHARSET=utf8; 连接数据库 虚拟环境中安装数据库模块:p ...

  3. [Lua] try catch实现

    参考了https://blog.csdn.net/waruqi/article/details/53649634这里的代码,但实际使用时还有些问题,修改后在此记录一下. -- 异常捕获 functio ...

  4. eclipse检出SVN代码的详细流程

    1.添加SVN资源库位置(未安装SVN,请先安装SVN) 2.因为该项目不是maven项目 所以还需要加入jar包(将项目lib里面的jar都Buile Path) 3.我这个项目需要修改编码格式 右 ...

  5. windows离线补丁包下载路径-云盾安骑士

    我们有一台阿里云服务器,只有内网可以访问,无外网资源. 阿里云账户邮箱反复收到阿里云云盾的漏洞报警通知,推荐安装安骑士组件. 安骑士组件是收费服务.阿里云服务器,无法连上外网,无法自动安装补丁.需要将 ...

  6. nodejs 中 module.exports 和 exports 的区别

    1. module应该是require方法中,上下文中的对象 2. exports对象应该是上下文中引用module.exports的新对象 3. exports.a = xxx 会将修改更新到mod ...

  7. 7行Python代码的人脸识别

    随着去年alphago 的震撼表现,AI 再次成为科技公司的宠儿.AI涉及的领域众多,图像识别中的人脸识别是其中一个有趣的分支.百度的BFR,Face++的开放平台,汉王,讯飞等等都提供了人脸识别的A ...

  8. hexo主题中添加相册功能

    博客已迁移至http://lwzhang.github.io. 基本上所有的hexo主题默认都没有实现相册功能,一方面相册功能的需求较少,毕竟hexo主要是写博客用的:另一方面实现相册功能比较麻烦,比 ...

  9. CentOS6安装与运行R脚本

    http://blog.csdn.net/bdchome/article/details/47811763

  10. CentOs6.5中安装和配置vsftp简明教程[转]

    CentOs6.5中安装和配置vsftp简明教程 林涛 发表于:2017-3-17 10:10 分类:WebServer 标签: 101次 一.vsftp安装篇 复制代码代码如下: # 安装vsftp ...