被模拟题狙击了,数组越界为啥不爆 RE 啊啊啊啊
整场白打,这是真导管了
C - Lock All Doors
想了半天是不是被边界情况卡了,鼓捣半天写了一堆等价的东西,屋檐了
记得检查数组大小
D - Long Waiting
可以维护一个小根堆来判断已经进入餐厅的客人离开的顺序,再记一个人数 \(sum\) 表示当前餐厅里的人数用于判断当前队列中的客人是否能进入餐厅,若不能进入餐厅则一直从小根堆中弹队头撵客人
操作过程中用一个变量 \(tim\) 记录时间的变化,一直对当前操作的时间节点取 \(max\) 即可,每次客人满足吃饭条件时,答案就是当前 \(tim\)
点击查看代码
const int N=3e5+5;
int a[N],b[N],c[N];
int n,k,ans[N],sum,tim;
priority_queue<pii,vector<pii>,greater<pii>> q;
void xpigeon(){rd(n,k);for(int i=1;i<=n;i++){rd(a[i],b[i],c[i]);}for(int i=1;i<=n;i++){tim=max(tim,a[i]);while(sum+c[i]>k){pii tmp=q.top();q.pop();tim=max(tim,tmp.fir);sum-=tmp.sec;}ans[i]=tim;q.push({tim+b[i],c[i]});sum+=c[i];}for(int i=1;i<=n;i++){cout<<ans[i]<<'\n';}
}
E - Sum of Subarrays
我几把就应该来开 E 题(
之前做过一些超级树状数组的题,就需要推这种式子。
\[\sum_{l=L_i}^{R_i} \sum_{r=l}^{R_i } \sum_{k=l}^{r} a_k
\]
考虑每个 \(a_i\) 的出现次数是解决这种区间套区间的式子的通用方法(应该是)
就变成了:
\[\sum_{k=L_i}^{R_i} a_k \sum_{l=L_i}^{R_i} \sum_{r=l}^{R_i} [L_i \leq l \leq k \leq r \leq R_i]
\]
其中对于每个 \(k\) 式子中的 \(l\) 的合法取值有 \((k-L_i+1)\) 种,\(r\) 的合法取值有 \((R_i-k+1)\) 种。
所以式子变为:
\[\sum_{k=L_i}^{R_i} a_k (k-L_i+1)(R_i-k+1)
\]
\[=\sum_{k=L_i}^{R_i} -k^2 a_k + k(L_i+R_i)a_k+(R_i-L_i+1-{L_i}{R_i}) a_k
\]
至此,我们可以分别维护\(a_k\) 乘 \(k\) 的 \(0,1,2\) 次项的前缀和来解决本题。
如果带修应该也能做,用个树状数组带个 \(log\) 解决,重要的是推出这样的式子。
F - Loud Cicada
额?