[JZOJ] 5837.Omeed
先摆出来这个式子
\]
先研究\(f\)函数(也就是Combo函数)
显然的有
\]
化简得
\]
再考虑一下期望意义下的式子
\]
然而,这是不对的,第一个样例都过不了
问题出在哪?就在\(P_i\times f(i)\)这里
\(P_i\)意味着第i位必为1,此时的\(f(i)\)应当在(2)式中将\(P_i\)代为1,也就是此时
\]
到这里,第一部分就是一个区间和,第二部分考场上直接写暴力了
现在考虑一下如何快速维护第二个信息
设
\]
和式里面是一个一次函数的形式,自变量是\(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\)
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]\)的答案就是
\]
只维护\(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 w
if(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();
}
}
[JZOJ] 5837.Omeed的更多相关文章
- (jzoj snow的追寻)线段树维护树的直径
jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...
- [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)
Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...
- [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)
Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...
- [jzoj]5478.【NOIP2017提高组正式赛】列队
Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校 ...
- [jzoj]1115.【HNOI2008】GT考试
Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...
- [jzoj]2538.【NOIP2009TG】Hankson 的趣味题
Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...
- [jzoj]4216.【NOIP2015模拟9.12】平方和
Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...
- [jzoj]2938.【NOIP2012模拟8.9】分割田地
Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...
- [jzoj]2505.【NOIP2011模拟7.29】藤原妹红
Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...
随机推荐
- JSP 不同版本(转)
转自 http://blog.csdn.net/sunnyyoona/article/details/51076823
- jquery jtemplates.js模板渲染引擎的详细用法第二篇
jquery jtemplates.js模板渲染引擎的详细用法第二篇 关于jtemplates.js的用法在第一篇中已经讲过了,这里就直接上代码,不同之处是绑定模板的方式,这里讲模板的数据专门写一个t ...
- Codeforces 190C(模拟)
坑点 不记它难解我心头之恨-- WA1:不要读错题Orz,顺序是按它给定的.那就是个类似栈的东西,重点在于输出. 然而我输出很快就模拟对了-- WA2:数据:1 int.我日了不看数据我真的去de模拟 ...
- 熔断降级(Polly)
熔断降级(Polly) https://www.cnblogs.com/qhbm/p/9224307.html 一. 什么是熔断降级 熔断就是"保险丝".当出现某些状况时,切断服务 ...
- NET Core应用中如何记录和查看日志
NET Core应用中如何记录和查看日志 日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日 ...
- 牛客网Java刷题知识点之什么是异常、异常处理的原理是什么、为什么要使用异常、异常体系、运行时异常、普通异常、自定义异常、异常链
不多说,直接上干货! 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失.同样的道理,计算机的世界也是不完美的,异常情况随时都会发 ...
- var type = $('#<%=DropDownListRateType.ClientID %>').val();DropDownListRateType.ClientID是什么意思
<%=DropDownListRateType.ClientID %>这个是C#绑定服务器控件在客户端ID, 比如你的DropDownListRateType你定义一个id,如果你用了模板 ...
- js中Object.defineProperty()和defineProperties()
在介绍js中Object.defineProperty()和defineProperties()之前,我们了解下js中对象两种属性的类型:数据属性和访问器属性. 数据属性 数据属性包含一个数据的位置, ...
- NIO学习之Channel
一.Channel基础 通道是一个对象,通过它可以读取和写入数据,Channel就是通向什么的道路,为数据的流向提供渠道: 在传统IO中,我们要读取一个文件中的内容使用Inputstream,该str ...
- Vue.js之vue-router路由
vue学习的一系列,全部来自于表哥---表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 1概述 vue-r ...