博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】4756: [Usaco2017 Jan]Promotion Counting
阅读量:5928 次
发布时间:2019-06-19

本文共 1304 字,大约阅读时间需要 4 分钟。

【题意】带点权树,统计每个结点子树内点权比它大的结点数。

【算法】线段树合并

【题解】对每个点建权值线段树(动态开点),DFS中将自身和儿子线段树合并后统计。

注意三个量tot,cnt,tots,细心查错。

#include
#include
#include
using namespace std;const int maxn=200010;int n,first[maxn],cnt,tot,tots,root[maxn],a[maxn],b[maxn],ans[maxn];struct edge{
int v,from;}e[maxn*2];void ins(int u,int v){tots++;e[tots].v=v;e[tots].from=first[u];first[u]=tots;}struct cyc{
int l,r,sum;}t[maxn*10];void insert(int l,int r,int &x,int y){ if(!x)x=++cnt;t[x].sum++; if(l==r)return;// int mid=(l+r)>>1; if(y<=mid)insert(l,mid,t[x].l,y); else insert(mid+1,r,t[x].r,y);}int merge(int x,int y){ if(!x||!y)return x^y;//1 t[x].l=merge(t[x].l,t[y].l); t[x].r=merge(t[x].r,t[y].r);//2 t[x].sum=t[t[x].l].sum+t[t[x].r].sum;//3 return x;}int ask(int left,int right,int k,int l,int r){ if(l<=left&&right<=r)return t[k].sum; else{ int mid=(left+right)>>1,sum=0; if(l<=mid)sum=ask(left,mid,t[k].l,l,r); if(r>mid)sum+=ask(mid+1,right,t[k].r,l,r); return sum; }}void dfs(int x){ insert(1,tot,root[x],a[x]); for(int i=first[x];i;i=e[i].from){ dfs(e[i].v); root[x]=merge(root[x],root[e[i].v]); } if(a[x]
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/7724293.html

你可能感兴趣的文章
重建索引提高查询效率
查看>>
6月11日数据结构——Huffman树
查看>>
iOS之08-核心语法
查看>>
微信公众平台开发(30)微信接口调用
查看>>
微信公众号教程(11)公众账号接收非文字消息 上
查看>>
英语学习路程和经验
查看>>
基于Spring Hibernate JPA的联表查询,不支持联合主键的表的count()方法
查看>>
1.2万事开头hello world+交互+getpass、sys模块初识
查看>>
20155229-付钰涵-分析自我技能延展到c语言学习状况
查看>>
modprobe kvm-intel
查看>>
sqlite3 C接口
查看>>
SQLSERVER-新建一个存储过程,生成某张表的所有INSERT语句
查看>>
task
查看>>
MMORPG服务器数值系统设计
查看>>
Celery ValueError: not enough values to unpack (expected 3, got 0)的解决方案
查看>>
关于 vue.config.js 文件的配置
查看>>
06 接口与内部类
查看>>
11 异常, 日志, 断言和调试
查看>>
从yum源下载软件包
查看>>
prototype 与 proto的关系是什么:
查看>>