【模考】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,博文同步发布到博客园. 由于精力有限,对文章 ...
随机推荐
- Unity3D画面渲染官方教程(一)对光照和渲染的介绍
本系列是对官方教程的翻译加上自己的一些理解译著的,官方网址:https://unity3d.com/cn/learn/tutorials/s/graphics 翻译上尽量保证准确性,但不排除省略或者添 ...
- RobotFramework测试环境搭建记录
Robotframwork测试环境搭建记录 1.安装Python2.7(https://www.python.org/) 在环境变量path中加入“C:\Python27” 安装后的验证方法为在命令行 ...
- Netty源码分析第2章(NioEventLoop)---->第5节: 优化selector
Netty源码分析第二章: NioEventLoop 第五节: 优化selector 在剖析selector轮询之前, 我们先讲解一下selector的创建过程 回顾之前的小节, 在创建NioEv ...
- Netty源码分析第3章(客户端接入流程)---->第4节: NioSocketChannel注册到selector
Netty源码分析第三章: 客户端接入流程 第四节: NioSocketChannel注册到selector 我们回到最初的NioMessageUnsafe的read()方法: public void ...
- linux后台启动程序脚本实例
启动安装的zookeeper和kafka #!/bin/bash # start zookeeper and kafka service echo "========== Start the ...
- java内存结构JVM——java内存模型JMM——java对象模型JOM
JVM内存结构 Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存在,而有些区 ...
- IOS上z-index和fixed定位无效
IOS上z-index和fixed定位无效 在该元素上加: -webkit-transform:translateZ(1px); -moz-transform:translateZ(1px); -o- ...
- 第十二周作业_PSP总结报告
回顾1 (1)回想一下你曾经对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你认为过去接触到的课程是否符合你对计算机专业的期待,为什么?经过一个学 ...
- 在js中保存数据
localStorage: localStorage.setItem("key", "value"); localStorage.getItem("k ...
- bing词典vs有道词典对比测试报告——功能篇之细节与用户体验
之所以将细节与用户体验放在一起讨论,是因为两者是那么的密不可分.所谓“细节决定成败”,在细节上让用户感受方便.舒适.不费心而且温馨,多一些人文理念,多一些情怀,做出来的产品自然比其他呆板的产品更受欢迎 ...