Victor and Proposition

Time Limit: 6000ms
Memory Limit: 524288KB

This problem will be judged on HDU. Original ID: 5420
64-bit integer IO format: %I64d      Java class name: Main

At the very beginning, Victor has a proposition, then this proposition procudes many propositions. Then every proposition procudes more propositions...... Finally there are n propositions. These propositions can be regarded as a tree whose root is 1.

We assume that the first proposition, whose number is 1, belongs to the 0-th generation, and those propositions produced by the x-th generation belong to the x+1-th generation. We also assume that all of the propositions in the x-th generation are in level x. Specially, Victor has discovered that the proposition whose number is i can infer the proposition whose number is xi and all of the propositions in xi's subtree, whose levels are not greater than xi's level + di.

Notice : a is b's father does not show that either a can infer b or b can infer a.

Now please determine the number of such ordered pairs (i,j), that 1≤i<j≤n, the proposition i can infer the proposition j, and the proposition j can also infer the proposition i.

Input
The first line of the input contains an integer T, denoting the number of test cases.

In every test case, there is an integer n in the first line, denoting the number of the propositions.

The second line contains n−1 integers, the i-th integer fi+1(fi<i) denotes that the proposition i+1 is produced by the proposition fi+1.

Then there are n lines, the i-th line contains two integers xi and di.

1≤T≤5.

2≤n≤100000.

0≤di<n.

Output
Your program should print T lines : the i-th of these should contain a single integer, denoting the number of such ordered pairs (i,j).

Sample Input
1
4
1 2 1
2 1
1 0
4 0
2 0

Sample Output
6

Source
BestCoder Round #52 (div.2)

解题:线段树优化建图,妙哉,内存开得好凶残,吓呆本宝宝了

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int INF = 0x3f3f3f3f;
const int maxn = ;
struct arc {
int to,next;
arc(int x = ,int y = -) {
to = x;
next = y;
}
} e[(+)**];
int head[maxn],L[maxn],R[maxn],tot,clk;
int dep[maxn],hs[maxn],st[maxn],n;
vector<pii>order[maxn];
void add(int u,int v) {
e[tot] = arc(v,head[u]);
head[u] = tot++;
}
void init() {
tot = ;
memset(head,-,sizeof head);
}
void dfs(int u,int depth) {
hs[L[u] = ++clk] = u;
dep[u] = depth;
for(int i = head[u]; ~i; i = e[i].next) dfs(e[i].to,depth + );
R[u] = clk;
}
void build(int L,int R,int v) {
order[v].resize(R - L + );
if(L == R) {
st[v] = ++n;
order[v][] = pii(dep[hs[L]],hs[L]);
add(n,hs[L]);
return;
}
int mid = (L + R)>>;
build(L,mid,v<<);
build(mid + ,R,v<<|);
st[v] = n + ;
merge(order[v<<].begin(),order[v<<].end(),order[v<<|].begin(),order[v<<|].end(),order[v].begin());
for(int i = ; i <= R - L; ++i)
add(n + i + , n + i);
for(int i = ; i <= R - L; ++i)
add(n + i + ,order[v][i].second);
n += R - L + ;
}
void connect(int L,int R,int lt,int rt,int u,int d,int v) {
if(lt <= L && rt >= R) {
int pos = lower_bound(order[v].begin(),order[v].end(),pii(d,INF)) - order[v].begin() - ;
if(~pos) add(u,st[v] + pos);
return;
}
int mid = (L + R)>>;
if(lt <= mid) connect(L,mid,lt,rt,u,d,v<<);
if(rt > mid) connect(mid + ,R,lt,rt,u,d,v<<|);
}
int dfn[maxn],low[maxn],cnt[maxn],scc,ct;
bool instack[maxn];
stack<int>stk;
void tarjan(int u) {
dfn[u] = low[u] = ++ct;
instack[u] = true;
stk.push(u);
for(int i = head[u]; ~i; i = e[i].next) {
if(!dfn[e[i].to]) {
tarjan(e[i].to);
low[u] = min(low[u],low[e[i].to]);
} else if(instack[e[i].to]) low[u] = min(low[u],dfn[e[i].to]);
}
if(low[u] == dfn[u]) {
int v;
cnt[++scc] = ;
do {
instack[v = stk.top()] = false;
stk.pop();
cnt[scc] += (v <= clk);
} while(v != u);
}
}
int main() {
int kase,u,v;
scanf("%d",&kase);
while(kase--) {
scanf("%d",&n);
init();
clk = scc = ct = ;
memset(dfn,,sizeof dfn);
memset(instack,false,sizeof instack);
for(int i = ; i <= n; ++i) {
scanf("%d",&u);
add(u,i);
}
dfs(,);
init();
build(,clk,);
for(int i = ; i <= clk; ++i) {
scanf("%d%d",&u,&v);
connect(,clk,L[u],R[u],i,dep[u] + v,);
}
for(int i = ; i <= n; ++i)
if(!dfn[i]) tarjan(i);
LL ret = ;
for(int i = ; i <= scc; ++i)
ret += (LL)cnt[i]*(cnt[i]-)/;
printf("%I64d\n",ret);
}
return ;
}

HDU 5420 Victor and Proposition的更多相关文章

  1. ACM: HDU 5418 Victor and World - Floyd算法+dp状态压缩

    HDU 5418 Victor and World Time Limit:2000MS     Memory Limit:131072KB     64bit IO Format:%I64d & ...

  2. HDU 5417 Victor and Machine

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5417 Problem Description Victor has a machine. When t ...

  3. HDU 5418 Victor and World 允许多次经过的TSP

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5418 bestcoder(中文): http://bestcoder.hdu.edu.cn ...

  4. HDU 5418 Victor and World(状压DP+Floyed预处理)

    Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Other ...

  5. HDU 5421 Victor and String

    Victor and String Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on HDU. Orig ...

  6. HDU - 5419 Victor and Toys(组合计数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5419 题意 n个物品,标号1-n,物品i有权值wi.现在有m个区间[l,r],从中任意选三个区间i,j,k,求物 ...

  7. HDU 5421 Victor and String(回文树)

    Victor and String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/262144 K (Java/Othe ...

  8. HDU 5419——Victor and Toys——————【线段树|差分前缀和】

    Victor and Toys Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others ...

  9. HDU 5418——Victor and World——————【状态压缩+floyd】

    Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Other ...

随机推荐

  1. [CF1076G] Array Game

    Description Transmission Gate Solution 考虑Dp,设Dp[i] 表示当我们从前面跳跃到i时,他是必胜还是必败. 那么\(Dp[i] = Min(Dp[j], !( ...

  2. _bzoj2818 Gcd【线性筛法 欧拉函数】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 若gcd(x, y) = 1,则gcd(x * n, y * n) = n.那么,当y ...

  3. _bzoj1002 [FJOI2007]轮状病毒【瞎搞】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1002 这种题真是有毒,很多叼一点的都用matrix tree定理推出了递推公式,也有一些用好 ...

  4. Optimizing Downloads for Efficient Network Access

    Optimizing Downloads for Efficient Network Access Previous  Next 1.This lesson teaches you to Unders ...

  5. thinkphp3.2 + soap

    服务器配置 扩展libxml2下载地址:http://xmlsoft.org/downloads.html 在windows下的php.ini文件里 找到这一行代码(如没有则自行添加) extensi ...

  6. AJPFX关于增强for的概述和使用(foreach)

    增强for的概述和使用(foreach)1.增强for的概述和使用(foreach)                格式:                for(数组或者Collection集合中元素 ...

  7. VMware Workstation安装CentOS 7和开发环境

    VMware Workstation新建虚拟机 此处使用的是VMware Workstation 10,其安装过程即是常规Windos系统下软件安装方式,略过. 安装完成双击图标: 打开虚拟机主界面: ...

  8. 内置函数isinstance和issubclass

    1. isinstance(obj,class) 判断对象obj是不是由class生成的对象. class Foo: pass obj=Foo() print(isinstance(obj,Foo)) ...

  9. R in action读书笔记(10)-第八章:回归-- 异常观测值 改进措施

    8.4 异常观测值 8.4.1 离群点 car包也提供了一种离群点的统计检验方法.outlierTest()函数可以求得最大标准化残差绝对值Bonferroni调整后的p值: > library ...

  10. 键盘工具栏的快速集成--IQKeyboardManager

    转自:http://www.cnblogs.com/gaoxiaoniu/p/5333187.html 键盘工具栏的快速集成--IQKeyboardManager IQKeyboardManager, ...