二次联通门 : luoguP1046

/*
这个题好难..... 由苹果树可知
这应该是个树结构的题
所以很自然的想到了用树链剖分来搞一下
连边 最后查询以1为根节点的子树的权值和... 从前闲的没事写着玩...
*/
#include <cstdio>
#define Max 3300 void read (int &now)
{
now = ;
char word = getchar ();
while (word > '' || word < '')
word = getchar ();
while (word >= '' && word <= '')
{
now = now * + word - '';
word = getchar ();
}
} static int Hight; struct Edge
{
int to;
int next;
}; int Edge_Count;
int edge_list[Max];
Edge edge[Max]; inline void AddEdge (int from, int to)
{
Edge_Count++;
edge[Edge_Count].to = to;
edge[Edge_Count].next = edge_list[from];
edge_list[from] = Edge_Count;
Edge_Count++;
edge[Edge_Count].to = from;
edge[Edge_Count].next = edge_list[to];
edge_list[to] = Edge_Count;
} struct Point
{
int size;
int deep;
int dis;
int father;
int tree_number;
int End;
}; struct Tree
{
int l;
int r;
int dis;
int Mid;
}; Tree tree[Max];
Point point[Max];
int Count; void Dfs_1 (int now, int father)
{
int pos = Count++;
point[now].father = father;
point[now].deep = point[father].deep + ;
for (int i = edge_list[now]; i; i = edge[i].next)
{
if (edge[i].to == father)
continue;
Dfs_1 (edge[i].to, now);
}
point[now].size = Count - pos;
} int tree_dis[Max]; void Dfs_2 (int now, int chain)
{
int pos = ;
point[now].tree_number = ++Count;
tree_dis[Count] = point[now].dis;
for (int i = edge_list[now]; i; i = edge[i].next)
{
if (point[edge[i].to].tree_number)
continue;
if (point[edge[i].to].size > point[pos].size)
pos = edge[i].to;
}
if (pos)
Dfs_2 (pos, chain);
for (int i = edge_list[now]; i; i = edge[i].next)
{
if (point[edge[i].to].tree_number)
continue;
Dfs_2 (edge[i].to, edge[i].to);
}
point[now].End = Count;
} void Tree_Build (int l, int r, int now)
{
tree[now].l = l;
tree[now].r = r;
if (l == r)
{
tree[now].dis = tree_dis[++Count] <= ( + Hight) ? : ;
return ;
}
tree[now].Mid = (l + r) >> ;
Tree_Build (l, tree[now].Mid, now << );
Tree_Build (tree[now].Mid + , r, now << | );
tree[now].dis = tree[now << ].dis + tree[now << | ].dis;
} int Tree_Query (int l, int r, int now)
{
if (tree[now].l == l && tree[now].r == r)
return tree[now].dis;
if (r <= tree[now].Mid)
return Tree_Query (l, r, now << );
else if (l > tree[now].Mid)
return Tree_Query (l, r, now << | );
else
return Tree_Query (l, tree[now].Mid, now << ) + Tree_Query (tree[now].Mid + , r, now << | );
} int main (int argc, char *argv[])
{
for (int i = ; i <= ; i++)
read (point[i].dis);
read (Hight);
for (int i = ; i < ; i++)
AddEdge (i, i + );
Count = ;
Dfs_1 (, );
Count = ;
Dfs_2 (, );
Count = ;
Tree_Build (, , );
printf ("%d", Tree_Query (point[].tree_number, point[].End, ));
return ;
}

luogu P1046 陶陶摘苹果的更多相关文章

  1. 洛谷——P1046 陶陶摘苹果

    https://www.luogu.org/problem/show?pid=1046 题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有 ...

  2. Luogu P1478 陶陶摘苹果

    Luogu P1478 陶陶摘苹果(升级版) 题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2 ...

  3. 洛谷P1046 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 101010 个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个 303030 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳 ...

  4. P1046 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出1010个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3030厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在 ...

  5. P1046 陶陶摘苹果 Python实现

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出1010个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3030厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在 ...

  6. [模拟]P1046 陶陶摘苹果

    陶陶摘苹果 ## 题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试 ...

  7. 题解【洛谷P1046】[NOIP2005普及组] 陶陶摘苹果

    [NOIP2005] 陶陶摘苹果 首先,我们用一个数组s[11]存储每个苹果的高度. 然后,用a表示陶陶的身高. 接着,用a+30与s[i]比较,大于则计数器加一. 最后,输出计数器的值即可. #in ...

  8. 洛谷 P1478 陶陶摘苹果(升级版)【贪心/结构体排序/可用01背包待补】

    [链接]:https://www.luogu.org/problemnew/show/P1478 题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他 ...

  9. 武汉科技大学ACM:1007: 陶陶摘苹果

    Problem Description 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹 ...

  10. 洛谷-陶陶摘苹果(升级版)-BOSS战-入门综合练习1

    题目描述 Description 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同 ...

随机推荐

  1. Roads in the Kingdom CodeForces - 835F (直径)

    大意: 给定一个基环树, 求删除一条环上的边使得直径最小. 直径分两种情况 环上点延伸的树内的直径 两个环上点的树内深度最大的点匹配 第一种情况直接树形dp求一下, 第二种情况枚举删除的环边, 线段树 ...

  2. 【SQL Server数据迁移】32位的机器:SQL Server中查询ORACLE的数据

    从SQL Server中查询ORACLE中的数据,可以在SQL Server中创建到ORACLE的链接服务器来实现的,但是根据32位 .64位的机器和软件,需要用不同的驱动程序来实现. 在32位的机器 ...

  3. .NET Core AvaloniaUI实现多语言国际化

    AvaloniaUI是一个基于.Net Core的跨平台桌面程序UI框架,如果使用AvaloniaUI有多语言国际化的朋友可以参考我这篇文章: 这篇文章可以帮助你: 根据用户系统设置的语言改变UI显示 ...

  4. JS基础_强制类型转换-Number

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Linux虚拟机设置静态ip

    二.设置静态ip dhclient 动态分配ip 修改 ifcfg-ens33网卡配置文件  静态分配ip dhclient -r (释放动态分配的ip地址) vi /etc/sysconfig/ne ...

  6. 【SP1811】 LCS - Longest Common Substring(后缀自动机)

    题目链接 对第一个串建出\(SAM\),然后用第二个串去匹配. 如果能往下走就往下走,不能的话就跳parent tree的父亲,直到能走为止.如果跳到\(0\)了还是不能走,重新匹配. #includ ...

  7. CSS 实现盒子水平居中、垂直居中和水平垂直居中的方法

     CSS 实现盒子模型水平居中 水平居中效果图如下: HTML: CSS 全局样式: 方法一:使用margin: 0 auto;(只适用于子盒子有宽的时候) 方法二:text-align + disp ...

  8. Vue中v-model解析、sync修饰符解析

    上善若水,水善利萬物而不爭.——<道德經> 简介 在平时开发是经常用到一些父子组件通信,经常用到props.vuex等等,这里面记录另外的三种方式v-model.sync是怎么使用,再说是 ...

  9. Sqlite常用命令及基本知识

      sqlite菜鸟教程:http://www.runoob.com/sqlite/sqlite-tutorial.html   常用命令: .sqlite3 --从dos命令模式进入sqlite命令 ...

  10. MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK(转)

    1 引擎说明 本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来实现. 有点类似Oracle中的 数据库链接(DBLINK). 要允许这个存储引擎, 当 ...