先摆出来这个式子
\[ score=A\sum S_i+B\sum S_i\times f(i) \]
先研究\(f\)函数(也就是Combo函数)

显然的有
\[ f(i)=P_i(f(i-1)+1)+t(1-P_i)f(i-1) \]
化简得
\[ f(i)=(P_i+t-tP_i)f(i-1)+P_i \]
再考虑一下期望意义下的式子
\[ score=A\sum P_i+B\sum P_i\times f(i) \]
然而,这是不对的,第一个样例都过不了

问题出在哪?就在\(P_i\times f(i)\)这里

\(P_i\)意味着第i位必为1,此时的\(f(i)\)应当在(2)式中将\(P_i\)代为1,也就是此时
\[ score=A\sum P+B\sum P_i\times(f(i-1)+1) \]
到这里,第一部分就是一个区间和,第二部分考场上直接写暴力了

现在考虑一下如何快速维护第二个信息


\[ cost(i,j)=\sum\limits_{k=i}^jP_k\times (f(k-1)+1)=\sum\limits_{k=i}^jP_kf(k-1)+P_k \]

和式里面是一个一次函数的形式,自变量是\(f(x)\),根据(3)式,\(f(x)\)也是一个一次函数的形式

这就可以用线段树维护了,单点修改很好实现,考虑\(P_i+d\)中\(d\)的贡献即可

对于一个区间\([L,R]\),记录\(k_1,b_1,k_2,b_2\)表示\(f(R)=k_1f(L-1)+b_1,cost(L,R)=k_2f(L-1)+b_2\)

由于它们都是一次函数,所以一定可以这样表出

现在考虑如何合并区间信息,考虑边界情况,对于一个区间\([i,i]\),根据(3)和(6)有

\(k_1=P_i+t-tP_i ,\ b1=P_i,\ k_2=P_i,\ b_2=P_i\)

考虑一个区间\([L,R]\),中点为\(m\)
\[ \begin{align*} f(m)&=k_1f(L-1)+b_1\\ f(R)&=k_1'f(m)+b_1'\\ \therefore f(R)&=k_1k_1'f(L-1)+k_1'b_1+b_2\\ cost(L,m)&=k_2f(L-1)+b_2\\ cost(m+1,R)&=k_2'f(m)+b_2'\\ \therefore cost(L,R)&=(k_2+k_2'k_1)f(L-1)+b_2+b_2'+k_2'b_1 \end{align*} \]
这样就能合并区间了,由于\(f(L-1)=0\),所以答案区间\([L,R]\)的答案就是
\[ score[L,R]=A\sum_{i=L}^RP_i+B\times b_2 \]
只维护\(f\)是不能做的,考场上并没有想到再维护一个\(cost\),参考了杨神犇的博客
线段树真是处理区间可合并信息的利器

#include<algorithm>
#include<iostream>
#include<cstdio>using namespace std;inline char gc(){static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd(){int ret=0,f=1;char c;while(c=gc(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=gc();return ret*f;
}
#define space() putchar(' ')
#define nextline() putchar('\n')
void pot(int x){if(!x)return;pot(x/10);putchar('0'+x%10);}
void out(int x){if(!x)putchar('0');if(x<0)putchar('-'),x=-x;pot(x);}const int MAXN = 500005;
const int MOD = 998244353;int mul(int x,int y){return (1ll*x*y)%MOD;}
void Mul(int &x,int y){x=mul(x,y);}
int sub(int x,int y){return x-y<0?x-y+MOD:x-y;}
int add(int x,int y){if(y>=0)return x+y>MOD?x+y-MOD:x+y;else return sub(x,-y);}
void Add(int &x,int y){x=add(x,y);}inline int qpow(int x,int y){int ret=1;while(y){if(y&1)Mul(ret,x);Mul(x,x);y>>=1;}return ret;
}
inline int inv(int x){return qpow(x,MOD-2);}int n,q,t,dt,ta,tb,A,B;
int p[MAXN];#define ls (cur<<1)
#define rs (cur<<1|1)
#define mid ((l+r)>>1)
struct Node{int k1,k2,b1,b2;Node(int x=1,int y=0,int u=1,int v=0){k1=x;b1=y;k2=u;b2=v;}
}node[MAXN<<2];
inline Node merge(const Node &x,const Node &y){return Node(mul(x.k1,y.k1),add(mul(x.b1,y.k1),y.b1),add(x.k2,mul(y.k2,x.k1)),add(mul(y.k2,x.b1),add(x.b2,y.b2)));
}
void build(int L,int R,int cur,int l,int r){if(l==r){node[cur]=Node(sub(add(p[l],t),mul(t,p[l])),p[l],p[l],p[l]);return;}if(L<=mid)build(L,R,ls,l,mid);if(mid <R)build(L,R,rs,mid+1,r);node[cur]=merge(node[ls],node[rs]);
}
void update(int pos,int cur,int l,int r,int w){//add wif(l==r){Add(node[cur].k1,mul(dt,w));Add(node[cur].b1,w);Add(node[cur].k2,w);Add(node[cur].b2,w);return;}if(pos<=mid) update(pos,ls,l,mid,w);else update(pos,rs,mid+1,r,w);node[cur]=merge(node[ls],node[rs]);
}
Node query(int L,int R,int cur,int l,int r){if(L<=l&&r<=R) return node[cur];if(L<=mid&&(!(mid<R)))return query(L,R,ls,l,mid);if((!(L<=mid))&&(mid<R))return query(L,R,rs,mid+1,r);return merge(query(L,R,ls,l,mid),query(L,R,rs,mid+1,r));
}
struct BIT{int b[MAXN];void update(int x,int w){for(int i=x;i<=n;i+=i&-i)Add(b[i],w);}int query(int x){int ret=0;for(int i=x;i;i-=i&-i)Add(ret,b[i]);return ret;}
}bit;void answer(){int l,r;l=rd();r=rd();int ans=0;Add(ans,mul(A,add(bit.query(r),-bit.query(l-1))));Add(ans,mul(B,query(l,r,1,1,n).b2));out(ans);nextline();
}
void change(){int pos,wa,wb,w;pos=rd();wa=rd();wb=rd();w=mul(wa,inv(wb));bit.update(pos,-p[pos]);bit.update(pos,w);update(pos,1,1,n,-p[pos]);update(pos,1,1,n,w);p[pos]=w;
}
int main(){freopen("omeed.in","r",stdin);freopen("omeed.out","w",stdout);rd();n=rd();q=rd();ta=rd();tb=rd();A=rd();B=rd();t=mul(ta,inv(tb));dt=add(1,-t);int x,y;for(int i=1;i<=n;i++){x=rd();y=rd();p[i]=mul(x,inv(y));bit.update(i,p[i]);}build(1,n,1,1,n);for(int i=1;i<=q;i++){x=rd();if(x==1) answer();else change();}
}

转载于:https://www.cnblogs.com/ghostcai/p/9817260.html

[JZOJ] 5837.Omeed相关推荐

  1. JZOJ 5461 购物 —— 贪心

    题目:https://jzoj.net/senior/#main/show/5461 贪心,原来想了个思路,优先选优惠价最小的 K 个,然后其他按原价排序遍历: 如果当前物品没选过,原价选上,如果选过 ...

  2. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  3. [jzoj NOIP2018模拟 11.01]

    很庆幸打了这场模拟赛,因为这一场爆零 好像上次纪中的某场比赛我也出现了同样的问题,光是计算时间复杂度而忘记了空间的限制.想必是比上次惨的,考场上就写了两题而这两题都因为MLE爆零了.而且我T2还码了7 ...

  4. 【DP】小学生语文题(jzoj 5102)

    正题 jzoj 5102 题目大意 给你两个串A,B,字母个数相等,可以把B的一个字符移到前面某个位置,问你最少移多少次可以使A,B相等 解题思路 设fi,jf_{i,j}fi,j​为A匹配了i-n, ...

  5. 【二分】防具布置/秦腾与教学评估(ybtoj 二分-1-2/jzoj 1253/luogu 4403)

    正题 ybtoj 二分-1-2 jzoj 1253 luogu 4403 题目大意 给出n组数:si,ei,dis_i,e_i,d_isi​,ei​,di​ 对于每组数据,表示在sis_isi​加1, ...

  6. 【归并排序】奶牛的图片(jzoj 1812)

    奶牛的图片 jzoj 1812 题目大意 给你一个序列,你可以交换相邻的两个数 让你用最少的交换次数来使得这个序列变成形如a+1,a+2...n,1,2...a−1,aa+1,a+2...n,1,2. ...

  7. 【归并排序】休息(jzoj 3462)

    休息 jzoj 3462 题目大意 给你一个序列,你每一回合把它划分成尽可能少的单调递减的序列(第一次划分到的序列长度都是偶数),然后把每个序列翻转,问你把它变成单调递增的序列要翻转多少次 输入样例 ...

  8. 秀姿势(jzoj 3464)

    秀姿势 jzoj 3464 题目大意 有n个数,每个数都有一个分组,现在问你最多去掉k个分组后,做多有多少个数是连续的同组的 输入样例 9 1 2 7 3 7 7 3 7 5 7 输出样例 4 样例解 ...

  9. 小麦亩产一千八(jzoj 3461)

    小麦亩产一千八 jzoj 3461 题目大意 给你一个正整数序列:a0,a1,a2a_0,a_1,a_2a0​,a1​,a2​-- a0a_0a0​为1 a1a_1a1​为p ax=ax−1+ax−2 ...

最新文章

  1. Linux守护进程实现
  2. pandas 增加行、列
  3. SAP PM 初级系列22 - IW38可以批量处理维修工单
  4. win10宽带连接断网自动重连
  5. python词频统计结果写入csv_Python词频对比并导入CSV文件
  6. 2021-2025年中国道路平地机行业市场供需与战略研究报告
  7. oracle:case when then else end
  8. python 获取当天凌晨零点的时间戳
  9. python学习之文件处理
  10. Ajax 1.0 中使用web控件调用后台方法的用法.
  11. mysql中表结构语句_mysql中表数据与表结构复制语句
  12. BMFont制作美术字体包教包会
  13. 商务与经济统计学 第五章案例题
  14. 高等代数期末考试题库及答案_高等代数试题及答案
  15. lenovo L480 进入bios_联想笔记本BIOS升级教程
  16. Python基础知识-pycharm版 第3节
  17. 移动端切图内容包括什么_移动ui设计切图规范有哪些要求
  18. 人工智能——机器学习与深度学习思维导图
  19. 代码审计-md5加密相等绕过
  20. 微信小程序换量心得—微量小程序联盟

热门文章

  1. Jquery zTree实例
  2. 孟子曰:道之所在,虽千万人吾往矣!
  3. 端口聚合与Trunk综合配置
  4. 这样出ORACLE的面试题
  5. 数据中心冷冻站模块化建设模式探讨
  6. apply()和call()的区别
  7. 右键菜单添加程序,指定图标, Notepad2、Sublime Text 2
  8. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十九:LCD模块
  9. Android 图片 OOM问题总结
  10. windows7访问03文件服务器慢