CF293E Close Vertices 点分治+树状数组
开始zz写了一个主席树,后来发现写个树状数组就行~
#include <cstdio>
#include <vector>
#include <algorithm>
#include <bits/stdc++.h>
#define N 100005
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int length,weight;
namespace BIT
{
int C[N];
int lowbit(int t)
{
return t&(-t);
}
void update(int x,int v)
{
for(;x<N;x+=lowbit(x)) C[x]+=v;
}
int query(int x)
{
int re=0;
for(;x>0;x-=lowbit(x)) re+=C[x];
return re;
}
};
ll answer;
struct Node
{
int u,d1,d2;
Node(int u=0,int d1=0,int d2=0):u(u),d1(d1),d2(d2){}
};
vector<Node>v;
bool cmp(Node a,Node b)
{
return a.d2<b.d2;
}
int n,edges,root,sn;
int hd[N],to[N<<1],nex[N<<1],val[N<<1];
int size[N],mx[N],vis[N],rt[N];
void add(int u,int v,int c)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
}
void getroot(int u,int ff)
{
size[u]=1,mx[u]=0;
for(int i=hd[u];i;i=nex[i])
if(to[i]!=ff&&!vis[to[i]])
getroot(to[i],u),size[u]+=size[to[i]],mx[u]=max(mx[u],size[to[i]]);
mx[u]=max(mx[u],sn-size[u]);
if(mx[u]<mx[root]) root=u;
}
// d1<=l d2<=w
void getdis(int u,int ff,int d1,int d2)
{
v.push_back(Node(u,d1,d2));
for(int i=hd[u];i;i=nex[i])
if(to[i]!=ff&&!vis[to[i]])
getdis(to[i],u,d1+1,d2+val[i]);
}
ll calc(int u,int D1,int D2)
{
getdis(u,0,D1,D2);
sort(v.begin(),v.end(),cmp);
ll re=0;
int i,j,l=0,r=(int)v.size()-1;
for(i=1;i<(int)v.size();++i) BIT::update(v[i].d1+1,1);
while(l<r)
{
if(v[l].d2+v[r].d2<=weight)
{
re+=(ll)BIT::query(length-v[l].d1+1);
++l,BIT::update(v[l].d1+1,-1);
}
else
{
BIT::update(v[r].d1+1,-1);
--r;
}
}
v.clear();
return re;
}
void solve(int u)
{
vis[u]=1;
answer+=calc(u,0,0);
for(int i=hd[u];i;i=nex[i]) if(!vis[to[i]]) answer-=calc(to[i],1,val[i]);
for(int i=hd[u];i;i=nex[i])
if(!vis[to[i]])
sn=size[to[i]],root=0,getroot(to[i],u),solve(root);
}
int main()
{
int i,j;
// setIO("input");
scanf("%d%d%d",&n,&length,&weight);
for(i=1;i<n;++i)
{
int a=i+1,b,c;
scanf("%d%d",&b,&c),add(a,b,c),add(b,a,c);
}
mx[root=0]=sn=n,getroot(1,0),solve(root);
printf("%lld\n",answer);
return 0;
}
CF293E Close Vertices 点分治+树状数组的更多相关文章
- BZOJ_3262_陌上花开_CDQ分治+树状数组
BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
- 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...
- BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组
BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...
- BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组
BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...
- BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组
BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组 Description 给定N个数对(xi, yi),求最长上升子 ...
- BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组
BZOJ_2683_简单题&&BZOJ_1176_[Balkan2007]Mokia_CDQ分治+树状数组 Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加 ...
随机推荐
- PTA(Basic Level)1048.数字加密
本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余--这里用 J 代表 ...
- [转帖]linux中systemctl详细理解及常用命令
linux中systemctl详细理解及常用命令 2019年06月28日 16:16:52 思维的深度 阅读数 30 https://blog.csdn.net/skh2015java/article ...
- 依赖作用域之<scope>test</scope>
经常在代码中看到依赖的作用域为<scope>test</scope>,它的作用是,只能在test目录(通过右键->Make Directory as->Test S ...
- C++练习 | 模板与泛式编程练习(2)
#include <iostream> #include <cmath> #include <cstring> #include <string> #i ...
- HTTPS原理(三次握手)
第一步: 客户端向服务器发送HTTPS请求,服务器将公钥以证书的形式发送到客户端(服务器端存放私钥和公钥). 第二步: 浏览器生成一串随机数,然后用公钥对随机数和hash签名进行加密,加密后发送给服务 ...
- Python 入门 之 包
Python 入门 之 包 1.包 (1)什么是包? 文件夹下具有_ init.py _的文件夹就是一个包 (2)包的作用: 管理模块(文件化) (3)包的导入: 导入: 启动文件要和包文件是同级 绝 ...
- 利用Mocking Framework 单元测试Entity Framework
一.前言 在实际编写程序时,往往需要与数据库打交道,在单元测试中直接使用数据库又显得太重,如果可以方便的编写一些测试数据,这样更易于检测功能.如何模拟数据库行为便是本篇的主题.微软有教程说明Moq E ...
- 设置队列中文件上的“X”号的点击事件+uploadLimit动态加1
目的:1.设置文件队列中“x”号的点击事件 2.每次删除服务器文件后,把uploadLimit + 1: 'onUploadSuccess': function (file, data, respon ...
- C# 面向对象4 构造函数
构造函数 1.构造函数用来创建对象,并且可以在构造函数中对对象进行初始化. (给对象的每个属性依次的赋值) 2.构造函数是用来创建对象的特殊方法: 1.方法名和类名一样. 2.没有返回值,连void都 ...
- 这38个小技巧告诉你如何快速学习MySQL数据库
1.如何快速掌握MySQL? ⑴培养兴趣兴趣是最好的老师,不论学习什么知识,兴趣都可以极大地提高学习效率.当然学习MySQL 5.6也不例外.⑵夯实基础计算机领域的技术非常强调基础,刚开始学习可能还认 ...