摘要: 贪心策略:每加入一个数,如果之前已经存在它了,就直接交换 因此我们需要维护距离 就用树状数组好了 注意是2n cpp include define N 100005 using namespace std; int n,tree[N],pre[N],ans; inline int lowbit(in 阅读全文
posted @ 2018-10-25 22:15 Patrickpwq 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 对于这类棋盘问题 要关注的是这一行与前一行的关系 设dp[i][j][state]表示前i行,已经放了j个国王,状态为state的方案数 然后枚举i,枚举j,再枚举state,再枚举上一行last 先判断state,last各自是否合法,再判断他们俩合起来会不会冲突 最后答案就是最后一行所有状态的方 阅读全文
posted @ 2018-10-25 21:26 Patrickpwq 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 显然是不能直接开两个树状数组维护 前缀和,前缀和的前缀和。因为一旦对a[i]进行修改,将会影响许多位前缀和的前缀和 我们考虑对式子变一下形 Qi =S1+S2+S3+...+Si =a1+a1+a2+a1+a2+a3+...+ai =a1 i+a2 (i 1)+a3 (i 2)+...+ai =(a 阅读全文
posted @ 2018-10-25 15:57 Patrickpwq 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 据说这个叫分层图最短路 是个常见套路 一般就是:有k次机会可以直接通过一条边,问起点与终点之间的最短路径 我的理解:就相当给dis和inque数组加了一维表示用了j次免费机会 然后在松弛的时候就有两种决策:1.走免费边 2.走要钱的边 8102年了 别写spfa了 cpp include defin 阅读全文
posted @ 2018-10-25 14:45 Patrickpwq 阅读(87) 评论(0) 推荐(0) 编辑
摘要: 好神奇的一道题 我们发现给白边加上权值后 跑MST后 选到的白边就越少 然后就二分这个加上的权值 不过边界好像有点恶心?不过没关系 思想最重要 cpp include define N 50005 define M 100005 using namespace std; struct Edge { 阅读全文
posted @ 2018-10-25 11:26 Patrickpwq 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 好题 一开始想状压 但是转移根本无从下手 设f[i][j]表示i~j天的最低成本 可以想到从第i天到第j天要么不换方案,要么从第k天换一种方案,类似于floyd求最短路 就是 f[i][j]=min(f[i][j],f[i][p]+f[p+1][j]+k) 这是个区间dp 然后我们发现 对于题目中有 阅读全文
posted @ 2018-10-25 09:39 Patrickpwq 阅读(85) 评论(0) 推荐(0) 编辑
摘要: 显然最近的两个部落的距离是有单调性的 因此可以二分 考虑check 我们遍历所有点 先把 define N 1005 define eps 1e 6 using namespace std; template inline void read(T &x) { x=0; static char ch= 阅读全文
posted @ 2018-10-25 08:12 Patrickpwq 阅读(196) 评论(0) 推荐(1) 编辑