【模考】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,博文同步发布到博客园. 由于精力有限,对文章 ...
随机推荐
- 简单的redis工具类
import java.util.Arrays; import java.util.List;import java.util.Set; import org.apache.commons.lang. ...
- 记录Centos7搭建ftp服务器以及遇到的各种坑
前言 今天被经理要求搭建ftp服务器,然后就去网上搜索了一下教程.搭建成功后(遇到的坑不少)特此记录一下.因为是为了记录一下整个操作流程以防以后使用所以比较啰嗦. 目录 1.安装vsftpd 2.创建 ...
- TPO-23 C1 Post a student announcement
第 1 段 1.Listen to a conversation between a student and the director of campus activities. 请听一段学生与校园活 ...
- 3. 第一个程序Hello, World!
第一个接口 HelloWorld 本项目所有代码均可在github上下载. 1. 编辑config.py # 基础配置类 import os class Config(object): ROOT = ...
- 【转】利用telnet来进行调试Skynet
https://blog.csdn.net/WhereIsHeroFrom/article/details/80674408
- 软件RAID
软件RAID也必须在多磁盘系统中才能实现.实现RAID1最少要拥有两块硬盘,而实现RAID5则最少要拥有三块硬盘.通常情况下,操作系统所在磁盘采用RAID1,而数据所在磁盘采用RAID5. 卷的类 ...
- linux后台启动程序脚本实例
启动安装的zookeeper和kafka #!/bin/bash # start zookeeper and kafka service echo "========== Start the ...
- EF多个上下文迁移
步骤: 1. Enable-Migrations 2. add-migration Initial -ConfigurationTypeName ModelOneDbConfig 3. update- ...
- ES6----Proxy(一)
Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. 听起来好像很绕,可以简单这样理解,Proxy相当于 ...
- Spring Bean注册解析(二)
在上文Spring Bean注册解析(一)中,我们讲解了Spring在注册Bean之前进行了哪些前期工作,以及Spring是如何存储注册的Bean的,并且详细介绍了Spring是如何解析 ...