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模板

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<queue>
  7. #include<map>
  8. #include<string>
  9. #include<bitset>
  10.  
  11. #define re register
  12. #define rep(i,s,t) for(re int i=s;i<=t;++i)
  13. #define per(i,s,t) for(re int i=s;i>=t;--i)
  14. #define mmm(f,x) memset(f,x,sizeof f)
  15. //#define x first
  16. //#define xx second
  17. using namespace std;
  18.  
  19. typedef long long ll;
  20.  
  21. const ll mod = ;
  22. template<typename T>inline void add_(T &A, int B, ll MOD = mod) { A += B; (A >= MOD) && (A -= MOD); }
  23. template<typename T>inline void mul_(T &A, ll B, ll MOD = mod) { A = (A*B) % MOD; }
  24. template<typename T>inline void mod_(T &A, ll MOD = mod) { A %= MOD; A += MOD; A %= MOD; }
  25. const int maxn = 3e5 + ;
  26. int a[maxn];
  27. int n, m;
  28. int tot,Q;
  29. ll L[maxn], R[maxn],W[maxn],num2[maxn];
  30. ll inv[maxn], fac[maxn];
  31. ll c[maxn];
  32. long long kpow(long long a, long long n) {
  33. long long res = ;
  34. while (n > ) {
  35. if (n & )res = res * a%mod;
  36. a = a * a%mod;
  37. n >>= ;
  38. }
  39. return res;
  40. }
  41. void init() {
  42. fac[] = fac[] = ;
  43. inv[] = ;
  44. rep(i, , maxn) {
  45. fac[i] = fac[i - ] * (ll)i % mod;
  46. inv[i] = kpow(fac[i], mod - );
  47. }
  48. }
  49. ll C(int n, int m) {
  50. if (n < m) return 0ll;
  51. if (m == || n == m) return 1ll;
  52. if (n - == m || m == ) return n;
  53. return fac[n] * inv[m] % mod * inv[n - m] % mod;
  54. }
  55. ll Csum(ll l, ll r, ll v, ll q) {
  56. if (l>r)return ;
  57. ll n = r - l + ;
  58. ll ans = v;
  59. mul_(ans,C(q + n - , q));
  60. mod_(ans);
  61. return ans;
  62. }
  63. ll query(int x) {
  64. ll ret = ;
  65. rep(i, , tot) {
  66. int q = Q - num2[i] + ;
  67. if (L[i] > x)continue;
  68. if (R[i] <= x) {
  69. add_(ret, Csum(L[i], x, W[i], q));
  70. add_(ret, Csum(R[i] + , x, -W[i], q));
  71. mod_(ret);
  72. }
  73. else add_(ret, Csum(L[i], x, W[i], q));
  74. }
  75. return ret;
  76. }
  77. int main() {
  78. init();
  79. int t;
  80. cin >> t;
  81. while (t--) {
  82. tot = ,Q=;
  83. cin >> n >> m;
  84. rep(i, , m) {
  85. int op;
  86. scanf("%d", &op);
  87. if (op == ) {
  88. Q++;
  89. }
  90. else {
  91. ll l, r;
  92. scanf("%lld%lld", &l, &r);
  93.  
  94. if (op == ) {
  95. ll w;
  96. scanf("%lld", &w);
  97. L[++tot] = l, R[tot] = r; W[tot] = w;
  98. num2[tot] = Q;
  99. }
  100. else { cout<< (query(r) - query(l - ) + mod) % mod << endl; }
  101. }
  102. }
  103. }
  104. }
  105. /*
  106. 1
  107. 100000 7
  108. 1 1 3 1
  109. 2
  110. 3 2333 6666
  111. 2
  112. 3 2333 6666
  113. 2
  114. 3 2333 6666
  115. */

牛客多校10 D Rikka with Prefix Sum 不是数据结构的更多相关文章

  1. 牛客多校第十场 A Rikka with Lowbit 线段树

    链接:https://www.nowcoder.com/acm/contest/148/A来源:牛客网 题目描述 Today, Rikka is going to learn how to use B ...

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

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

  3. 2020牛客多校第八场K题

    __int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...

  4. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  5. 牛客多校第一场 B Inergratiion

    牛客多校第一场 B Inergratiion 传送门:https://ac.nowcoder.com/acm/contest/881/B 题意: 给你一个 [求值为多少 题解: 根据线代的知识 我们可 ...

  6. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  7. 牛客多校第三场 F Planting Trees

    牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...

  8. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  9. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

随机推荐

  1. Django TemplateDoesNotExist

    在联系Django的时候,启动正常,我在浏览器上输入URL地址后报错 TemplateDoesNotExist at /test/ 解决方案 默认这里是空的,这里我们填上我们静态文件的地址

  2. Ansible 使用普通用户远程执行playbook

    设置ansible使用普通用户jsxge远程连接执行playbook 1. ansible控制端创建普通用户jsxgecd /homeuseradd jsxgechown -R jsxge.wheel ...

  3. php手册总结《类》

    手册页面: http://php.net/manual/zh/language.oop5.basic.php >> 类名 类名可以是任何非 PHP 保留字的合法标签.一个合法类名以字母或下 ...

  4. [k8s]k8s配置nfs做后端存储&配置多nginx共享存储&&statefulset配置

    所有节点安装nfs yum install nfs-utils rpcbind -y mkdir -p /ifs/kubernetes echo "/ifs/kubernetes 192.1 ...

  5. 【C语言】两个指针(地址)相减

    两个指针相减,为两个指针之间间隔这两个指针类型的数目. 如:int *p,*q; p-q=(p地址-q地址)/sizeof(int) #include <stdio.h> int main ...

  6. 01——Introduction to Android介绍

    Introduction to Android Android provides a rich application framework that allows you to build innov ...

  7. 【XMPP】基于XMPP的即时通讯解决方案

    什么是XMPP 介绍XMPP之前,先来看看GTalk. GTalk是Google推出的IM(Instant Messaging,即时通讯)软件,类似于QQ和MSN. 从技术角度来说,GTalk与QQ和 ...

  8. django DateTimeField 时间格式化

    ['%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' '%Y-%m-%d %H:%M', # '2006-10-25 14:30' '%Y-%m-%d', # ' ...

  9. CLOS架构是啥?

    有多少种技术能够在六十五年后依旧能够熠熠生辉,在IT的基础架构中扮演着重要角色?CLOS架构应该算是一项.Clos架构,诞生于1952年,是由由贝尔实验室一位叫Charles Clos的人提出的.CL ...

  10. Python3数字(Number)

    一.数学函数 二.随机数函数 三.三角函数 四.数学常量