先找出基环。
好久没来了。除个草吧。
m(m<=300,000)个操作。操作分2种:
1.A p,表示把编号最小的空着的长度为p的区间图上颜色。
2.L a b,表示把从a到b的区间(包括端点)全部擦干净(没颜色还是没颜色)。
Q:有多少个操作1不能实现?
题意:修改区间内的数、询问区间内任意子段和的期望值。
然后我们尝试把每次的答案求出来。然后对这个式子乱搞。发现对于每个数a[i],维护a[i],i*a[i],i*i*a[i]就好了、
那么线段树维护就行了。好了没了。(其实是我懒得写题解了、、、
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r>>1)
#define lson l,mid,ls
#define rson mid+1,r,rs
#define root 1,n,1
typedef long long ll;
const int maxn=500005;
ll a[maxn]={0},b[maxn]={0},c[maxn]={0},add[maxn]={0};
char buf[5000000],*pt=buf,buf2[5000000],*o=buf2;
inline ll getint(){
ll r=0,f=1; while((*pt!='-')&&(*pt<'0'||*pt>'9'))pt++; if(*pt=='-')f=-1, pt++;
while(*pt>='0'&&*pt<='9')r=r*10+*pt++-48; return r*f;
}inline char getop(){
while(*pt!='C'&&*pt!='Q')pt++; return *pt;
}inline void print(ll x){
char str[30],*p=str; if(!x)*o++=48;
else{ while(x) *p++=x%10+48,x/=10; while(p--!=str)*o++=*p;}
}inline void pushup(ll rt){
a[rt]=a[ls]+a[rs], b[rt]=b[ls]+b[rs], c[rt]=c[ls]+c[rs];
}inline void pushdown(ll l,ll r,ll rt){
ll lc=mid-l+1, rc=r-mid, rr=mid, ll=mid+1;
if(add[rt]){
add[ls]+=add[rt];
a[ls]+=lc*add[rt];
b[ls]+=(l+rr)*lc*add[rt]>>1;
c[ls]+=(rr*(rr+1)*(rr<<1|1)-(l-1)*l*(l-1<<1|1))/6*add[rt];
add[rs]+=add[rt];
a[rs]+=rc*add[rt];
b[rs]+=(ll+r)*rc*add[rt]>>1;
c[rs]+=(r*(r+1)*(r<<1|1)-(ll-1)*ll*(ll-1<<1|1))/6*add[rt];
add[rt]=0;
}
}void update(ll L,ll R,ll d,ll l,ll r,ll rt){
if(L<=l&&r<=R){
add[rt]+=d;
a[rt]+=(r-l+1)*d;
b[rt]+=(l+r)*(r-l+1)*d>>1;
c[rt]+=(r*(r+1)*(r<<1|1)-(l-1)*l*(l-1<<1|1))/6*d;
return;
}pushdown(l,r,rt);
if(L<=mid) update(L,R,d,lson);
if(mid<R) update(L,R,d,rson);
pushup(rt);
}void query(ll L,ll R,ll&A,ll&B,ll&C,ll l,ll r,ll rt){
if(L<=l && r<=R){
A=a[rt],B=b[rt],C=c[rt]; return;
}pushdown(l,r,rt);
ll SA=0,SB=0,SC=0,TA,TB,TC;
if(L<=mid) query(L,R,TA,TB,TC,lson), SA+=TA, SB+=TB, SC+=TC;
if(mid<R) query(L,R,TA,TB,TC,rson), SA+=TA, SB+=TB, SC+=TC;
A=SA,B=SB,C=SC;
}inline ll gcd(ll a,ll b){
return (!b)?a:gcd(b,a%b);
}int main(){
fread(pt,1,5000000,stdin); ll n,q,u,v,w,TA,TB,TC,A,B,C;
for(n=getint(),q=getint();q;q--){
if(getop()=='C'){
u=getint(),v=getint(),w=getint();
update(u,v-1,w,root);
}else{
u=getint(),v=getint();
query(u,v-1,TA,TB,TC,root);
A=(u+v-1)*TB+TA*(v-v*u)-TC;
B=(v-u+1)*(v-u)>>1;
C=gcd(A,B);
print(A/C);*o++='/';print(B/C);*o++='\n';
}
}fwrite(buf2,1,o-buf2,stdout);return 0;
}