摘要: 容易想到如果两个“交叉”的车车的宽度加起来比停车场还宽了那肯定是不合法的 也就是说 一个车子移动过程中只要前面存在一个位置,经过了他,而且和他的和大于w就是不合法的 然后我们从大到小枚举终点位置 这样保证了树状数组里维护的一定是经过了当前点的 阅读全文
posted @ 2018-10-29 17:07 Patrickpwq 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 都快忘了割点怎么搞了 对所有点分两类 1.根节点 2.非根节点 显然根节点是很好做的 只需要数一下有没有两个子树以上 对于非根节点 利用tarjan算法 回忆到dfn的定义:时间戳,即在dfs中第几个被访问到 low:经过最多一条后向边/栈中横叉边能到达的最小的节点时间戳 对于当前节点now来说,把 阅读全文
posted @ 2018-10-29 14:47 Patrickpwq 阅读(119) 评论(0) 推荐(0) 编辑
摘要: (谁告诉我是状压的????) 一行/列最多能放三个炮 30分是让你爆搜的 50分是让你状压的 假设有8列 dp[i][j]表示到第i行且前面列的状态为j (没有/有一个/有两个炮) 然后刷表 100分其实就是在50分的基础上修改了一点 因为发现 并不需要准确的知道之前摆放情况到底是什么样子的 于是d 阅读全文
posted @ 2018-10-29 14:36 Patrickpwq 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 一开始在往平均数那方面想 但是好像是错的 我们这样想 每当加入一个数 如果他与之前构成的是上升的就不管 如果是下降的 那肯定要折中 变成中间值才能最小 即答案就是最大的逆序对差值/2 cpp include define ll long long define N 5000000 using nam 阅读全文
posted @ 2018-10-29 10:42 Patrickpwq 阅读(128) 评论(0) 推荐(0) 编辑
摘要: (谁告诉我这是个分层最短路来着的???) 进入一个城市必须要这个城市所有结界都打破才能进 那我们可以边炸边走 也就是说 我们可以维护d1数组:走到的时间(结界可能没炸完) d2数组:可进入的时间(结界都被炸完了) d数组:真实的到达时间 容易发现d[i]=max(d1[i],d2[2]) 那我们就用 阅读全文
posted @ 2018-10-29 09:54 Patrickpwq 阅读(137) 评论(0) 推荐(0) 编辑