博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2752 9.20考试第三题 高速公路(road)题解
阅读量:5890 次
发布时间:2019-06-19

本文共 4721 字,大约阅读时间需要 15 分钟。

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

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 1545  Solved: 593
[][][]

Description

Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站。

Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用。高速路刚建成时所有的路段都是免费的。
政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价。
无聊的小A同学总喜欢研究一些稀奇古怪的问题,他开车在这条高速路上行驶时想到了这样一个问题:对于给定的l,r(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的问题
所有C与Q操作中保证1<=l<r<=N

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  

  考试前一天晚上做梦,梦见自己考试140,倒数第二,一开始以为自己只是日有所思夜有所梦,然后……这道题助我梦想成真/(ㄒoㄒ)/~~然而最终只有20分……
  其实当天已经推出来了式子,然而由于不敢去打,只能打了区间修改单点查询的打法,结果还全E了,好尴尬啊,连暴力的40分都没拿到。
  基本大多数人都可以推到这里——一个边对于答案的贡献(不算分母):设这条边为第i条边,询问为l,r:(i-l+1)*(r-i)*v[i]。
  然后我们大可把这个式子展开为:
      r*(i+1)*v[i]+i*l*v[i]-l*r*v[i]-i*(i+1)*v[i]。
  由于l,r随询问而变,我们无从得知,但由于求得是上述式子的最终值,我们可以去维护上式中的四个单项式,以及他们的系数。
  通过系数我们就可以很轻松的应对区间修改,因为系数是不受任何影响的,而对于每一个修改,对于答案的影响就是修改值乘以系数,这样我们的修改查询都是log n的了。
  最后叮嘱的一点是long long 不然会死的很惨。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #define N 100004 11 #define int long long 12 using namespace std; 13 int n,m; 14 struct no 15 { 16 int left,right,mid; 17 long long lazy; 18 long long data[5]; 19 long long sum[5]; 20 }node[N*4]; 21 long long gcd(long long a,long long b) 22 { 23 if(b==0)return a; 24 return gcd(b,a%b); 25 } 26 void pushup(int x) 27 { 28 for(int i=1;i<=4;i++) 29 { 30 node[x].data[i]=node[x*2].data[i]+node[2*x+1].data[i]; 31 node[x].sum[i]=node[x*2].sum[i]+node[2*x+1].sum[i]; 32 } 33 } 34 void build(int left,int right,int x) 35 { 36 node[x].left=left,node[x].right=right; 37 if(left==right) 38 { 39 node[x].data[1]=left+1; 40 node[x].data[2]=left; 41 node[x].data[3]=1; 42 node[x].data[4]=left*(left+1); 43 return; 44 } 45 int mid=(left+right)>>1; 46 node[x].mid=mid; 47 build(left,mid,2*x); 48 build(mid+1,right,2*x+1); 49 pushup(x); 50 } 51 struct inf 52 { 53 long long a,b; 54 }; 55 char b[50]; 56 void pushdown(int x) 57 { 58 if(node[x].lazy) 59 { 60 node[2*x].lazy+=node[x].lazy; 61 node[x*2+1].lazy+=node[x].lazy; 62 for(int i=1;i<=4;i++) 63 { 64 node[2*x].sum[i]+=node[x].lazy*node[2*x].data[i]; 65 node[2*x+1].sum[i]+=node[x].lazy*node[2*x+1].data[i]; 66 } 67 node[x].lazy=0; 68 } 69 } 70 void add(int left,int right,int x,int z) 71 { 72 if(node[x].left==left&&node[x].right==right) 73 { 74 node[x].lazy+=z; 75 for(int i=1;i<=4;i++) 76 node[x].sum[i]+=node[x].data[i]*z; 77 return; 78 } 79 pushdown(x); 80 int mid=node[x].mid; 81 if(left>mid) 82 add(left,right,x*2+1,z); 83 else if(right<=mid) 84 add(left,right,2*x,z); 85 else 86 add(left,mid,x*2,z),add(mid+1,right,2*x+1,z); 87 pushup(x); 88 } 89 inf get(long long left,long long right,int x,long long l,long long r) 90 { 91 if(node[x].left==left&&node[x].right==right) 92 { 93 inf aa; 94 aa.a=node[x].sum[1]*r-l*r*node[x].sum[3]; 95 aa.a-=node[x].sum[4]; 96 aa.a+=l*node[x].sum[2]; 97 aa.b=(r-l+1)*(r-l)/2; 98 long long t=gcd(aa.a,aa.b); 99 aa.a/=t;100 aa.b/=t;101 return aa;102 }103 pushdown(x);104 int mid=node[x].mid;105 if(left>mid)106 return get(left,right,2*x+1,l,r);107 else if(right<=mid)108 return get(left,right,2*x,l,r);109 else110 {111 inf aa=get(left,mid,2*x,l,r);112 inf bb=get(mid+1,right,2*x+1,l,r);113 if(aa.b==bb.b)114 {115 aa.a+=bb.a;116 long long t=gcd(aa.a,aa.b);117 if(t!=1)118 aa.a/=t,aa.b/=t;119 return aa;120 }121 else122 {123 long long tt=gcd(aa.b,bb.b);124 long long c;125 if(aa.b%tt==0)126 {127 c=aa.b/tt;128 c*=bb.b;129 }130 else if(bb.b%tt==0)131 {132 c=bb.b/tt;133 c*aa.b;134 }135 else136 {137 c=aa.b*bb.b/tt;138 }139 aa.a*=c/aa.b;140 bb.a*=c/bb.b;141 aa.a+=bb.a;142 aa.b=c;143 long long t=gcd(aa.a,aa.b);144 if(t!=1)145 aa.a/=t,aa.b/=t;146 return aa;147 }148 }149 }150 signed main()151 {152 scanf("%lld%lld",&n,&m);153 build(1,n-1,1);154 while(m--)155 {156 scanf("%s",b);157 if(b[0]=='C')158 {159 int l,r,z;160 scanf("%lld%lld%lld",&l,&r,&z);161 add(l,r-1,1,z);162 }163 else164 {165 long long l,r;166 scanf("%lld%lld",&l,&r);167 inf tt=get(l,r-1,1,l,r);168 printf("%lld/%lld\n",tt.a,tt.b);169 }170 }171 return 0;172 }
View Code

转载于:https://www.cnblogs.com/liutianrui/p/7570622.html

你可能感兴趣的文章
PIN Block Formats – The Basics
查看>>
逆向工程,生成pojo、xml、mapper
查看>>
[Web 前端] qs.parse()、qs.stringify()使用方法
查看>>
[Web 前端] CSS 盒子模型,绝对定位和相对定位
查看>>
10.19 科大讯飞笔试小记
查看>>
黑客帝国、乱雨纷飞效果
查看>>
css水平垂直居中
查看>>
Charles设置抓取https请求
查看>>
Python Django 之 静态文件存放设置
查看>>
Android Zxing框架扫描解决扫描框大小,图片压缩问题
查看>>
swift学习之常量和变量
查看>>
面试中变相考算法复杂度
查看>>
Python_Day7_面向对象学习
查看>>
JS URL传值给servlet乱码
查看>>
集群时间同步
查看>>
钱多多第二阶段冲刺04
查看>>
服务器 3
查看>>
VC编译EXE在没装VC的电脑上运行出错问题解决!
查看>>
代码风格
查看>>
欲望永恒饥饿(转自学长)
查看>>