牛客网暑期ACM多校训练营(第十场)D Rikka with Prefix Sum (组合数学)
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 (组合数学)相关推荐
- 牛客网暑期ACM多校训练营(第九场)
牛客网暑期ACM多校训练营(第九场) A. Circulant Matrix 做法:看到下标 \(xor\) 这种情况就想 \(FWT\),可是半天没思路,于是放弃了..其实这个 \(n\) 疯狂暗示 ...
- 牛客网暑期ACM多校训练营(第一场)
牛客网暑期ACM多校训练营(第一场) A. Monotonic Matrix 考虑0和1的分界线,1和2的分界线,发现问题可以转化为两条不互相穿过的路径的方案数(可重叠),题解的做法就是把一条路径斜着 ...
- 牛客网暑期ACM多校训练营(第二场): H. travel(树形线头DP)
链接:https://ac.nowcoder.com/acm/contest/140/H 来源:牛客网 题目描述 White Cloud has a tree with n nodes.The roo ...
- 牛客网暑期ACM多校训练营(第三场): E. Sort String(KMP)
链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 题目描述 Eddy likes to play with string which is a ...
- 牛客网暑期ACM多校训练营(第三场): C. Shuffle Cards(splay)
链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...
- 牛客网暑期ACM多校训练营(第二场)A .run
链接:https://www.nowcoder.com/acm/contest/140/A 来源:牛客网 题目描述 White Cloud is exercising in the playgroun ...
- 牛客网暑期ACM多校训练营(第一场) J (莫队算法)
题目链接:https://www.nowcoder.com/acm/contest/139/J 题目大意:给一个序列,进行q次查询,问1~l和r~n中有多少个不同的数字 题目思路:之前只是听说过莫队算 ...
- 牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)
题目链接: https://www.nowcoder.com/acm/contest/140/J 思路: 都写在代码注释里了,非常好懂.. for_each函数可以去看一下,遍历起vector数组比较 ...
- 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)...
J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...
- 牛客网暑期ACM多校训练营(第二场)D-money (dp)
题目链接 题意 一共有n件商店,每个商店买卖东西的价格和不同,白兔想用差价挣钱,每次只能携带一种物品,问白兔最多赚多少的钱,和对应的交易次数 AC 两个变量分别记录当前买东西和买东西的剩余财富,财富越 ...
最新文章
- 红帽linux终端快捷键,二、回忆redhat各种基本命令
- Kinect 骨骼追踪数据的处理方法
- 使用Git上传本地项目到http://git.oschina.net
- aehyok.com的成长之路二——技术选型
- 使用windows activeX 在Webclient UI 中打开word文档
- det曲线_平面曲线的曲率的复数表示
- 用Unix的设计思想来应对多变的需求
- 理论物理-从规范对称的意义说下去
- 计算机考试交互,2017计算机等级考试HTTP的基本概念与交互模型练习题
- 项目解析jsx文件_React 基础:JSX 扩展语法
- 【Data guard】Switchover切换
- 暴力破解字典及字典生成器
- 烧录工具Android Tool的使用
- android系统源码学习 -- 蓝牙 bluetooth (一) 入门
- RabbitMQ之消息模式简单易懂,超详细分享
- SAP ERP数据表清单
- linux下使用如何使用多个CPU核
- 变分自编码器原理解析
- 用户研究专题:定量研究
- docker修练之windows与linux下实践记录
热门文章
- Springboot之actuator配置不当漏洞RCE(jolokia)
- zmq 接口函数之 :zmq_socket_monitor - 注册一个监控回调函数
- python ThreadPoolExecutor线程池(实例)
- linux shell 清空文件,查看文件,写入文件
- netcat、nc工具随记
- angularJs中的发送请求例子
- 详解 Android 的 Activity 组件
- sigal mq_notify
- Service Unavailable解决方法
- php5.6 xdebug 配置,php5.5+apache2.4+mysql5.6+xdebug配置