B 君的第二题 (hongkong)

题目大意:

一个长度为\(n(n\le2\times10^5)\)的数组,给定一个数\(k(k\le40)\)。用\(a[i][j]\)表示该数组\(i\)次前缀和中第\(j\)项的值,要求支持以下两种操作:

  1. 输入\(x,y\),将\(a[0][x]\)加上\(y\);
  2. 输入\(x\),求\(a[k][x]\)的值。

思路:

题目询问的实际上就是\(\sum_{i=1}^x\binom{x-i+k-1}{k-1}a[0][i]\)。

我们可以得到

\[\begin{align*}
&\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)的更多相关文章

  1. test20181020 B君的第二题

    题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...

  2. test20181016 B君的第二题

    题意 分析 考场暴力50分. 考虑bfs序,一个点的儿子节点的bfs序一定连续,所以对bfs序建线段树,努力打一下就行了. 时间复杂度\(O(n \log n + m \log n)\) #inclu ...

  3. test20181017 B君的第二题

    题意 分析 考场50分 旁边的L君告诉我,求的就是非升子序列的个数,于是写了个树状数组. 但是\(\mod{2333} > 0\)还需要组合数中没有2333的倍数,所以实际上只得了\(a_i \ ...

  4. test20181015 B君的第二题

    题意 分析 考场85分 用multiset暴力,由于教练的机子飞快,有写priority_queue水过了的人. #include<cstdlib> #include<cstdio& ...

  5. test20181019 B君的第二题

    题意 分析 快速子集和变换以及快速超集和变换的裸题. 用\(f(s)\)表示集合s的方案数,初始化为输入中s出现的次数. 做一遍快速子集和变换,此时f(s)表示s及其子集在输入中出现的次数. 对所有f ...

  6. Java蓝桥杯02——第二题集锦:生日蜡烛、星期一、方格计数、猴子分香蕉

    第二题 生日蜡烛(结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填 ...

  7. 05:统计单词数【NOIP2011复赛普及组第二题】

    05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...

  8. 常见面试第二题之什么是Context

    今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲android中的context.我相信大家android开发者一定对于这个context非常熟悉,肯定都有使用过,肯定没有没使用过的.但是 ...

  9. 《学习OpenCV》练习题第五章第二题abc

    代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...

随机推荐

  1. kaggle比赛流程(转)

    一.比赛概述 不同比赛有不同的任务,分类.回归.推荐.排序等.比赛开始后训练集和测试集就会开放下载. 比赛通常持续 2 ~ 3 个月,每个队伍每天可以提交的次数有限,通常为 5 次. 比赛结束前一周是 ...

  2. 上传漏洞新姿势(限Linux)

    服务器:Linux当前环境:nginx/1.4.7PHP版本:PHP Version 7.0.0  上传情况简介:上传  111.jpg111 确实可以成功的但是上传  1.php.jpg1111.1 ...

  3. [Leetcode Week16]Insertion Sort List

    Insertion Sort List 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/insertion-sort-list/description/ ...

  4. Linux内核中链表的实现与应用【转】

    转自:http://blog.chinaunix.net/uid-27037833-id-3237153.html 链表(循环双向链表)是Linux内核中最简单.最常用的一种数据结构.         ...

  5. 学习 Linux,101: 自定义或编写简单脚本【转】

    转自:http://www.ibm.com/developerworks/cn/linux/l-lpic1-105-2/index.html 学习如何使用标准的 shell 语法.循环和控制结构,以及 ...

  6. Struts2学习笔记02 之 使用

    一.页面向Action传参 1.基本属性注入,页面命名name,action提供成员变量name并提供set方法. 2.域模型注入:页面用user.name对象点属性形式.action成员user对象 ...

  7. leetcode 之Set Matrix Zeroes(10)

    设置两个布尔数组,记录行和列是否存在0.需要注意的是如何将行或列设为0. void setZeros(vector<vector<int>> &matrix) { in ...

  8. beego学习笔记(1)

    公司准备开发一个针对塔吊行业的APP. 后台采用微服务,docker容器部署. 准备采用go进行微服务的开发. 采用beego进行restful API的开发. 第一步,访问beego的官方网站: h ...

  9. IEDA自动清除无用的import

    Before After Step     快捷键展示格式化对话框:ctrl + shift + alt + l   格式化快捷键:ctrl + alt + l <wiz_tmp_tag id= ...

  10. IOS中div contenteditable=true无法输入 fastclick.js在点击一个可输入的div时,ios无法正常唤起输入法键盘

    原文地址: https://blog.csdn.net/u010377383/article/details/79838562 前言 为了提升移动端click的响应速度,使用了fastclick.js ...