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. DFS和BFS模板

    DFS: 该DFS框架以2D坐标范围为例,来体现DFS算法的实现思想 #include<cstdio> #include<cstring> #include<cstdli ...

  2. 选择排序 分类: 算法 c/c++ 2014-10-10 20:32 509人阅读 评论(0) 收藏

    选择排序(假设递增排序) 每次选取从当前结点到末尾结点中最小的一个与当前结点交换,每一轮固定一个元素位置. 时间复杂度O(n^2),空间复杂度O(1).下面的示例代码以带头结点的链表为存储结构: #i ...

  3. C. Hongcow Builds A Nation 并查集

    http://codeforces.com/contest/745/problem/C 把他们并查集后, 其他没有连去government的点,全部放去同一个并查集,然后选择一个节点数最多的gover ...

  4. Android开发学习——Volley框架

    转载至: http://blog.csdn.net/guolin_blog/article/details/17482095 一些概念性的东西 大家进入上边链接理解,我贴一下 具体的实现代码: pub ...

  5. NSoup获取网页源代码

    NSoup是JSoup的Net移植版本.使用方法基本一致. 如果项目涉及HTML的处理,强烈推荐NSoup,毕竟字符串截断太苦逼了. 下载地址:http://nsoup.codeplex.com/ # ...

  6. 使用Jenkins进行android项目的自动构建(1)

    环境搭建 1. 下载JDK,安装,并将JDK的安装目录加入到环境变量JAVA_HOME,将JDK的bin目录加入到环境变量PATH. 2. 下载Android SDK,解压,并将SDK的安装目录加入到 ...

  7. ASP.Net TextBox只读时不能通过后台赋值取值

    给页面的TextBox设置ReadOnly="True"时,在后台代码中不能赋值取值,下边几种方法可以避免: 1.不设置ReadOnly,设置onfocus=this.blur() ...

  8. VUE 入坑系列 一 事件

    html代码 <div id="app"> <button v-on:click="counter += 1">加1</butto ...

  9. CentOS7 Install Shipyard

    # 采集木jj 原文:http://www.cnblogs.com/caoguo/p/5735189.html # CentOS7 Install Shipyard# yum install dock ...

  10. MySql(一)mysql服务的基本操作及环境配置

    MySQL服务的启动开始–>计算机–>右键选择管理–>双击打开服务和应用程序–>双击服务–>找到MySQL的服务名称(我的是MySQL56),右键选择启动即可 通过命令行 ...