hdu 5877
来源:互联网 发布:兔小将是什么 知乎 编辑:程序博客网 时间:2024/04/28 19:20
题意: 有根树 1e5 个节点。 u 为v 的祖先,求树中有多少对 a[u]*a[v]<=k k题目中给出。 a[i]为i节点的点权值。
容易想到在深搜过程中维护一个有序序列,在 到达节点v时 ,看序列中有多少<=k的值。 但这个序列当时想的是可以用vector 维护,后来发现不行,不知道到底行不行,还有一中方法就是用线段树,或者树状数组。先离散 在通过点修改,求和的方法统计每个几点的贡献就行了
#include<stdio.h>#include<algorithm>#include<vector>#include<string.h>#include<iostream>using namespace std;long long a[100010*2];long long sum[100010*8];long long b[200010];long long k;int in[100010];int m;vector<int>v[100010];long long res;void push_up(int rt){ sum[rt] = sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){ if(l==r) { sum[rt]=0; return ; } int mid = (l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); push_up(rt);}void update(int pos,int val, int l,int r,int rt){ if(l==r) { sum[rt]+=val; return ; } int mid = (l+r)>>1; if(pos<=mid) update(pos,val,l,mid,rt<<1); else update(pos,val,mid+1,r,rt<<1|1); push_up(rt);}long long query(int L ,int R,int l ,int r ,int rt){ if(L<=l&&r<=R)return sum[rt]; int mid = (l+r)>>1; long long ans = 0; if(L<=mid) ans+=query(L,R,l,mid,rt<<1); if(R>mid) ans+=query(L,R,mid+1,r,rt<<1|1); return ans ;}void dfs(int u){ int x = lower_bound(a+1,a+1+m,k/b[u])- (a); int y = lower_bound(a+1,a+1+m,b[u])-(a); res+=query(1,x,1,m,1); update(y,1,1,m,1); for(int i =0; i<v[u].size(); i++) { int to=v[u][i]; dfs(to); } update(y,-1,1,m,1);}int main(){ int T; scanf("%d",&T); while(T--) { res =0; memset(in,0,sizeof(in)); int n; scanf("%d%lld",&n,&k); for(int i =1; i<=n; i++)v[i].clear(); int cot = 1 ; for(int i = 1; i<=n; i++) { scanf("%lld",&b[i]); a[cot++] =b[i]; a[cot++] = k/a[cot-1]; } for(int i = 1; i<n; i++) { int u,vg; scanf("%d%d",&u,&vg); v[u].push_back(vg); in[vg]++; } sort(a+1,a+1+2*n); m = unique(a+1,a+1+2*n)-(a+1); build(1,m,1); for(int i = 1; i<=n; i++) { if(in[i]==0) { dfs(i); break; } } cout<<res<<endl; } return 0;}
0 0
- hdu 5877
- hdu 5877
- hdu 5877
- HDU 5877 treap
- HDU 5877 Weak Pair
- HDU 5877 Weak Pair
- HDU 5877 - Weak Pair
- hdu 5877 Weak Pair
- HDU-5877-Weak Pair
- HDU 5877 Weak Pair
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- mysql 中id相同的数据拼接起来-- GROUP_CONCAT拯救你
- [读书笔记/翻译]Multiple View Geometry in Computer Vision-1.2,1.3
- React Native-图片轮播
- iOS之多线程的使用
- 独立路径计算
- hdu 5877
- 改革1
- Swift-按钮(UIButton)详解
- Andriod项目build.gradle文件详解
- 北京地铁乘坐路线查询
- 编译安装ImageMagick
- [读书笔记/翻译]Multiple View Geometry in Computer Vision-1.4,1.5,1.6
- 小话设计模式(一)单例模式
- leetcode-2. Add Two Numbers简单的java链表算法题 面试碰到了吗?