题目链接


You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-negative value aiai is assigned.An orderedordered pair of nodes (u,v)(u,v) is said to be weakweakif 
  (1) uu is an ancestor of vv (Note: In this problem a node uu is not considered an ancestor of itself); 
  (2) au×av≤kau×av≤k.

Can you find the number of weak pairs in the tree?

Input

There are multiple cases in the data set. 
  The first line of input contains an integer TT denoting number of test cases. 
  For each case, the first line contains two space-separated integers, NN and kk, respectively. 
  The second line contains NN space-separated integers, denoting a1a1 to aNaN. 
  Each of the subsequent lines contains two space-separated integers defining an edge connecting nodes uu and vv , where node uu is the parent of node vv.

Constrains: 
   
  1≤N≤1051≤N≤105 
   
  0≤ai≤1090≤ai≤109 
   
  0≤k≤10180≤k≤1018

Output

For each test case, print a single integer on a single line denoting the number of weak pairs in the tree.

Sample Input

1
2 3
1 2
1 2

Sample Output

1

题意:给你一棵树以及单项边,以及每个点的权值,如果每一个点与其祖先的权值乘积<=k,ans+1

拿到这个题目,第一个想法就是在dfs的过程中将维护祖先的权值,就是dfs某个点时将权值加入set,dfs完了就删除,然后查询

s.upper_bround找到大于该点权值的下标,但是发现无法将set里边的下标取出,因为set是无序的

然后第二就是异想天开的用vector维护一个升序的,用上述相同方法,但是TLE,发现了vector的插入删除是O(n)的

我的stl问题太大了。

正确思路,将所有的权值以及k/val离散,因为是维护的大小,所以用树状数组来维护即可。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define PI 3.14159265358979323846
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
#define pii make_pair
#define pr pair<int,int>
const int dir[6][2]= {2,0,-2,0,-1,3,-1,-3,1,-3,1,3};
typedef long long ll;
const ll inFF=9223372036854775807;
typedef unsigned long long ull;
using namespace std;
const int maxn=2e5+5;
int head[maxn],sign,ans;
int in[maxn];
struct node
{int to,p;
}edge[maxn<<1];
struct nod
{ll x;int i,val;
}a[maxn];
bool cmp1(nod s,nod e){return s.x<e.x;}
bool cmp2(nod s,nod e){return s.i<e.i;}
int c[maxn];
int m,n;
ll k;
void edge_add(int u,int v)
{edge[sign]=node{v,head[u]};head[u]=sign++;
}
void add(int x,int val)
{while(x<=n){c[x]+=val;x+=lowbit(x);}
}
int query(int x) //求前n项的和.
{int sum=0;while(x>0){sum+=c[x];x-=lowbit(x);}return sum;
}
void init()
{sign=ans=a[0].x=0;for(int i=0;i<=n;i++){head[i]=-1;c[i]=in[i]=0;}
}
void dfs(int u)
{ans+=query(a[u+m].val);add(a[u].val,1);for(int i=head[u];~i;i=edge[i].p){int v=edge[i].to;dfs(v);}add(a[u].val,-1);
}
int main()
{int t,x,y,root;cin>>t;while(t--){scanf("%d %lld",&m,&k);n=2*m,init();for(int i=1;i<=m;i++){scanf("%lld",&a[i].x),a[i].i=i;a[i+m].x=a[i].x?(k/a[i].x):inFF;a[i+m].i=i+m;}sort(a+1,a+1+n,cmp1);for(int i=1;i<=n;i++){if(a[i].x!=a[i-1].x) a[i].val=a[i-1].val+1;else a[i].val=a[i-1].val;}sort(a+1,a+1+n,cmp2);for(int i=1;i<m;i++) scanf("%d %d",&x,&y),edge_add(x,y),in[y]++;for(int i=1;i<=m;i++) if(in[i]==0) {root=i;break;}dfs(root);printf("%d\n",ans);}return 0;
}

HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化相关推荐

  1. HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路

    题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...

  2. HDU - 5875 2016 ACM/ICPC 大连网络赛 H题 暴力

    题目链接 题意:给你一个区间l,r一直将val[l]模上val[l+1],val[l+2]...val[r],因为一个模上比前一个数小数是没有意义的,所以需要将每一个点找到右边第一个小于他的点就行. ...

  3. HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...

  4. 2013 ACM/ICPC 长沙网络赛J题

    题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...

  5. HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)...

    树状数组... Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/6 ...

  6. 树形DP+树状数组 HDU 5877 Weak Pair

    1 //树形DP+树状数组 HDU 5877 Weak Pair 2 // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 3 // 这道题要 ...

  7. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  8. 2019 ICPC 徐州网络赛 J.Random Access Iterator

    2019 ICPC 徐州网络赛 J.Random Access Iterator 题目大意:给你n个点和n-1条边(树形结构),保证1为根节点,通过以下方式dfs遍历: 询问dfs到最深节点的概率(有 ...

  9. HDU - 5877 Weak Pair(离散化+树状数组+dfs序)

    题目链接:点击查看 题目大意:给定一个n个节点的树,每个节点都有权值,现在定义weak pair(u,v)需要满足的两个条件: u是v的祖先: ; 问给定的树中有多少个weak pair: 题目分析: ...

最新文章

  1. 研究生穿实验服满校追羊跑... 因为这是在追奔跑的毕业论文,哈哈哈!
  2. 虚拟桌面环境需要一个什么样的接入网络?
  3. Linux - 后台运行 ctrl + z , jobs , bg , fg
  4. CUMCM:05A长江水质综合评价与预测
  5. java List最大_在java中获取List集合中最大的日期时间操作
  6. .NET 指南:转换操作符
  7. 'django_tables2' is not a registered tag library. Must be one of:
  8. css类选择器或逻辑,深入理解CSS中选择器的逻辑处理
  9. android lua loadluafile 相对路径,Lua中的loadfile、dofile、require详解
  10. (95)FPGA仿真文件保存(VCD文件)
  11. Git清除用户名和密码
  12. JSON 对比工具,优秀的JSON对比工具,对比json数据
  13. matlab二维函数的傅立叶变换,二维傅里叶变换和滤波(Two
  14. aws-sdk for JavaScript 官方api文档
  15. Mysql 地区经纬度 查询
  16. 骆昊python100天百度网盘_GitHub - yiailake/Python-100-Days: Python - 100天从新手到大师
  17. 记一次java实现excel导出
  18. 可供软件测试练习的在线网站、被测系统——整理中
  19. python搭建PyDev详细版
  20. [USACO13NOV]Crowded Cows

热门文章

  1. 一些js代码,自己备用的。高手不要笑话我。。(跨浏览器基础事件,浏览器检测,判断浏览器的名称、版本号、操作系统)...
  2. 微信小程序----map组件实现(获取定位城市天气或者指定城市天气数据)
  3. Python 常见的坑汇总
  4. 简单又好看的按钮,扁平化按钮。
  5. 经常用得到的安卓数据库基类
  6. 基于php下载文件的详解
  7. CS Tip 16: 利用注释
  8. iPhone PHP获取文件,IOS中获取各种文件的目录路径的方法
  9. can是什么时候处于显性_can总线怎么传输数据格式过程分析
  10. 4 关卡编辑器_虚幻引擎4与生存游戏产生化学反应,超真实开放世界手游诞生