0%

思路讲解

像这种题目,一般要把一对有关系的留到最后,这样子状态就唯一了。

image

1
2
3
|----A----|     |--D--|
|-------B------|
|-----C----|

可以先枚举A的边界,然后再把C填好,B,D之间因为有位置关系,所以状态唯一。

1
2
3
4
5
6
7
8
9
// 显然是要枚举水果的边界
ll ans=0;
FOR(i,a,a+b){
// 在i-1个空位中选a-1个空位(因为第i个位置已经钦定了A(苹果))
ll res=comb.C(i-1,a-1);
res*=comb.C(N-i,c);
res%=mod;
ans+=res;
}

AC代码

https://atcoder.jp/contests/abc405/submissions/66027443

心路历程(WA,TLE,MLE……)

思路讲解

【Codeforces Round 1024 (Div. 2) 题目讲解 ABCDE (CF2102)】 【精准空降到 16:30】 https://www.bilibili.com/video/BV1CFELzVExf/?p=5&share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37&t=990

这场的E题,用到了一个技巧,就是2,2,3,4 → 1,2,3,4 这如何利用set就能做到(维护一个序列,要求 aiia_i≥ i ,然后给你一堆数,要求你能够最长化这个序列)?其实可以换个思路,初始的 set 里有 1,2,3,4,5 然后删。

具体见CF-1024-E. 23 Kingdom

CF-1028-D. Gellyfish and Camellia Japonica(直接构造等于难,构造最小的大于等于)

https://www.luogu.com.cn/article/rae0b6wl

总结的话,主要的启发就是把 构造使得与目标相等 转换成 最小的构造使得大于等于目标

介绍

消除后效性,狭义上指的是dp,但广义上来说,贪心做法等也有时需要考虑后效性问题。

总体而言,只要你是想要把一个问题拆开来分析求解,那么合起来的时候,就要考虑后效性了。

案例分析

CF-1024-D. Quartet Swapping(四重交换) 这个是解决了交换数量要保持相同,但是最优情况可能无法保持相同,如何找到次优情况呢?或者说什么发现该情况只适用于次优情况呢?涉及冒泡排序以及逆序对。

2025金马高校联赛-B战术单元协同训练 利用链表来消除后效性

Edu-179-E. Changing the String 在线处理比较难,需要考虑对后续操作的影响,可以采用离线方法处理,因为下标小的。

思路讲解

不难注意到,你所选择的区间之中,不允许出现两个区间相离的情况。

image

因为这两个区间如果变为相交的话,贡献的答案值一定更大。

由这个结论,那么新加入的区间的 右端点>以前的所有左端点右端点>以前的所有左端点,并且 左端点<以前的所有右端点左端点<以前的所有右端点,因此,所有的左右端点就会分居两端,因为起始的 右端点>左端点右端点>左端点,新加入的 右端点>以前的所有左端点右端点>以前的所有左端点,左端点反之亦然。

image

那么贪心地,我们其实就是想让 il\sum{i_l} 最小, ir\sum{i_r} 最大,那么左端点只要贪心地选择下标小的,右端点我们只要贪心地选择下标大的。

最后一个问题,就是当我们拿到一个序列,如 22342,2,3,4,我们如何知道他是否可以映射到12341,2,3,4 只通过减法。

那么这个其实有一个小的 trick,如果说用加入元素的方法判断,大抵是要用到树状数组或者线段树,但如果使用删除的方法,就可以只用 set 实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set<ll> st;
auto init=[&](){ // 初始化函数
st.clear();
FOR(i,0,N+1){
st.insert(i);
}
};
auto proc=[&](ll x){ // 处理函数
auto it=st.upper_bound(x);
--it;
if(*it==0){
return false;
}else{
st.erase(it);
return true;
}
};

AC代码

https://codeforces.com/contest/2101/submission/319792559

心路历程(WA,TLE,MLE……)

其实我们的要求是没有任意两个区间相离,这个用线段树判断是有点问题的。

一个比较好的近似解

1
2
3
4
5
6
hack:
1
10
1 1 2 2 3 3 4 4 5 5
ans:
18

https://codeforces.com/contest/2101/submission/319732582