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

题意

一个A数组,初始全为0。现有三种操作,1:给区间[L,R]+w;2:把每个位置的元素变为其前缀和;3:求区间[L,R]的和

分析

参考:http://www.cnblogs.com/tetew/p/9504595.html

看到题的时候慌了神,因为1、2操作的可能次数实在太大了,认为是什么巧妙的数据结构。。。

实则是组合数学,脑子不够用啊。

首先我们讨论一下对某个位置的数进行+w的操作后,会对后面有什么影响。

纵列看作是2操作的次数,横排看作位置。45°斜着看,有点像杨辉三角!

于是,如果在(i,j)+w,那么对于位于其右下方的点(x,y)来说,贡献为C(x-i+y-j-1,x-i-1)*w

因为3操作不超过500次,我们记录1和2的操作,对于每次3操作,再O(n)查询。

求区间[L,R]的和时,可以直接solve(x+1,R)-solve(x+1,L-1),solve()是求前面所有的操作1和操作2的贡献,并且要加上这一次的求前缀和的贡献(所以是x+1)。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(a, b) memset(a, b, sizeof(a))
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define eps 0.0000000001
#define IOS ios::sync_with_stdio(0);cin.tie(0);
#define random(a, b) rand()*rand()%(b-a+1)+a
#define pi acos(-1)
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const int inf = 0x3f3f3f3f;
const int maxn = 200000 + 100;
const int maxm = 200000 + 10;
const int mod = 998244353;
ll fac[maxn],inv[maxn];
ll qpow(ll a,ll b){ll res=1;while(b){if(b&1) res=res*a%mod;b>>=1;a=a*a%mod;}return res;
}
void init(){fac[0]=1;for(int i=1;i<maxn;i++) fac[i]=fac[i-1]*i%mod;inv[maxn-1]=qpow(fac[maxn-1],mod-2);for(int i=maxn-2;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
}
ll C(int n,int m){if(m>n||m<0) return 0;return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
struct ND{int x,pos,w;
}a[maxn];
int cnt;
ll cal(int x,int y){ll res=0;for(int i=1;i<=cnt;i++){if(a[i].x<=x&&a[i].pos<=y){res=(res+C(x-a[i].x+y-a[i].pos-1,x-a[i].x-1)*a[i].w%mod+mod)%mod;}}return res;
}
int main() {
#ifdef LOCALfreopen("in.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
#endifinit();int T;int n,m,op,x,y;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);int now=1;cnt=0;while(m--){scanf("%d",&op);if(op==1){scanf("%d%d%d",&x,&y,&op);a[++cnt].x=now-1,a[cnt].pos=x,a[cnt].w=op;a[++cnt].x=now-1,a[cnt].pos=y+1,a[cnt].w=-op;}else if(op==2){now++;}else{scanf("%d%d",&x,&y);ll ans=(cal(now+1,y)-cal(now+1,x-1)+mod)%mod;printf("%lld\n",ans);}}}return 0;
}

转载于:https://www.cnblogs.com/fht-litost/p/9563521.html

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

  1. 牛客网暑期ACM多校训练营(第九场)

    牛客网暑期ACM多校训练营(第九场) A. Circulant Matrix 做法:看到下标 \(xor\) 这种情况就想 \(FWT\),可是半天没思路,于是放弃了..其实这个 \(n\) 疯狂暗示 ...

  2. 牛客网暑期ACM多校训练营(第一场)

    牛客网暑期ACM多校训练营(第一场) A. Monotonic Matrix 考虑0和1的分界线,1和2的分界线,发现问题可以转化为两条不互相穿过的路径的方案数(可重叠),题解的做法就是把一条路径斜着 ...

  3. 牛客网暑期ACM多校训练营(第二场): H. travel(树形线头DP)

    链接:https://ac.nowcoder.com/acm/contest/140/H 来源:牛客网 题目描述 White Cloud has a tree with n nodes.The roo ...

  4. 牛客网暑期ACM多校训练营(第三场): E. Sort String(KMP)

    链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 题目描述 Eddy likes to play with string which is a ...

  5. 牛客网暑期ACM多校训练营(第三场): C. Shuffle Cards(splay)

    链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...

  6. 牛客网暑期ACM多校训练营(第二场)A .run

    链接:https://www.nowcoder.com/acm/contest/140/A 来源:牛客网 题目描述 White Cloud is exercising in the playgroun ...

  7. 牛客网暑期ACM多校训练营(第一场) J (莫队算法)

    题目链接:https://www.nowcoder.com/acm/contest/139/J 题目大意:给一个序列,进行q次查询,问1~l和r~n中有多少个不同的数字 题目思路:之前只是听说过莫队算 ...

  8. 牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)

    题目链接: https://www.nowcoder.com/acm/contest/140/J 思路: 都写在代码注释里了,非常好懂.. for_each函数可以去看一下,遍历起vector数组比较 ...

  9. 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)...

    J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...

  10. 牛客网暑期ACM多校训练营(第二场)D-money (dp)

    题目链接 题意 一共有n件商店,每个商店买卖东西的价格和不同,白兔想用差价挣钱,每次只能携带一种物品,问白兔最多赚多少的钱,和对应的交易次数 AC 两个变量分别记录当前买东西和买东西的剩余财富,财富越 ...

最新文章

  1. 红帽linux终端快捷键,二、回忆redhat各种基本命令
  2. Kinect 骨骼追踪数据的处理方法
  3. 使用Git上传本地项目到http://git.oschina.net
  4. aehyok.com的成长之路二——技术选型
  5. 使用windows activeX 在Webclient UI 中打开word文档
  6. det曲线_平面曲线的曲率的复数表示
  7. 用Unix的设计思想来应对多变的需求
  8. 理论物理-从规范对称的意义说下去
  9. 计算机考试交互,2017计算机等级考试HTTP的基本概念与交互模型练习题
  10. 项目解析jsx文件_React 基础:JSX 扩展语法
  11. 【Data guard】Switchover切换
  12. 暴力破解字典及字典生成器
  13. 烧录工具Android Tool的使用
  14. android系统源码学习 -- 蓝牙 bluetooth (一) 入门
  15. RabbitMQ之消息模式简单易懂,超详细分享
  16. SAP ERP数据表清单
  17. linux下使用如何使用多个CPU核
  18. 变分自编码器原理解析
  19. 用户研究专题:定量研究
  20. docker修练之windows与linux下实践记录

热门文章

  1. Springboot之actuator配置不当漏洞RCE(jolokia)
  2. zmq 接口函数之 :zmq_socket_monitor - 注册一个监控回调函数
  3. python ThreadPoolExecutor线程池(实例)
  4. linux shell 清空文件,查看文件,写入文件
  5. netcat、nc工具随记
  6. angularJs中的发送请求例子
  7. 详解 Android 的 Activity 组件
  8. sigal mq_notify
  9. Service Unavailable解决方法
  10. php5.6 xdebug 配置,php5.5+apache2.4+mysql5.6+xdebug配置