B 君的第二题 (hongkong)
B 君的第二题 (hongkong)
题目大意:
一个长度为\(n(n\le2\times10^5)\)的数组,给定一个数\(k(k\le40)\)。用\(a[i][j]\)表示该数组\(i\)次前缀和中第\(j\)项的值,要求支持以下两种操作:
- 输入\(x,y\),将\(a[0][x]\)加上\(y\);
- 输入\(x\),求\(a[k][x]\)的值。
思路:
题目询问的实际上就是\(\sum_{i=1}^x\binom{x-i+k-1}{k-1}a[0][i]\)。
我们可以得到
&\sum_{i=1}^x\binom{x-i+k-1}{k-1}a[0][i]\\
=&\sum_{i=1}^x\sum_{j=0}^{k-1}\binom xj\binom{k-i-1}{k-j-1}a[0][i]\\
=&\sum_{j=0}^{k-1}\binom xj\left(\sum_{i=1}^x\binom{k-i-1}{k-j-1}a[0][i]\right)
\end{align*}
\]
用树状数组维护即可。
时间复杂度\(\mathcal O(mk\log n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
using int64=long long;
constexpr int N=4e5+1,K=41,mod=1e9+7;
int n,m,k,fac[N],ifac[N];
void exgcd(const int &a,const int &b,int &x,int &y) {
if(!b) {
x=1,y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
inline int inv(const int &x) {
int ret,tmp;
exgcd(x,mod,ret,tmp);
return (ret%mod+mod)%mod;
}
inline int C(const int &n,const int &m) {
if(n<m) return 0;
return (int64)fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
class FenwickTree {
private:
int val[K][N];
int lowbit(const int &x) const {
return x&-x;
}
int query(const int &p,const int &v) const {
int ret=0;
if(v==0) return val[k][p];
for(register int i=1;i<=k;i++) {
(ret+=(int64)val[i][p]*C(v+k-i-1,v-1)%mod)%=mod;
}
return ret;
}
public:
int query(const int &p) const {
int ret=0;
for(register int i=p;i;i-=lowbit(i)) {
(ret+=query(i,p-i))%=mod;
}
return ret;
}
void modify(const int &p,const int &x) {
for(register int i=1;i<=k;i++) {
for(register int j=p;j<=n;j+=lowbit(j)) {
(val[i][j]+=(int64)C(i+j-p-1,i-1)*x%mod)%=mod;
}
}
}
};
FenwickTree t;
int main() {
n=getint(),m=getint(),k=getint();
for(register int i=fac[0]=1;i<=n*2;i++) {
fac[i]=(int64)fac[i-1]*i%mod;
}
ifac[n*2]=inv(fac[n*2]);
for(register int i=n*2;i;i--) {
ifac[i-1]=(int64)ifac[i]*i%mod;
}
for(register int i=0;i<m;i++) {
const int opt=getint();
if(opt==0) {
const int x=getint(),y=getint();
t.modify(x,y);
}
if(opt==1) {
printf("%d\n",t.query(getint()));
}
}
return 0;
}
B 君的第二题 (hongkong)的更多相关文章
- test20181020 B君的第二题
题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...
- test20181016 B君的第二题
题意 分析 考场暴力50分. 考虑bfs序,一个点的儿子节点的bfs序一定连续,所以对bfs序建线段树,努力打一下就行了. 时间复杂度\(O(n \log n + m \log n)\) #inclu ...
- test20181017 B君的第二题
题意 分析 考场50分 旁边的L君告诉我,求的就是非升子序列的个数,于是写了个树状数组. 但是\(\mod{2333} > 0\)还需要组合数中没有2333的倍数,所以实际上只得了\(a_i \ ...
- test20181015 B君的第二题
题意 分析 考场85分 用multiset暴力,由于教练的机子飞快,有写priority_queue水过了的人. #include<cstdlib> #include<cstdio& ...
- test20181019 B君的第二题
题意 分析 快速子集和变换以及快速超集和变换的裸题. 用\(f(s)\)表示集合s的方案数,初始化为输入中s出现的次数. 做一遍快速子集和变换,此时f(s)表示s及其子集在输入中出现的次数. 对所有f ...
- Java蓝桥杯02——第二题集锦:生日蜡烛、星期一、方格计数、猴子分香蕉
第二题 生日蜡烛(结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填 ...
- 05:统计单词数【NOIP2011复赛普及组第二题】
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...
- 常见面试第二题之什么是Context
今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲android中的context.我相信大家android开发者一定对于这个context非常熟悉,肯定都有使用过,肯定没有没使用过的.但是 ...
- 《学习OpenCV》练习题第五章第二题abc
代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...
随机推荐
- 新建一个express工程,node app无反应
1.问题描述 新建一个express工程,node app以后无反应,浏览器输入localhost:3000,显示如下 2.解决方法 在app.js文件中加入如下代码 app.listen(3000, ...
- IT界天才少年:比肩雷军、叫板任正非,自己作死了
两点之间,走弯路和走直路到达的终点是一样的,而他只是走了弯路,他曾在华为身居高位.后又创业.做投资,完全是不差钱的主. 他跌宕起伏的人生中充满传奇,成功.失败.遗憾.矛盾,每个词都不足以形容他,只有这 ...
- Linux信号函数
1. signal函数: #include <signal.h> void (*signal(int signo, void (*func)(int)))(int); ret-成功返回信号 ...
- python爬虫模块之HTML解析模块
这个就比较简单了没有什么好强调的,如果返回的json 就是直接按照键值取,如果是网页就是用lxml模块的html进行xpath解析. from lxml import html import json ...
- 【bzoj4765】普通计算姬
一道奇奇怪怪的数据结构题? 把树线性化,然后分块维护吧. 为了加速,求和用树状数组维护每个块的值. #include<bits/stdc++.h> #define N 100010 #de ...
- python内建方法
abs all any apply basestring bin bool buffer bytearray bytes callable chr classmethod cmp coerce com ...
- java实现数据库分页
/*** * 工具类 * @param pageIndex //页码 * @param pageSize//每页数据的条数 * @param rowCount//总的数据条数 * @return */ ...
- 【Android开发日记】之基础篇(二)——Android的动画效果
什么是动画,动画的本质是通过连续不断地显示若干图像来产生“动”起来的效果.比如说一个移动的动画,就是在一定的时间段内,以恰当的速率(起码要12帧/秒以上,才会让人产生动起来的错觉)每隔若干 ...
- 用指定jdk执行jar包
在运行jar包前执行以下命令,作用是在当前命令行窗口作用域内修改环境变量: export JAVA_HOME=/root/jiabao.gao/Hbase2Redis-1.0.0-SNAPSHOT/j ...
- linux命令(14):ifup/ifdown/ip addr命令
开启网卡:ifup eth0 关闭网卡:ifdown eth0 查看网卡接入状态:ip addr[可查看哪块网卡up/down状态]