10 2021 档案
摘要:给出一个n,和两个长度为n的数组a和b。 最多交换一次b中的两个位置 最小化$\sum_{i=1}^n|a_i-b_i|$ 做法: 对于原数组,记$x_i=|a_i-b_i|$ 考虑交换$i,j$的$b$值,那么差值为$|a_i-b_j|+|b_i-a_j|-x_i-x_j$ 这个柿子,等价于对平面
阅读全文
摘要:给出一颗带点权的树。 支持两种操作: 1)单点修改点权。 2)输入$u,v$,输出$\sum_{i=1}^n\sum_{j=1}^nf(i,j)$ 如果$i,j$这条路径和$u,v$有交点,\(f(i,j)=w_iw_j\)。 对$i,j$的乘积 做法: 答案相当于权值之和的平方,减去把$(u,v)
阅读全文
摘要:HDU5390 给出一颗有根树。有点权。 两种操作: 1)0 u v,把点u的点权变成v 2)1 u,询问最大的$v_u \oplus v_t$,要满足$t$是$u$到根节点路径上的一个点。 做法: 先考虑没有修改的情况,用可持久化Trie可以很方便的做掉。 现在考虑带有修改的情况: 考虑在dfs序
阅读全文
摘要:维护一个队列,每个人有抵达时间和操作时间。 要求维护以下三种操作: 1)t时刻来一个人,它操作需要d秒。 2)t时刻要来的那个人不来了。 3)如果t时刻去排队,需要等多久才能轮到你。 做法: 巧妙的线段树,以时间为下标建树,每个节点维护两个信息: 1)这个区间内所有来的人的操作时间之和c。 2)完成
阅读全文
摘要:小D有一个数列a。 当一个数对(i,j)满足a[i]*a[j]<=max[a[i],a[i+1],...a[j]]的时候 才被统计。 询问有多少对数对。 做法: 先单调栈处理出每个数作为最大值的区间,为了避免重复计算,这里对左边找第一个>=a[i]的数,对右边找第一个>a[i]的数,这样就可以去重。
阅读全文
摘要:题意: 给出一些水槽。 用一些高度不同的隔板把水槽隔开。 在水槽的不同位置和不同高度,有一些探测器,探测器可能返回有水或没水。 询问是否存在一种放水方案,使得尽可能多的探测器说真话。 放水方案需满足连通器原理。 做法: 从小到大枚举隔板,将隔板两侧的集合合并,对每个集合维护: 1)f[i]:表示这个
阅读全文
摘要:#include<bits/stdc++.h> using namespace std; typedef long long ll; struct Wint:vector<ll> { const static ll BIT=1e8; Wint(ll n=0) { push_back(n); chec
阅读全文