摘要:灵活!首先,需要从后向前dfs,因为后缀。然后,不用再加limit了,但是在特殊的位置要知道该位加的是0还是1。这样的话,记住后缀mod k的值,就很好dfs了。dfs(pod,preMOD,flag) 1 #include 2 #include 3 int dp[1005][105][2],shi...
阅读全文
摘要:之前有想过树的直径咋求,不过一直没仔细去考虑。昨天做了hdu2196 今天突然想到如果把max(up[i]+dis1[i])求出来不就是直径maxx嘛==随后百度了一下看到别人大多数是两次bfs,我从hdu上找了一道题目,果然是可以的。思想应该是一样的吧,都是求两条最长路。这题用到最长路还有:1.k...
阅读全文
摘要:一开始就想到了树形dp,然后下午就一直在做其他事中思考==首先,我用一个dfs来找每一个节点所对应的树中到该节点最远距离dis1[],这个很简单,然后。。。。。。我再思考如何计算这个点到他的兄弟和父亲最远。。。。。。好难描述我的想法历程,语文好差T_T==大概就是这样,我在刚才的dfs中记录了最远的...
阅读全文
摘要:有一个技巧如何把森林转化成树?把所有无根点连向一个统一的根。 1 #include 2 #include 3 #include 4 using namespace std; 5 int now,m,head[205],next[205],point[205],dp[205][205]; 6 void...
阅读全文
摘要:或许,是我理解错了。完全可以把大白书上的maintain当成pushup。其实只要完全理解了,什么姿势都能把线段树打出来。话题回到这道题目,开一个maxv二维数组,记录等级为i的人在该区间最大经验,然后用线段树(levelup)进行升级。 1 #include 2 #include 3 #inclu...
阅读全文
摘要:无负数:1 inline int nextInt() { 2 char c; 3 while (c = getchar(), c '9'); 4 int r = c - '0'; 5 while (c = getchar(), c >= '0' && c ...
阅读全文
摘要:本题的线段树区间更新不能用区间更新做,因为不满足:区间和的更新==区间内每个数更新的和所以实际上是单点更新,单点更新不是退化成On2了吗?不,因为要知道一点64位整数开平方七八次就变成1了,退化成1的区间我们不去更新他,正确计算复杂度为O(10*m*log(n));类似开方这些变化很快的,think...
阅读全文
摘要:很久以前就看到过这个题目,当时刚学线段树看了题解还是感觉敲不出来。现在重新做这道题目感觉思路很难想到,代码量也不小,加深了对lrj大白书中pushdown和maintain的理解。预处理从1开始到i的值。然后一个一个更改,求和。具体细节,包括如何找到更改的左端点和右端点,这些需要仔细思考。think...
阅读全文
摘要:第一个二分查找的是第num个0,第二个二分查找的是最后一个0把lrj大白书里的线段树重打一遍成以后模板,关于里面的maintain函数: 1 #include 2 #include 3 #include 4 using namespace std; 5 int n,ll; 6 int setv[20...
阅读全文
摘要:裸==1.从x更新到y-12.注意格式 1 #include 2 #include 3 #include 4 using namespace std; 5 #define n 1000000 6 int ans[100005],maxv[4000005],addv[4000005]; 7 void ...
阅读全文
摘要:求一个点的下属中能力比自己高,且在所有下属中忠诚度最高的点。dfs扫出左端点右端点,然后按照能力从大到小,id从小到大排序。然后简单的线段树单点修改(忠诚值),区间查询最大(忠诚值)。 1 #include 2 #include 3 #include 4 #include 5 using names...
阅读全文