【模考】2018.04.08 Travel
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的更多相关文章
- 【模考】2018.04.08 Connection
Description 给定一张N个点M条边的连通无向图,问最少需要断开多少条边使得这张图不再连通. Input 第一行两个整数N,M含义如题所示. 接下来M行,每行两个正整数x,y,表示x和y之间有 ...
- 2018/04/25 基于 编译安装的 PHP7 安装 swoole 扩展
在上一篇文章我们知道了如何去编译安装一个自己需要的 PHP 版本. 2018/04/25 PHP7的编译安装 这里还没有完,我们还需要安装我们的扩展,才算完成今天的任务. -- 下载扩展 还是官网下载 ...
- 20172319 2018.04.01-04.11 《Java程序设计》第5周学习总结
20172319 2018.04.01-04.11 <Java程序设计>第5周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错 ...
- 20172319 2018.04.11-16 《Java程序设计教程》 第6周学习总结
20172319 2018.04.11-16 <Java程序设计教程>第6周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题 ...
- 20172319 2018.04.11 《Java程序设计教程》第7周课堂测验(补写博客)
20172319 2018.04.11 <Java程序设计教程>第7周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...
- 2018.12.08【NOIP提高组】模拟B组总结(未完成)
2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...
- 2018/04/25 PHP7的编译安装
为什么要编译安装? 因为最近要学习 swoole ,想使用目前最新的 PHP7.2.4 ,但是我所在的 Ubuntu-16.04 的 apt 下只有 PHP7.0 的版本. 加上自己也想学习一下源码的 ...
- 更新SAS 9.4(64位) SID的简单方法(可以使用至2018.04.30)
打开SAS,在程序窗口输入: PROC SETINIT RELEASE='9.4'; SITEINFO NAME='NATIONAL PINGTUNG UNI OF SCIENCE&TECH' ...
- 最新版IntelliJ IDEA2019.1破解教程(2019.04.08更新)
[原文链接]:https://www.tecchen.xyz/idea-crack.html 我的个人博客:https://www.tecchen.xyz,博文同步发布到博客园. 由于精力有限,对文章 ...
随机推荐
- 14-Dockerfile常用指令
下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档.FROM 指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build ...
- C#四则运算器(多态方法实现)
在上一节C#课上,我们学习了用类的继承的方式来做一个四则运算器,然而老师的代码在课上演示的效果并不理想,而且没有使用多态的思想实现,今天我们就来用多态的方式实现四则运算器. 1. 题目及要求 2. A ...
- OpenGL学习笔记(6) 基础光照的计算方法
这个笔记只是冯氏光照模型下漫反射光以及镜面光照的计算方式的笔记 基础光照 基础光照分为环境光,漫反射光,镜面光照 环境光 环境光是一个常量,表示在没有光源的情况下物体的光 漫反射光 漫反射光分量的计算 ...
- springboot+elasticsearch实现全局检索
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- v-if、v-show 指令
HTML部分: <div id="app"> <button type="button" @click="flag=!flag&qu ...
- JavaScript学习笔记(七)—— 再说函数
第八章 函数 1 函数声明和函数表达式 差别一:函数声明:函数在执行代码前被创建:函数表达式是在运行阶段执行代码时创建: 差别二:函数声明创建一个与函数同名的变量,并让她指向函数:使用函数表达式,不给 ...
- NO.4:自学python之路------内置方法、装饰器、迭代器
引言 是时候开始新的Python学习了,最近要考英语,可能不会周更,但是尽量吧. 正文 内置方法 Python提供给了使用者很多内置方法,可以便于编程使用.这里就来挑选其中大部分的内置方法进行解释其用 ...
- Nginx 使用(server参数配置)
文件地址nginx/conf/Nginx.conf 文件地址;nginx/conf/Nginx.conf [java] view plain copy server {# 服务名及配置,一个服务下可以 ...
- bash登录过程 其实还不太了解,先码后看
在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile. ~/.bash_login或 ~/.profile文件中的其中一个,执行的顺序 ...
- MySql 赋值操作符"="与":="
MySql小点心—1.赋值操作符"="与":=" 对于刚接触到mysql的程序员来说,会对这两个符号有疑问,因为会发现有的代码里用这个有的用另一个. 当然他们是 ...