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
*/

最新文章

  1. Python isinstance() type()
  2. CE 文件读写操作
  3. 再谈LRU双链表内存管理
  4. 关于DCMTK3.6.0源代码编译的总结
  5. CentOS6 PXE+Kickstart无人值守安装
  6. [C++11] Effective Modern C++ 读书笔记
  7. highCharts图表入门实例
  8. wifi mode: AP,Client,Ad-hoc,802.11s,Pseudo Ad-hoc(ahdemo),Monitor,AP(WDS),Client(WDS)
  9. Bzoj 3450: Tyvj1952 Easy 期望/概率,动态规划
  10. C语言基础学习基本数据类型-int类型与int变量
  11. LWIP_STM32_ENC28J60_NETCONN_TCP_SERVICER(5)
  12. [转]CAS原理
  13. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符
  14. [js]javascript索引
  15. 多管齐下显神威-2017逐浪CMS开启全新建站与WEB技术革命
  16. Java第1章笔记
  17. 用Java位运算实现加减乘除四则运算
  18. Google Guava中的前置条件
  19. python中mock的使用
  20. Socket编程理论

热门文章

  1. JDK自带jvisualvm监控工具
  2. C#:CeF遇到的问题
  3. Jenkins Post Build网址
  4. java实现栈-使用LinkedList
  5. CEO退休
  6. Go指南_切片的长度与容量
  7. Java如何清除空格?
  8. Oracle 11g EM删除重建的方法
  9. 最全面的 Webview 详解
  10. 【QT】第一个QT程序(点击按钮,显示特定文本)