题意:玩一个共有n级的游戏,i级出发每次可以花a[i]的代价,有p[i]的几率变成i+1级,有1-p[i]的几率变成x[i]级,x[i]<=i
多次询问,每次询问从l级升到r级的期望总代价
n,q<=5e5,0<=a[i]<=1e9
思路:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef pair<int,int> PII; 7 typedef pair<ll,ll> Pll; 8 typedef vector<int> VI; 9 typedef vector<PII> VII; 10 #define N 1100000 11 #define M 4100000 12 #define fi first 13 #define se second 14 #define MP make_pair 15 #define pi acos(-1) 16 #define mem(a,b) memset(a,b,sizeof(a)) 17 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++) 18 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--) 19 #define lowbit(x) x&(-x) 20 #define Rand (rand()*(1<<16)+rand()) 21 #define id(x) ((x)<=B?(x):m-n/(x)+1) 22 #define ls p<<1 23 #define rs p<<1|1 24 25 const ll MOD=1e9+7,inv2=(MOD+1)/2; 26 double eps=1e-6; 27 int INF=1e9; 28 29 ll s[N]; 30 31 ll read() 32 { 33 ll v=0,f=1; 34 char c=getchar(); 35 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 36 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 37 return v*f; 38 } 39 40 ll pw(ll x,ll y) 41 { 42 ll t=1; 43 while(y) 44 { 45 if(y&1) t=t*x%MOD; 46 x=x*x%MOD; 47 y>>=1; 48 } 49 return t; 50 } 51 52 int main() 53 { 54 //freopen("1.in","r",stdin); 55 int cas; 56 scanf("%d",&cas); 57 while(cas--) 58 { 59 int n,q; 60 scanf("%d%d",&n,&q); 61 rep(i,0,n) s[i]=0; 62 rep(i,1,n) 63 { 64 ll ri=read(),si=read(),xi=read(),ai=read(); 65 ll fi=(si*ai%MOD+(si-ri+MOD)*(s[i-1]-s[xi-1]+MOD)%MOD)%MOD*pw(ri,MOD-2)%MOD; 66 //printf("i=%d fi=%I64d\n",i,fi); 67 s[i]=(s[i-1]+fi)%MOD; 68 } 69 rep(i,1,q) 70 { 71 int l,r; 72 scanf("%d%d",&l,&r); 73 //printf("l=%d r=%d\n",l,r); 74 printf("%I64d\n",(s[r-1]-s[l-1]+MOD)%MOD); 75 } 76 } 77 78 return 0; 79 }