线段树,记录next[i]下一部与当前电影一样的位置,然后枚举区间左端点i,询问线段树最大值后删除i到next[i-1]这段区间的观影值,且增加next[i]到next[next[i]]-1这段区间的观影值。
代码,跑的有点慢
1 #include2 #include 3 using namespace std; 4 const int N = 5001010; 5 const int M = 2000010; 6 int pos[M],a[M],b[M]; 7 int n,m,i,next[M]; 8 long long ans,s[N],v[N]; 9 void clean(int x)10 {11 if (v[x])12 {13 s[x]+=v[x];14 v[2*x]+=v[x];15 v[2*x+1]+=v[x];16 v[x]=0;17 }18 }19 void change(int x,int l,int r,int a,int b,int c)20 {21 clean(x);22 if ((a<=l)&&(r<=b))23 {24 v[x]+=c;25 return;26 }27 int m=(l+r)>>1;28 if (a