贴下以前写的代码
比赛前我准备着重看的
主席树 树dp 字符串

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5+5;
const int MOD = 1e9+7; int N;
int A[MAXN];
vector<int> mp[MAXN];
int val[MAXN][2];
/**********President Tree**********/
int tot;
struct Node{
int ls, rs, cc;
Node(int a=0, int b=0, int c=0):ls(a), rs(b), cc(c){}
}tree[MAXN*20];
int sta[MAXN];
int Build(int pos,int l,int r){
int rt = tot++;
tree[rt].cc = 1;
tree[rt].ls = tree[rt].rs = 0;
if(l == r) return rt;
int mid = (l+r) >> 1;
if(pos <= mid) tree[rt].ls = Build(pos, l,mid);
else tree[rt].rs = Build(pos, mid+1,r);
return rt;
}
int Merge(int x,int y,int l,int r){
if(x == 0 || y == 0) return x+y;
tree[x].cc += tree[y].cc;
if(l == r) {
tree[x].ls = tree[x].rs = 0;
return x;
}
int mid = (l+r) >> 1;
tree[x].ls = Merge(tree[x].ls, tree[y].ls, l, mid);
tree[x].rs = Merge(tree[x].rs, tree[y].rs,mid+1, r);
return x;
}
int Query(int rt,int K,int l,int r){
if(tree[rt].cc < K) return 100000;
if(l == r) return l;
int mid = (l+r)>>1;
if(tree[tree[rt].ls].cc >= K) return Query(tree[rt].ls, K, l ,mid);
else return Query(tree[rt].rs, K-tree[tree[rt].ls].cc, mid+1, r);
} void dfs(int x){
sta[x] = Build(A[x], 1, 100000);
for(int i = 0; i < mp[x].size(); ++i){
int y = mp[x][i];
dfs(y);
sta[x] = Merge(sta[x], sta[y], 1, 100000);
}
// printf("%d\n",sta[x]);
val[x][0] = Query(sta[x], tree[sta[x]].cc+1>>1, 1, 100000);
val[x][1] = Query(sta[x], (tree[sta[x]].cc+1>>1)+1, 1, 100000);
}
/**************BIT*************/
ll bitt[MAXN];
void Add(int pos,int num){
for(int i = pos; i > 0; i -= i&-i)
bitt[i] += num;
}
ll Sum(int pos){
ll ans = 0;
for(int i = pos; i <= 100000; i += i&-i)
ans += bitt[i];
return ans;
}
ll dfs2(int x){
Add(val[x][0], val[x][1]-val[x][0]);
ll ans = Sum(val[x][0]);
for(int i = 0; i < mp[x].size(); ++i){
int y = mp[x][i];
ans = max(ans, dfs2(y));
}
Add(val[x][0], val[x][0]-val[x][1]);
return ans;
} int main(){
while(~scanf("%d",&N)){
memset(bitt,0,sizeof(bitt)); tot = 1;
for(int i = 1; i <= N; ++i) scanf("%d",&A[i]);
for(int i = 1; i <= N; ++i) mp[i].clear();
for(int i = 2; i <= N; ++i){
int a; scanf("%d",&a);
mp[a].push_back(i);
}
dfs(1);
ll sum = 0;
for(int i = 1; i <= N; ++i)
sum += val[i][0];
printf("%lld\n", sum + dfs2(1));
}
return 0;
}

hdu5788 level up的更多相关文章

  1. Java compiler level does not match解决方法

    从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclipse报Description  Resource Path Location Type Java compiler level d ...

  2. Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead的解决办法

    今天在导入工程进Eclipse的时候竟然出错了,控制台输出的是: [2013-02-04 22:17:13 - takepicture] Android requires compiler compl ...

  3. Android版本和API Level对应关系

    http://developer.android.com/guide/topics/manifest/uses-sdk-element.html Platform Version       API ...

  4. [LeetCode] Binary Tree Level Order Traversal II 二叉树层序遍历之二

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  5. [LeetCode] Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  6. [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  7. Android版本与api Level

    Platform Version API Level VERSION_CODE Notes Android 4.4 19 KITKAT Platform Highlights Android 4.3 ...

  8. Selenium通过WebDriver控制IE浏览器出错 Browser zoom level was set to 109%. It should be set to 100%

    错误信息: WebDriverException: Message: Unexpected error launching Internet Explorer. Browser zoom level ...

  9. pythonchallenge 解谜 Level 8

    #-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 7 import bz2 un=b'BZh91AY&SYA\xaf\x82\r\x00\x00 ...

随机推荐

  1. 洛谷 [P1129] [ZJOI2007] 矩阵游戏

    这竟然是一道二分图 乍一看,可能是用搜索做,但是这个数据范围,一定会T. 我们观察发现,无论怎样变换,同一行的一定在同一行,同一列的一定还在同一列.所以说,一行只能配一列.这样,我们的目标就是寻找是否 ...

  2. HDU Be the Winner [Anti-SG]

    传送门 n堆,每次拿走至少一个,剩下的可以分成两堆.最后拿的人输 打表观察发现和Nim游戏一样...裸Anti-SG啊 #include <iostream> #include <c ...

  3. ArcGIS API for JavaScript开发环境搭建与发布以及基本功能实现

    1.背景介绍 ArcGIS API for JavaScript 咱这就不介绍了,具体可看ESRI中国的介绍:http://support.esrichina.com.cn/2011/0223/960 ...

  4. 树莓派小车(三)Python控制小车

    正文之前 由于最近忙于复习赶考,所以暂时没有拿起树莓派小车,直到昨天,终于空出时间来把代码整理一下来和大家分享. 正文 在树莓派小车系列之二中,讲到了树莓派的引脚定义方式有两种: PHYSICAL N ...

  5. JDK8的新特性——Lambda表达式

    JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分开发者所熟练运用,甚至不被开发者所熟知. ...

  6. js 中的一些小技巧

    js 数字操作: 1.1 取整: 取整有很多方法如: parseInt(a,10); Math.floor(a); a>>0; ~~a; a|0; 前面2种是经常用到的,后面3中算是比较偏 ...

  7. PhpStorm使用之 —— Xdebug断点调试

    PhpStorm使用之 -- Xdebug断点调试 在<XAMPP的配置与使用>中已经阐述了Xdebug插件的配置,Xdebug配置完成后,只需要在IDE工具中进行相关设置,便可启动Xde ...

  8. ubuntu:通过封装验证码类库一步步安装php的gd扩展

    我相信很多人的lamp环境都是直接复制一堆参数安装进去的,这里有可能成功,也有可能失败,如果是新手,估计要碰到各种错误,就算安装成功,也未必知道那些参数是干嘛的,反正装进去能用就行. 我当初开始的时候 ...

  9. Java基础系列--final关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8482909.html 一.概述 final是Java关键字中最常见之一,表示"最 ...

  10. 一个例子理解break和continue的区别

    结论:break用于终止整个循环,而continue用于终止某一次循环.public class Test { public static void main(String[] args) { for ...