Atcoder abc287
https://atcoder.jp/contests/abc287/tasks
G - Balance Update Query
n种卡,每种无限多,初始每种 单价ai,最多取bi张
q个询问,每次三种可能操作
修改一个的上限bi
修改一个的单价ai
问 恰好取x张的最大价值
范围
n,q 2e5
ai [0,1e9]
bi [0,1e4]
2s
1024mb
我的想法
如果固定,贪心从单价大到小的去取
对单价排序 做根号分治
让每个块的个数 保持在sqrt(n)个
这样每次修改操作就是 最多改变 sqrt(n)个块, 每个块内部就是 log(sqrt(n)) 的操作次数 时间复杂度 O(q sqrt(n) log(sqrt(n)))
而查询, 因为可以做块的个数和与代价和记录, 所以 暴力找在哪个块,再在块里暴力搜,O(q (sqrt(n)+log(sqrt(n))))
2s 还是会tle的
200000*math.sqrt(200000)*math.log(math.sqrt(200000))/math.log(2) = 91203683.14743526
它的确也tle了
https://atcoder.jp/contests/abc287/submissions/38429726
21AC + 19TLE
题解
离线 一下,其实知道所有会出现的 ai,bi
直接把价格ai 离散化掉, 就是个无脑 线段树上二分了
代码
segtree(2396Byte,256ms,31112KB)
https://atcoder.jp/contests/abc287/submissions/38669755
1 |
|
Fenwick(2198 Byte, 214ms, 25816KB)
https://atcoder.jp/contests/abc287/submissions/38686072
1 |
|
Ex - Directed Graph and Query
n点,m边 有向图
path 的cost 定义,最大index的点的index
Q个询问, 每次询问si -> ti 最小cost的path的cost,或报告不存在
范围
n 2000
m <= n(n-1)
q 1e4
4.5s
1024mb
我的思路
n不太大,q也很小
直接暴力 枚举源? 似乎是O(n m) => O(n^3)
既然是最小的
那么考虑点的id从小到大
所以直接维护每个点可达的点的集合 和 来源点的集合
如果没有环的话,两两之间最多一次
有环的话,(a,b,c) -> (a,d,e) ?
因为两两之间 其实也就是N^2,
问题就是如何得到两两之间的答案
题解
Floyd-Warshall 暴力+bitset
O(N^3+NQ)
bitset可以加速 1/64
Floyd-Warshall
例如 1->2->3->1
在处理3之前, 3能到[1,2], 但是2不能到1, 虽然 2能到3, 但是從統計上, 每次新增的是 max(首,尾,i), 所以有 只能经过更大的到达的如果有连接 也是初始连接,不会有中间的连接
到3的时候 所有的也只是
1 | rep(i,1,n+1){ |
代码
https://atcoder.jp/contests/abc287/submissions/38673314
1 |
|
总结
现场打的,卡了前面的题,
G
想了半天分块, 但似乎是 n sqrt(n) log(n) 差亿点能过的那种
实际上就是离线掉,然后无脑线段树了
Ex
bitset不熟 + Floyd-Warshall 不熟
以及我还以为有什么能做到N^2的科技