总结(a.k.a. CSP-S 2024 游寄) Day(-n) 星期六 上午因为迟到被班主任罚,扫地扫了一个早读,又耽误了一个小时,导致上午比赛130.(Max.200) 事实证明,心态很搞人心态,美丽的心情有助于思考? 那场比赛多事大暴力+数学,事实证明我可能在这方面确实不足。 那既然说到不足了,那就列一下罢 动态规划多练题。DP式子是靠经验列出来的。保爷曾经说过: 你DP做得多了,一看到题就自然就能想出来状态了。状态能列出来就已经成功了百分之六七十了。 数学题白瞎,这个可能没什么东西,背板子就是了。我在博客里有写exgcd求逆元,组合数等等。 ...
结论:可能要带压缩 先说下我的思路 考场上没看出来规律,对着题嗯造。首先考虑我们需要对于每一个数,找到一个数严格次大于之,然后让这两个数干一架,可以证明尝试这样配队N次后得到的一定是配队最大的数量。 那考虑我们如何找到这个严格次大于这个数的数呢?用链表+块。先对数组排序,再把每一个数字相同的区间的起始点,末尾,它的下一项记录下来。这样对于每一个块,我们就都可以知道它的下一个块是什么,如果下一个块中有数可以取(起始点<终止点),那就取,起始点++。 考场上这个做法过了四个样例,就没再管了 但是,难受的来了 ccf给的第四个样例中,重复的元素相当之多,导致要分的块数非常之少,也就导致了...
线段树 线段树1(区间+区间和) #include #include #define maxn 4000010 using namespace std; long long w[maxn],tag[maxn],a[maxn]; void pushup(long long u){ w[u]=w[u2+1]+w[u2]; } void mktag(long long u,long long len,long long x){ tag[u]+=x; w[u]+=len*x; } void pushdown(long long ...
以下内容皆todo 快速幂 //过于简单,todo 筛法 埃式筛 vector prime; bool is_prime[N]; void Eratosthenes(int n) { is_prime[0] = is_prime[1] = false; for (int i = 2; i <= n; ++i) is_prime[i] = true; // i * i <= n 说明 i <= sqrt(n) for (int i = 2; i * i <= n; ++i) { if (is_prime[i]) f...
链式前向* #define maxn 100000 int cnt,head[maxn],nxt[maxn],to[maxn],w[maxn]; void add_edge(int u,int v,int W){ nxt[++cnt]=head[u]; head[u]=cnt; to[cnt]=v; w[cnt]=W; } 邻接矩阵 vector edge[maxn]; void add_edge(int u,int v,int w){ edge[u].append(make_pair(v,w)); } to...