贴下以前写的代码
比赛前我准备着重看的
主席树 树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. JVM学习(二)

    Java中的内存的划分可以用下图来表示: 程序计数器:每一个线程都有一个程序计数器,记录需要执行的下一条指令. HootSpot虚拟机中,不区分虚拟机栈和本地方法栈,统一称为栈.虚拟机栈和本地方法栈也 ...

  2. Java对正则表达式的支持(二)

    正则表达式的主要用途: a.在目标字符串中找出匹配正则表达式的部分 b.校验目标字符串是否符合正则表达式,例如校验邮箱地址 c.在目标字符串中替换符合正则表达式的部分为其他的字符串 Scanner类是 ...

  3. 利用QuickCHM制作chm

    CHM是一种常见的帮助文件格式,也是电子书的一种格式. 下面是使用QuickCHM制作chm的步骤: 1.先将所有的word文档存储为mht格式,点击,文件--另存为网页,如下 2.确保所有的word ...

  4. BZOJ 3473: 字符串 [广义后缀自动机]

    3473: 字符串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 354  Solved: 160[Submit][Status][Discuss] ...

  5. vuex学习笔记

    一.vuex的目的 把组件的共享状态抽取出来,以一个全局单例模式管理.在这种模式下,组件树构成了一个巨大的视图,不管在树的哪个位置,任何组件都能获取状态或触发行为. 二.vuex集中式管理数据 安装 ...

  6. 2018-01-08 学习随笔 SpirngBoot整合Mybatis进行主从数据库的动态切换,以及一些数据库层面和分布式事物的解决方案

    先大概介绍一下主从数据库是什么?其实就是两个或N个数据库,一个或几个主负责写(当然也可以读),另一个或几个从只负责读.从数据库要记录主数据库的具体url以及BigLOG(二进制日志文件)的参数.原理就 ...

  7. 小甲鱼OD学习第7讲

    这次我们任务是破解这个有日期限制的软件,效果如图所示 我们一边下断点一边调试哪里是NAG窗口的程序,最终我们发现在地址 00489912  处的代码是NAG窗口的代码 通过观察我们把004898E1处 ...

  8. LNMP环境下搭建wordpress

    WordPress 下载WordPress安装包,可以直接wget获取也可以ftp上传,解压到/usr/share/nginx/html/blog-wp,访问index.php即进行安装:   wor ...

  9. Postfix+dovecot搭建简单邮箱服务器

    实验环境: (1)修改主机名:hostnamectl set-hostname mail.meilintong.com 退出,重新登陆 (2)关闭selinux (3)关闭防火墙 1.安装postfi ...

  10. 01. SELECT显示和PRINT打印超长的字符

    从SQL Server 2005开始,引入了varchar(max) / nvarchar(max) 数据类型,表中可不使用LOB数据类型,从而突破单列8000 / 4000字符的限制,动态SQL也可 ...