题目

传送门 to usOJ

题目描述

输入格式
第一行两个整数 n,rn,rn,r ,表示垃圾种类和垃圾桶数量为 nnn ,垃圾投放点是编号为 rrr 的垃圾桶。

第二行 nnn 个整数 a1,a2,a3,…,ana_1,a_2,a_3,\dots,a_na1​,a2​,a3​,…,an​ ,aia_iai​ 表示第 iii 个垃圾桶处理第 iii 种垃圾的时间。

接下来 n−1n-1n−1 行,每行两个数 x,y(x≠y)x,y(x\ne y)x,y(x​=y) ,表示有一条双向传送带连接编号为 xxx 和 yyy 的两个垃圾桶。

输出格式
输出一个整数,表示从开始投放垃圾到处理完所有垃圾的总时间。

数据范围与约定

思路

总的来说

只有停着的垃圾会挡路。所以我们只考虑,每个垃圾在哪里会停下来(无论是被别的垃圾挡住,还是正在处理)。

假设我们用 txt_xtx​ 来表示 xxx 号垃圾桶在 (tx+1)(t_x+1)(tx​+1) 秒空闲(也就是说,在 txt_xtx​ 秒及其以前,这里有一个垃圾停泊)我们就可以知道,第 iii 个垃圾到达第 iii 个垃圾桶的时间是

x=max⁡j∈path⁡(i,r)[tj+1+dist(i,j)]x=\max_{j\in\operatorname{path}(i,r)}\Big[t_j+1+\text{dist}(i,j)\Big]x=j∈path(i,r)max​[tj​+1+dist(i,j)]

这个式子的正确性是显然的——只有 j∈path(i,r)j\in\text{path}(i,r)j∈path(i,r) 会挡路,在 tj+1t_j+1tj​+1 秒到达了 jjj 号垃圾桶之后,还有 dist(i,j)\text{dist}(i,j)dist(i,j) 的路程。

然后我们存储一个深度 depthdepthdepth ,然后这个式子就可以写成

x=depth(i)+1+max⁡j∈path(i,r)[tj−depth(j)]x=depth(i)+1+\max_{j\in\text{path}(i,r)}\Big[t_j-depth(j)\Big]x=depth(i)+1+j∈path(i,r)max​[tj​−depth(j)]

这个式子感觉蛮可做的,告一段落。新来的垃圾 iii 只会产生 ti=x+ait_i=x+a_iti​=x+ai​ 的限制吗?

考虑 iii 的移动过程——如果它被 jjj 挡住了,它就会停止在 father(j)\text{father}(j)father(j) 的地方。它停止了!这是需要带来 ttt 的改变的。

显然,ttt 的改变遵循

∀j∈path(i,r),tfather(j)=tj\forall j\in\text{path}(i,r),t_{\text{father}(j)}=t_j∀j∈path(i,r),tfather(j)​=tj​

正确性是显然的——直到 tjt_jtj​ 时刻,iii 都停留在 father(j)\text{father}(j)father(j) 处。

然后还有一点,就是 tx′=max⁡txt'_x=\max t_xtx′​=maxtx​ 。每一次更新都是取最大值。

具体实现

对于限制的移动操作,我们可以不使用复制,而是在原有的基础上修改。

我们查询的是 max⁡j[tj−depth(j)]\max_{j}\Big[t_j-depth(j)\Big]maxj​[tj​−depth(j)] ,然而 depth[father(j)]=depth(j)−1depth[\text{father}(j)]=depth(j)-1depth[father(j)]=depth(j)−1 ,所以在 father(j)\text{father}(j)father(j) 上的 tjt_jtj​ 限制,可以完美的干掉 jjj 。

然后我们就可以用平衡树了。每个重链开一个平衡树,支持三种操作:

  • 区间修改:将 键值 减一。
  • 区间查询:查询区间最大值。
  • 插入:插入一个值。

然后你就只好手写了。复杂度是 O(nlog⁡2n)\mathcal O(n\log^2 n)O(nlog2n) 的——但是应该是达不到的。

代码

根节点的限制,每次都要增大一,不要忘记!

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
using namespace std;
inline int readint(){int x; scanf("%d",&x); return x;
}
# define int long long // stupid trick
# define MB template<class T>
MB void getMin(T &a,const T &b){ if(a > b) a = b; }
MB void getMax(T &a,const T &b){ if(a < b) a = b; }
# undef MB // 模板 const int MaxN = 100005;int n, m, a[MaxN], head[MaxN], cntEdge;
struct Edge{int to, nxt;Edge(int T=0,int N=0){to = T, nxt = N;}
} edge[MaxN<<1];void addEdge(int a,int b){edge[cntEdge] = Edge(b,head[a]);head[a] = cntEdge ++;edge[cntEdge] = Edge(a,head[b]);head[b] = cntEdge ++;
}
void input(){n = readint(), m = readint();for(int i=1; i<=n; ++i){head[i] = -1;a[i] = readint();}for(int i=1,x; i<n; ++i){x = readint();addEdge(x,readint());}
}int depth[MaxN], fa[MaxN], son[MaxN];
void getInfo(int x){static int size[MaxN] = {0};size[x] = 1, son[x] = 0;for(int i=head[x]; ~i; i=edge[i].nxt)if(edge[i].to != fa[x]){depth[edge[i].to] = depth[x]+1;fa[edge[i].to] = x;getInfo(edge[i].to);size[x] += size[edge[i].to];if(size[son[x]] < size[edge[i].to])son[x] = edge[i].to;}
}
int topChain[MaxN];
void chainSplit(int x,int tc){topChain[x] = tc;if(son[x] != 0) chainSplit(son[x],tc);for(int i=head[x]; ~i; i=edge[i].nxt)if(edge[i].to != son[x] and edge[i].to != fa[x])chainSplit(edge[i].to,edge[i].to);
}template<class T> struct Pair{T first, second;Pair(){ }Pair(const T &a,const T &b){first = a, second = b;}T& operator[](const int &x){if(x == 0) return first;else return second;} // 高档pair<T,T>:因为专一,所以专业
};
class Treap{struct Node{int id, data, maxV, prio;Pair<Node*> son; int lazy;Node(int ID,int DATA){id = ID, data = DATA;maxV = data-id, prio = rand();son[0] = son[1] = nullptr;}void pushUp(){maxV = data-id;for(int i=0; i<2; ++i)if(son[i] != nullptr)getMax(maxV,son[i]->maxV);}};void addNode(Node* o,int v){if(o == nullptr) return ;o->id += v, o->lazy += v, o->maxV -= v;}void pushDown(Node* o){if(o->lazy != 0){for(int i=0; i<2; ++i)addNode(o->son[i],o->lazy);o->lazy = 0;}}Node* root;Pair<Node*> split(Node* o,int X){if(o == nullptr) return Pair<Node*>(o,o);pushDown(o); int d = o->id <= X;auto p = split(o->son[d],X);o->son[d] = p[d^1], p[d^1] = o;o->pushUp(); return p;} // 小于等于X的分出来 Node* merge(Node* a,Node* b){if(a == nullptr) return b;if(b == nullptr) return a;pushDown(a), pushDown(b);if(a->prio < b->prio){b->son[0] = merge(a,b->son[0]);b->pushUp(); return b;}else{a->son[1] = merge(a->son[1],b);a->pushUp(); return a;}}int dispose(Node* o){ // return max(data)if(o == nullptr) return 0;int res = o->data;for(int i=0; i<2; ++i)getMax(res,dispose(o->son[i]));delete o; return res;}
public:void insert(int ID,int DATA){auto rp = split(root,ID);auto lp = split(rp[0],ID-1);getMax(DATA,dispose(lp[1]));lp[1] = new Node(ID,DATA);root = merge(merge(lp[0],lp[1]),rp[1]);}void add(int L,int R){auto rp = split(root,R);auto lp = split(rp[0],L-1);addNode(lp[1],-1); // 让深度减一 root = merge(merge(lp[0],lp[1]),rp[1]);}int Query(int L,int R){auto rp = split(root,R);auto lp = split(rp[0],L-1);int res = 0;if(lp[1] != nullptr)res = lp[1]->maxV;root = merge(merge(lp[0],lp[1]),rp[1]);return res;}int find(int ID){auto rp = split(root,ID);auto lp = split(rp[0],ID-1);int res = dispose(lp[1]); // 边查边删 root = merge(lp[0],rp[1]);return res; // return max(data)}
} tree[MaxN];
vector<pair<int,int>> path;
int work(int x){int res = 0; path.clear();for(int tc; x!=0; x=fa[tc]){tc = topChain[x];getMax(res,tree[tc].Query(depth[tc],depth[x]));path.push_back(make_pair(tc,x));}while(not path.empty()){auto it = path.back(); path.pop_back();x = it.first; int y = it.second;int sy = tree[x].find(depth[x]);if(sy != 0 and fa[x] != 0)tree[topChain[fa[x]]].insert(depth[fa[x]],sy);if(fa[x] == 0) tree[x].insert(depth[x],sy+1);tree[x].add(depth[x]+1,depth[y]);}return res;
}
void solve(){getInfo(m), chainSplit(m,m);int ans = 0;for(int i=1; i<=n; ++i){int g = work(i)+depth[i]+a[i]+1;getMax(ans,g); // finish at time "g"tree[topChain[i]].insert(depth[i],g);}printf("%lld\n",ans);
}signed main(){input(), solve();return 0;
}

[usOJ6169]垃圾分类相关推荐

  1. Java项目:垃圾分类查询管理系统(java+SSM+jsp+MySQL+bootstrap)

    源码获取:博客首页 "资源" 里下载! jsp+ssm(spring+springmvc+mybatis)+mysql实现的垃圾分类查询管理系统: 系统主要实现的功能有: 1:前端 ...

  2. TensorFlow搭建垃圾分类系统大师(免费领源码)

    人工智能是一个多学科交叉融合的领域,其包含机器学习.计算机视觉.自然语言处理等多个子领域,其中计算机视觉是应用最广泛的领域之一.大多数人熟悉的手机和相机中的人脸识别功能,就是人工智能子领域--计算机视 ...

  3. 华为云垃圾分类AI大赛三强出炉,ModelArts2.0让行业按下AI开发“加速键”

    9月20日,华为云人工智能大赛·垃圾分类挑战杯决赛在上海世博中心2019华为全联接大会会场顺利举办.经过近两个月赛程的层层筛选,入围决赛阵列的11支战队的高光时刻也如期而至.最终华为云垃圾分类挑战杯三 ...

  4. 百万奖金悬赏AI垃圾分类,就问你来不来?

    也许我们从来没有想过, 看似简单的垃圾分类居然给"聪明"的人类带来如此大的困扰 2019年7月1日,史称"最严格的垃圾分类法" <上海市生活垃圾管理条例& ...

  5. 还在纠结垃圾分类问题?带你用Python感受ImageNet冠军模型SENet的强大

    作者 | beyondma 转载自CSDN博客 本月1日起,上海正式开始了"史上最严"垃圾分类的规定,扔错垃圾最高可罚200元.全国其它46个城市也要陆续步入垃圾分类新时代.各种被 ...

  6. 上海居民被垃圾分类逼疯!这款垃圾自动分类器也许能帮上忙

    作者 | 视说君 来源 | 授权转载自视说AI(ID:techtalkai) 让垃圾自动分类 近期垃圾分类成为了一个热门话题,原来直接一次性扔掉的垃圾,现在都需要分门别类进行投放.从今年7月1日起,新 ...

  7. 高精度垃圾分类模型开发与硬件集成

    常听技术大佬侃侃而谈AI模型开发,小白不知从何开始? 自动驾驶车辆分割.智慧农业小麦计数.智能硬件垃圾分拣.智慧城市交通流量.结构化文字识别模型定制,这些在视觉.机器学习.OCR等领域具备广泛应用前景 ...

  8. 基于朴素贝叶斯的垃圾分类算法(Python实现)

    有代码和数据集的 https://blog.csdn.net/weixin_33734785/article/details/91428991 附有git库代码的 https://www.cnblog ...

  9. 基于SSM实现垃圾分类信息管理系统

    项目编号:BS-XX-069 开发工具:IDEA / ECLIPSE 数据库:MYSQL5.7 应用服务器:TOMCAT8.5.31 JDK: 1.8 开发技术:Spring+Springmvc+My ...

最新文章

  1. Part 2 — Making Sense of Smart Contracts
  2. 【单机实现系列】SCDPM2012实现数据保护
  3. 华为、阿里员工在听的英语资源,即将过期,请自取
  4. c#语言中的变量名,在C#中创建动态变量名
  5. c语言cin输入数组,C++基础:各种输入方法总结cin.get()、
  6. mie散射粒子消光系数 matlab代码,一种球形粒子GMie散射效率极值的算法
  7. php读写明华读卡器,rwCard 明华USBIC卡读卡器IC卡读写程序 - 下载 - 搜珍网
  8. 录屏软件|录屏软件下载|录屏软件哪个好用电脑无水印版
  9. 10种web前端开发可视化在线工具大全
  10. 人人都有个Handler原理讲解
  11. java中的打印_java中使用打印的方法
  12. 物联网技术:射频识别技术RFID解析
  13. Tab层切换02-兼容IE8和Chrome浏览器
  14. 点餐小程序【源码好优多】
  15. [线性dp]leetcode2327:知道秘密的人数(medium)
  16. ol中闪烁点动画的实现
  17. RHCE 第十一天 mail postfix dovecot SSL
  18. matlab逆变换法产生随机数_信号处理——生成给定分布随机数
  19. 计算机英语短文的总结,描写计算机的英语短文
  20. 制作CentOS系统启动盘(U盘)

热门文章

  1. 2023年5月DAMA-CDGA/CDGP数据治理认证开班啦,我要报名学习
  2. Java小游戏——捕鱼达人
  3. Kaggle Titanic Challenges 生存预测 数据预处理 模型训练 交叉验证 步骤详细解析
  4. C# winform 手写签名,流畅不卡顿,在触摸屏上也可以完美使用,自动保存签名至本地(附源码下载)
  5. CRS-4047: No Oracle Clusterware components configured.
  6. VPF:适用于 Python 的开源视频处理框架,加速视频任务、提高 GPU 利用率
  7. 五一出行玩得开心还不堵 都是看了这篇文章!
  8. AR502H-CN开发笔记67:将U盘格式化为FAT32格式
  9. saved_model_cli的使用
  10. 海尔微型计算机一键还原怎么操作,windows一键还原怎么使用?一键还原详细操作方法...