Rikka with Prefix Sum

题目

https://www.nowcoder.com/acm/contest/148/D

题目有三个操作

  1. l到r都添加一个数
  2. 取一次前缀和
  3. 查询区间和

这三个操作实际上都跟求前缀和有关。

如果把操作2当作时间戳 进行一次操作2时间就加一,而操作一相当于时间-1的时候对l点加w,对r+1点加-w。而查询操作就相当于时间+1的时候query(r)-query(l-1)。

那求前缀和该怎么做呢?刚开始我想的是用树状数组,但是要求很多次前缀和,复杂度不允许。我们可以打个表找一下规律。

若在某点添加1

time a1 a2 a3 a4
0 add 1 0 0 0
1 1 1 1 1
2 1 2 3 4
3 1 3 6 10
4 1 4 10 20
5 query 1 5 15 35

看上去是不是很眼熟:

相当于倾斜45°的杨辉三角

然后找出规律



于是:单点修改对一点贡献度为

C(L+T-1,T-1) * V
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
const int maxn=1e5+7;
ll inv[maxn<<1],fac[maxn<<1];
template<class T>
void read(T &res)
{
res=0;
char c=getchar();
T f=1;
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
res=res*10+c-'0';
c=getchar();
}
res*=f;
}
ll qpow(ll x,ll n){
ll ret=1;
x%=mod;
while(n){
if(n&1) ret=ret*x%mod;
x=x*x%mod;
n>>=1;
}
return ret;
}
void init()
{
int N=maxn*2;
fac[0]=1;
for(int i=1;i<N;i++){
fac[i]=fac[i-1]*i%mod;
}
inv[N-1]=qpow(fac[N-1],mod-2);
for(int i=N-2;i>=0;i--){
inv[i]=inv[i+1]*(i+1)%mod;
}
}
ll c(int n,int k)
{
if(k>n||k<0) return 0;
return fac[n]*inv[k]%mod*inv[n-k]%mod;
}
struct node
{
int time;
int val;
int id;
}s[maxn];
int tol;
ll query(int a,int b)
{
ll ans=0;
for(int i=0;i<tol;i++){
if(s[i].time<=a&&s[i].id<=b)
{
ans=(ans+c(a-s[i].time+b-s[i].id-1,a-s[i].time-1)*s[i].val%mod)%mod;
}
}
return ans;
}
int main()
{
int t;
read(t);
init();
while(t--){
int n,m,op,l,r,w;
read(n);
read(m);
tol=0;
int cur=1;
for(int i=1;i<=m;i++){
read(op);
if(op==1){
read(l),read(r),read(w);
s[tol].id=l,s[tol].val=w%mod ,s[tol].time=cur-1;
tol++;
s[tol].id=r+1,s[tol].val=-w%mod ,s[tol].time=cur-1;
tol++;
}
else if(op==2) cur++;
else if(op==3){
read(l);
read(r);
ll ans=query(cur+1,r)-query(cur+1,l-1);
ans=(ans%mod+mod)%mod;
printf("%lld\n",ans);
}
}
}
return 0;
}

Rikka with Prefix Sum的更多相关文章

  1. 牛客网暑期ACM多校训练营(第十场)D Rikka with Prefix Sum (数学)

    Rikka with Prefix Sum 题意: 给出一个数组a,一开始全为0,现在有三种操作: 1.  1 L R W,让区间[L,R]里面的数全都加上W: 2.  2     将a数组变为其前缀 ...

  2. Rikka with Prefix Sum(组合数学)

    Rikka with Prefix Sum 题目描述 Prefix Sum is a useful trick in data structure problems. For example, giv ...

  3. 牛客网暑期ACM多校训练营(第十场)D Rikka with Prefix Sum (组合数学)

    https://www.nowcoder.com/acm/contest/148/D 题意 一个A数组,初始全为0.现有三种操作,1:给区间[L,R]+w:2:把每个位置的元素变为其前缀和:3:求区间 ...

  4. 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...

  5. 牛客多校10 D Rikka with Prefix Sum 不是数据结构

    https://www.nowcoder.com/acm/contest/148/D 题意: 1e5个数,1e5个操作,操作分为: 1.区间加. 2.整个数列替换为前缀和. 3.区间查询. 查询数小于 ...

  6. 牛客第十场Rikka with Prefix Sum

    由于其中的2操作非常多,我们就需要将其快速的更改,就会用到组合数的东西 其实自己手写一下就可以发现对于一个点增加的值在经过不断地前缀和累加过程中对于一点的贡献满足杨辉三角 所以我们就需要记录一下其中的 ...

  7. 牛客多校第十场-D- Rikka with Prefix Sum

    链接:https://www.nowcoder.com/acm/contest/148/D来源:牛客网 Prefix Sum is a useful trick in data structure p ...

  8. 4.4 CUDA prefix sum一步一步优化

    1. Prefix Sum 前缀求和由一个二元操作符和一个输入向量组成,虽然名字叫求和,但操作符不一定是加法.先解释一下,以加法为例: 第一行是输入,第二行是对应的输出.可以看到,Output[1] ...

  9. Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)

    Problem  Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Descripti ...

随机推荐

  1. 吴裕雄--天生自然 PHP开发学习:运算符

    <?php $x=10; $y=6; echo ($x + $y); // 输出16 echo '<br>'; // 换行 echo ($x - $y); // 输出4 echo ' ...

  2. docker入门资料及常用命令

      Docker17中文开发手册 :https://www.php.cn/manual/view/36147.html   Linux部署Docker及常用命令: https://www.cnblog ...

  3. 使用idea断点调试时出现no executable code found at line问题

    问题描述 今天突然碰到了这样的一个问题: 使用断点调试时,断点的地方出现了一个叉号,而不是对勾,这就让我非常无奈了. 调了一天,终于把这个问题解决了,还是要记录一下的. 问题情况如下: 除了这里,de ...

  4. Codeforces Round #599 (Div. 2) Tile Painting

    题意:就是给你一个n,然后如果  n mod | i - j | == 0  并且 | i - j |>1 的话,那么i 和 j 就是同一种颜色,问你最大有多少种颜色? 思路: 比赛的时候,看到 ...

  5. 82.常用的返回QuerySet对象的方法使用详解:all,select_related

    1. all: 返回这个ORM模型的QuerySet对象. articles = Article.objects.all() print(articles) 2.select_related: 查找数 ...

  6. ES6 之 数值扩展

    1.ES5 // Number类型重写了valueOf() toLocaleString() toString('进制')方法 let a = 10 console.log(a.valueOf()); ...

  7. unable to execute /bin/mv: Argument list too long

    四种解决”Argument list too long”参数列表过长的办法 转自 http://hi.baidu.com/cpuramdisk/item/5aa49ce00c0757aecf2d4f2 ...

  8. 2020/1/29 PHP代码审计之XSS漏洞

    0x00 XSS漏洞简介 人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆.因此,有 ...

  9. 经理人和app开发者大打出手,说明这个市场已经畸形变态?

    日前,一件民生事件在网络上广为流传,成为人们热议的话题:中国平安的产品经理向app开发者提了一个需求,要求用户app的主题颜色能根据手机外壳自动调整,可能是开发人员觉得这个要求太不合理,而且感到十分绝 ...

  10. 使用linux服务器安装wordpress博客详细教程

    前言 最近读了<软技能:代码之外的生存指南>,这本书给了我很大的启示.之前虽然知道作为一个程序员,应该拥有自己的博客,以便于提升自己的知名度,但是并没有了解的过于详细.这本书描写博客的作用 ...