牛客多校10 D Rikka with Prefix Sum 不是数据结构
https://www.nowcoder.com/acm/contest/148/D
题意:
1e5个数,1e5个操作,操作分为:
1、区间加。
2、整个数列替换为前缀和。
3、区间查询。 查询数小于500.
题解:比赛时的思路是:(基本正确,没能实现)
1.对于某个操作1,记录下其之后操作2的个数,就可以通过组合数O(1)算出该区间的每个数最终的结果。
2.各个操作1相互独立,分开来算,最后相加。(暴力出来的规律)
没想到的两点:
1.可以通过组合数O(1)算出区间和:用公式

之前碰到过,杨辉三角上很明显。但直接导致我认为这个想法还是O(n*n/2)orz。
2.考虑某次区间加之后,操作2对该区间后面的数的影响:可以认为l~n加了v,r+1到n加了-v 正好抵消
另外:尝试了快速mod模板
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<string>
#include<bitset> #define re register
#define rep(i,s,t) for(re int i=s;i<=t;++i)
#define per(i,s,t) for(re int i=s;i>=t;--i)
#define mmm(f,x) memset(f,x,sizeof f)
//#define x first
//#define xx second
using namespace std; typedef long long ll; const ll mod = ;
template<typename T>inline void add_(T &A, int B, ll MOD = mod) { A += B; (A >= MOD) && (A -= MOD); }
template<typename T>inline void mul_(T &A, ll B, ll MOD = mod) { A = (A*B) % MOD; }
template<typename T>inline void mod_(T &A, ll MOD = mod) { A %= MOD; A += MOD; A %= MOD; }
const int maxn = 3e5 + ;
int a[maxn];
int n, m;
int tot,Q;
ll L[maxn], R[maxn],W[maxn],num2[maxn];
ll inv[maxn], fac[maxn];
ll c[maxn];
long long kpow(long long a, long long n) {
long long res = ;
while (n > ) {
if (n & )res = res * a%mod;
a = a * a%mod;
n >>= ;
}
return res;
}
void init() {
fac[] = fac[] = ;
inv[] = ;
rep(i, , maxn) {
fac[i] = fac[i - ] * (ll)i % mod;
inv[i] = kpow(fac[i], mod - );
}
}
ll C(int n, int m) {
if (n < m) return 0ll;
if (m == || n == m) return 1ll;
if (n - == m || m == ) return n;
return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
ll Csum(ll l, ll r, ll v, ll q) {
if (l>r)return ;
ll n = r - l + ;
ll ans = v;
mul_(ans,C(q + n - , q));
mod_(ans);
return ans;
}
ll query(int x) {
ll ret = ;
rep(i, , tot) {
int q = Q - num2[i] + ;
if (L[i] > x)continue;
if (R[i] <= x) {
add_(ret, Csum(L[i], x, W[i], q));
add_(ret, Csum(R[i] + , x, -W[i], q));
mod_(ret);
}
else add_(ret, Csum(L[i], x, W[i], q));
}
return ret;
}
int main() {
init();
int t;
cin >> t;
while (t--) {
tot = ,Q=;
cin >> n >> m;
rep(i, , m) {
int op;
scanf("%d", &op);
if (op == ) {
Q++;
}
else {
ll l, r;
scanf("%lld%lld", &l, &r); if (op == ) {
ll w;
scanf("%lld", &w);
L[++tot] = l, R[tot] = r; W[tot] = w;
num2[tot] = Q;
}
else { cout<< (query(r) - query(l - ) + mod) % mod << endl; }
}
}
}
}
/*
1
100000 7
1 1 3 1
2
3 2333 6666
2
3 2333 6666
2
3 2333 6666
*/
牛客多校10 D Rikka with Prefix Sum 不是数据结构的更多相关文章
- 牛客多校第十场 A Rikka with Lowbit 线段树
链接:https://www.nowcoder.com/acm/contest/148/A来源:牛客网 题目描述 Today, Rikka is going to learn how to use B ...
- 牛客网暑期ACM多校训练营(第十场)D Rikka with Prefix Sum (数学)
Rikka with Prefix Sum 题意: 给出一个数组a,一开始全为0,现在有三种操作: 1. 1 L R W,让区间[L,R]里面的数全都加上W: 2. 2 将a数组变为其前缀 ...
- 2020牛客多校第八场K题
__int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- 牛客多校第一场 B Inergratiion
牛客多校第一场 B Inergratiion 传送门:https://ac.nowcoder.com/acm/contest/881/B 题意: 给你一个 [求值为多少 题解: 根据线代的知识 我们可 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- 牛客多校第三场 F Planting Trees
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
随机推荐
- 实例展示elasticsearch集群生态,分片以及水平扩展.
elasticsearch用于构建高可用和可扩展的系统.扩展的方式可以是购买更好的服务器(纵向扩展)或者购买更多的服务器(横向扩展),Elasticsearch能从更强大的硬件中获得更好的性能,但是纵 ...
- 物联网架构成长之路(5)-EMQ插件配置
1. 前言 上一小结说了插件的创建,这一节主要怎么编写代码,以及具体流程之类的.2. 增加一句Hello World 修改 ./deps/emq_plugin_wunaozai/src/emq_plu ...
- 《软件测试自动化之道》读书笔记 之 SQL 存储过程测试
<软件测试自动化之道>读书笔记 之 SQL 存储过程测试 2014-09-28 待测程序测试程序 创建测试用例以及测试结果存储 执行T-SQL脚本 使用BCP工具导入测试用例数据 ...
- Godot游戏引擎 3.0 Beta2 于12月21日发布
Beta版继续在修复bug.其官方表示原计划在今年的圣诞节发布3.0 Stable版的,但看来只能继续跳票. 由于开发力量比较单薄,新版本的开发进展算是比较慢的,但3.0这个版本值得期待. Godot ...
- Java知多少(78)Java向量(Vector)及其应用
Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一 ...
- 关于Unity中ARPG游戏人物移动(专题十一)
ARPG:动作型角色扮演类游戏 大多数的ARPG游戏都是使用摇杆操作,以第三人称摄像机的方式来跟随主角,实际上人物只走八个方向,上,下,左,右,左上,左下,右下,右上 控制角色移动的思路1: 在ARP ...
- R语言三元相图的做法
通常情况下,对于三维数据,我们会用三维图表来展示,想要从三维图表上观察出一定的规律,需要一定的空间想象力: 而三元相图,其实就是用二维平面的1个等边三角形来表征三维数据,三角形的每一条边对应1个维度, ...
- Linux时间变慢解决方法
情景:系统为CentOS-5.4,硬件时间正确(查看硬件时间的方法见下面),系统时间每隔24小时会慢20分钟左右Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Cl ...
- PHP最全笔记(三)(值得收藏,不时翻看一下)
/* [数组函数] *///统计计算count 计算数组中的单元数目或对象中的属性个数array_count_values 统计数组中所有的值出现的次数array_product ...
- “failed to excute script xxx” PyInstaller 打包python程序为exe文件过程错误
在使用PyInstaller打包python程序,打包命令为: pyinstaller -F -w -i manage.ico yourpyfile.py 顺便说一下几个参数的作用 -F:是直接生成单 ...