07 2019 档案

摘要:笛卡尔树 O(n)建立一颗该节点是当前子树的最值的二叉树. 代码: void Build(){ int n; scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]), L[i] = R[i] = 0; top = 0; for( 阅读全文
posted @ 2019-07-28 20:39 Schenker 阅读(173) 评论(0) 推荐(0)
摘要:happiness 题解: 将图转换成最小割. 将割完的图中与S相连的点看做选文科, 与T相连的点看做选理科. flow(s, u) = 文科值 flow(u,t) = 理科值 假设u 和 v 一起选文科有奖励值z, flow(s,u) = z/2 flow(s,v) = z/2, flow(u,v 阅读全文
posted @ 2019-07-27 10:14 Schenker 阅读(182) 评论(0) 推荐(0)
摘要:#include<bits/stdc++.h> using namespace std; const int N = 110010; char str[N], aim[N<<1]; int n; int len[N*2]; void manacher() { memset(len, 0, sizeo 阅读全文
posted @ 2019-07-15 19:51 Schenker 阅读(178) 评论(0) 推荐(0)
摘要:Bzoj 3730 震波 题解: 和在线的边分治差不多。 就是将每层都信息都存下来。 然后对于每一层记录上一层的重心是哪个。 对于求和的话, 从自己的那层出发,然后暴力往上爬, 然后计算答案。 对于修改来说,也暴力的往上爬,对于每层所对应的信息来修改 用树状数组来统计同一层、不同深度的前缀和。 本来 阅读全文
posted @ 2019-07-10 16:36 Schenker 阅读(241) 评论(0) 推荐(0)
摘要:How Many Answers Are Wrong 题解: emm。 先说一点,这个题目是多组的, 但是我没在题目中看到多组的信息。 然后并查集+前缀和的一个思想。 定义: f(x) = pre[x], S[i] = S[i-1] + a[i] 则 sum[x] = S[x] - S[f(x)]。 阅读全文
posted @ 2019-07-08 10:01 Schenker 阅读(221) 评论(0) 推荐(0)
摘要:P1525 关押罪犯 题解: 一拿到题目想到的是二分 + 奇奇怪怪的操作。 后来学到了并查集裸写就好了。 先将边权按大到小排序一边。 然后访问到一个边的时候。 先看一下这2个边有没有联通, 如果有联通就是说明在同一个块内, 输出这条边的权值作为答案。 否则 互相连到对方的敌人哪里。 代码: #inc 阅读全文
posted @ 2019-07-07 19:50 Schenker 阅读(146) 评论(0) 推荐(0)
摘要:1. 修改set里面的非键值。 用mutable来修饰这个非键值。 举例代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w 阅读全文
posted @ 2019-07-07 09:35 Schenker 阅读(244) 评论(0) 推荐(0)
摘要:1. 旋转treap。 思想:一颗权值BST + 一颗 随机数 最小堆。 BZOJ - 3224 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen( 阅读全文
posted @ 2019-07-06 13:17 Schenker 阅读(222) 评论(0) 推荐(0)
摘要:1.求最小值的情况。 将关系都化成 a[ i ] - a[ j ] >= k 然后 j 向 i 建立一个价值k的有向边。 然后跑一个最长路。 例如:POJ-1201 #include<iostream> #include<cstring> #include<queue> #include<vecto 阅读全文
posted @ 2019-07-04 15:31 Schenker 阅读(166) 评论(0) 推荐(0)
摘要:Give out candies 题解: 第一次遇见这样处理的网络流模型。 将问题转换成最小割问题。 具体的题解参考自:传送门 先将每个人的拆成m个人。 然后s向第1人连边流量为inf。第i个人向第i+1个人连边,流量为 3000 - w。 将t视为每组的第m+1个人。 接来下是约束关系的建边, x 阅读全文
posted @ 2019-07-04 10:11 Schenker 阅读(169) 评论(0) 推荐(0)
摘要:Chicken or Fish? 题意比较难理解。 需要注意的是 就算某个人抱怨了 但是的t[i]也是他最后选择的结果。 题解: 首先考虑没有r[i] = 1的情况。 直接记录t[i]=0的数目,最后输出的时候比较a[i]和跳过的人的大小。 其次如果存在r[i]=1的情况, 则说明在前面就有一个菜品 阅读全文
posted @ 2019-07-03 16:07 Schenker 阅读(169) 评论(0) 推荐(0)
摘要:Sagheer and Apple Tree 题解: 先分析一下, 如果只看叶子层的话。 那么就相当于 经典的石子问题 nim 博弈了。 那我们看非叶子层。 看叶子层的父亲层。 我们可以发现, 如果从这一层移动x个苹果到叶子,那么另一个人就可以吃掉这x个苹果。 不影响任何的前后手。 然后我们再分析, 阅读全文
posted @ 2019-07-03 14:01 Schenker 阅读(188) 评论(0) 推荐(0)
摘要:Salazar Slytherin's Locket 题解: 数位DP。 对于不同的进制直接数位DP就好了。 在数位dp中比较基础。 通过状压来xor值,使得表示每个数字出现奇数次/偶数次. 注意的就是 去除 00 0000 这些数的影响。 代码: #include<bits/stdc++.h> u 阅读全文
posted @ 2019-07-03 09:36 Schenker 阅读(233) 评论(0) 推荐(0)
摘要:World Eater Brothers 题解: 树DP, 枚举每2个点作为国家。 然后计算出最小的答案。 首先我们枚举根, 枚举根了之后, 我们算出每个点的子树内部和谐之后的值是多少。 这样val[root]就是这个root为根的花费。 然后我们再fdfs一遍这棵树。 假如我们枚举u这个点是另一个 阅读全文
posted @ 2019-07-02 10:04 Schenker 阅读(220) 评论(0) 推荐(0)
摘要:题解: 先按时间轴将一个点拆成100个点。 第一个点相当于第一秒, 第二个点相当于第二秒。 在这些点之间连边, 每1流量的费用为c。 再将图上的边也拆开。 将 u_i 向 v_i+1 建边。 将 v_i 向 u_i+1 建边。 在上面的建边过程中: 假设最多一条路只会走20个人。 将这个东西拆成20 阅读全文
posted @ 2019-07-01 14:10 Schenker 阅读(466) 评论(0) 推荐(1)
摘要:Swapping Characters 题解: 先算出其他串和第一个串的字母个数是否相同。 再算出其他串和第一个串不同的字母位置个数。 然后枚举第一个串交换的位置。 计算交换之后的不同字母的位置个数。 如果个数为0,则至少有2个相同的字母。 如果个数为2,则说明交换那2个位置之后可以相同。 代码: 阅读全文
posted @ 2019-07-01 09:22 Schenker 阅读(251) 评论(0) 推荐(0)