【BZOJ 2752】 [HAOI2012]高速公路(road)

2752: [HAOI2012]高速公路(road)

Time Limit: 20 Sec Memory Limit: 128 MB Submit: 791 Solved: 282 [Submit][Status][Discuss] Description

Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站。 Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用。高速路刚建成时所有的路段都是免费的。 政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价。 无聊的小A同学总喜欢研究一些稀奇古怪的问题,他开车在这条高速路上行驶时想到了这样一个问题:对于给定的l,r,在第l个到第r个收费站里等概率随机取出两个不同的收费站a和b,那么从a行驶到b将期望花费多少费用呢?

Input

第一行2个正整数N,M,表示有N个收费站,,M次调整或询问 接下来M行,每行将出现以下两种形式中的一种 C l r v 表示将第l个收费站到第r个收费站之间的所有道路的通行费全部增加v Q l r 表示对于给定的l,r,要求回答小A的问题

Output

对于每次询问操作回答一行,输出一个既约分数 若答案为整数a,输出a/1

Sample Input

4 5

C 1 4 2

C 1 2 -1

Q 1 2

Q 2 4

Q 1 4

Sample Output

1/1

8/3

17/6

HINT

数据规模

所有C操作中的v的绝对值不超过10000

在任何时刻任意道路的费用均为不超过10000的非负整数

所有测试点的详细情况如下表所示

Test N M

1 =10 =10

2 =100 =100

3 =1000 =1000

4 =10000 =10000

5 =50000 =50000

6 =60000 =60000

7 =70000 =70000

8 =80000 =80000

9 =90000 =90000

10 =100000 =100000

计数问题+线段树

因此我们只要对每个区间都维护即可。

;struct Segtree{int l,r;LL s[4],v;}t[M*5];int n,m;char s[5];LL ans[5];LL Gcd(LL a,LL b){return b==0?a:Gcd(b,a%b);}void Build(int x,int l,int r){t[x].l=l,t[x].r=r,t[x].v=t[x].s[1]=t[x].s[2]=t[x].s[3]=0;if (l==r) return;int m=(l+r)>>1;Build(x<<1,l,m);Build((x<<1)+1,m+1,r);}LL Get(int l,int r){return 1LL*r*(r+1)*(2*r+1)/6LL-1LL*(l-1)*l*(2*l-1)/6LL;}void Update(int x,LL v){int cnt=t[x].r-t[x].l+1;t[x].s[1]+=1LL*cnt*v;t[x].s[2]+=1LL*(t[x].l+t[x].r)*cnt/2LL*v;t[x].s[3]+=1LL*Get(t[x].l,t[x].r)*v;t[x].v+=v;}void Push_up(int x){for (int i=1;i<=3;i++)t[x].s[i]=t[x<<1].s[i]+t[(x<<1)+1].s[i];}void Push_down(int x){Update(x<<1,t[x].v),Update((x<<1)+1,t[x].v);t[x].v=0;}void Add(int x,int l,int r,LL v){if (t[x].l>=l&&t[x].r<=r){Update(x,v);return;}if (t[x].v!=0) Push_down(x);int m=(t[x].l+t[x].r)>>1;if (l<=m) Add(x<<1,l,r,v);if (r>m) Add((x<<1)+1,l,r,v);Push_up(x);}LL Query(int x,int l,int r,int k){if (t[x].l>=l&&t[x].r<=r)return t[x].s[k];LL ans=0;if (t[x].v!=0) Push_down(x);int m=(t[x].l+t[x].r)>>1;if (l<=m) ans+=Query(x<<1,l,r,k);if (r>m) ans+=Query((x<<1)+1,l,r,k);return ans;}int main(){scanf(“%d%d”,&n,&m);Build(1,1,n-1);for (int i=1;i<=m;i++){scanf(“%s”,s);LL l,r,v;scanf(“%lld%lld”,&l,&r);if (s[0]==’C’){scanf(“%lld”,&v);Add(1,(int)l,(int)r-1,v);}else{LL x=(r-l+1)*(r-l)/2LL;for (int i=1;i<=3;i++)ans[i]=Query(1,(int)l,(int)r-1,i);ans[0]=ans[1]*(r-l*r)+ans[2]*(l+r-1)-ans[3];LL g=Gcd(ans[0],x);printf(“%lld/%lld\n”,ans[0]/g,x/g);}}return 0;}

明天又会是新的一天,而我依然年轻。

【BZOJ 2752】 [HAOI2012]高速公路(road)

相关文章:

你感兴趣的文章:

标签云: