hdu5788 level up
贴下以前写的代码
比赛前我准备着重看的
主席树 树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的更多相关文章
- Java compiler level does not match解决方法
从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclipse报Description Resource Path Location Type Java compiler level d ...
- 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 ...
- Android版本和API Level对应关系
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html Platform Version API ...
- [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 ...
- [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 ...
- [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- Android版本与api Level
Platform Version API Level VERSION_CODE Notes Android 4.4 19 KITKAT Platform Highlights Android 4.3 ...
- 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 ...
- pythonchallenge 解谜 Level 8
#-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 7 import bz2 un=b'BZh91AY&SYA\xaf\x82\r\x00\x00 ...
随机推荐
- POJ 2826 An Easy Problem?![线段]
An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12970 Accepted: 199 ...
- 使用xUnit为.net core程序进行单元测试(4)
第1部分: http://www.cnblogs.com/cgzl/p/8283610.html 第2部分: http://www.cnblogs.com/cgzl/p/8287588.html 第3 ...
- dedecms文章页调用上一篇和下一篇文章
dedecms文章页调用上一篇和下一篇文章,解析后是链接形式的上下篇 {dede:prenext get='pre'/} {dede:prenext get='next'/}
- linux 下yum使用技巧
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 经常会遇上一些linux系统允许你上外网,而一些是不允许的,这时我们 ...
- 【实用】需要收藏备用的JQuery代码片段
1 元素屏幕居中 jQuery.fn.center = function () { this.css("position","absolute"); this. ...
- JavaScript 常用单词整理
JS单词 push :添加一个数组元素 document :文档 pop :删除最后一个数组元素 console :控制台 shift :删除第一个数组元素 string :字符串 Concat 组合 ...
- shiro进行散列算法操作
shiro最闪亮的四大特征:认证,权限,加密,会话管理 为了提高应用系统的安全性,这里主要关注shiro提供的密码服务模块: 1.加密工具类的熟悉 首先来个结构图,看看shiro提供了哪些加密工具类: ...
- 来了解并防范一下CSRF攻击提高网站安全
看一下我从网上找的原理图,结合举例描述,多看一遍你就知道怎么回事了. CSRF是什么呢?CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具 ...
- 1.4 random模块
Python中的random模块用于生成随机数,下面介绍一下random模块中最常用的几个函数. 国际惯例,用模块之前先导入: >>> import random (一)random ...
- uva1354 枚举二叉树
这题很难,这几天一直在想这题,最后看了汝佳大哥的代码才明白.贴上代码 // UVa1354 Mobile Computing // Rujia Liu #include<cstdio> # ...