ABC 423先慢慢改吧题解

被模拟题狙击了,数组越界为啥不爆 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

没看懂题解,下次找高人

posted @ 2025-09-15 10:15  香香的鸽子  阅读(40)  评论(0)    收藏  举报