摘要:
HDU_4441 1. insert 至于找最小的没出现过的正整数,维护一个线段树就很容易实现了。插入+i的时候和普通的splay的插入操作没什么区别,插入-i的时候还涉及到统计的问题。说是让-i越靠右越好,其实也就是不得不让i出栈的时候再让它出栈,那么-i的右边应当也是一个负数(或者-i是最后一个数)。假设插入+i的左边有n个正数,那么-i就应该放在第n+1个负数的左边,如果不存在第n+1个负数,那么就放在序列的最右边。这样就涉及到统计一个区间内有多少正数、负数,以及去查找第k个负数等操作,这一点可以通过给splay维护区间内的正数、负数的数量来实现,也就是多打两个标记就行了。 2. rem 阅读全文
摘要:
BZOJ_1781 这个题目如果Xi和Yi的范围都很小的话,那么就是个普通的广搜而已,但是现在Xi和Yi的范围超大,于是就多了各种离散化和二分查找。 其实落脚点也就只有石头周围的4个点,和石头的数量是同级别的,这样每次枚举行走的方向时要快速的找到前面的第一个石头,用二分的话就可以实现比较快速的查找了。 代码写的巨挫……而且因为代码长了之后就会有些恶心的小bug,找错找了很久,眼泪……#include<stdio.h>#include<string.h>#include<algorithm>#include<vector>#include<q 阅读全文
摘要:
BZOJ_1782 刚看完一部惊悚片,赶紧A个题缓和一下气氛,要不该做噩梦了…… 这个题目相当于每个节点都有一个标号,然后求从根到当前节点的路径上,小于当前节点的标号一共有多少个,可以在dfs的时候用树状数组来统计。#include<stdio.h>#include<string.h>#define MAXD 100010#define MAXM 200010int N, D, first[MAXD], e, next[MAXM], v[MAXM], sum[MAXD], who[MAXD], res[MAXD];void update(int x, int d){ f 阅读全文
摘要:
BZOJ_1783 乍看上去大概就要dp的,细想一下确实dp是可行的,不过中文描述里面漏了句关键的话,一开始让我迷茫了一阵,后来仔细看了英文描述之后才算清楚了。 另外突发奇想用英文写了题解,大概脑子在深夜的时候总会有点诡异的想法吧……(本人六级尚未考过,如果英文太烂的话还望谅解……)/* f[i] means the maximum weights we can get between hay bale i and hay bale N (include i and N). id[i] means which one we should choose firstly if we w... 阅读全文
摘要:
BZOJ_1785 一开始没有什么直接的思路,不过由于是棵树,而且K很小,也许是个树形的dp或者背包什么的,不过后来仔细一想,其实可以用贪心解决问题的。 对于一个非叶子节点,假设其若干子树中还有一些未配对的奶牛,那么应该是优先这些子树之间相互配对的,因为如果两个子树之间的两头奶牛可以配对但没有配对,而是有一个奶牛通过父亲甚至祖先和另外的奶牛配对了,这样不仅占有了当前这个节点的交换机的资源,还多占用了其父亲甚至祖先节点的交换机的资源,这样显然是划不来的。所以如果子树的奶牛之间可以相互配对,那么自然就先配好,剩下的奶牛再通过父节点传递出去。 大体的思路形成了,但不难发现还有一个小细节,一棵子树中可 阅读全文