2809: [Apio2012]dispatching|splay启发式合并
2016-03-06 15:59
429 查看
倒着枚举每个忍者,找出他所在的集合中在总薪水<=M<=M的情况下最多能过雇佣的人数,让当前的忍者做管理者然后更新答案,再合并他与上级所在的集合。
发现splay的启发式合并的内存是O(nlog2n)O(nlog_{2}n)的,复杂度是O(nlog22n)O(nlog_{2}^2n)
发现splay的启发式合并的内存是O(nlog2n)O(nlog_{2}n)的,复杂度是O(nlog22n)O(nlog_{2}^2n)
[code]#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<set> #include<map> #include<iostream> #include<algorithm> #define ll long long #define N 1000005 using namespace std; int sc() { int i=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i*f; } ll sum ,l ,mx,ans; int root ,fa ,ch [2],w ,v ,b ,size ; int n,cnt; void push_up(int x) { size[x]=size[ch[x][0]]+size[ch[x][1]]+1; sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+v[w[x]]; } void rotate(int x,int &f) { int y=fa[x],z=fa[y],l,r; l=(ch[y][1]==x);r=l^1; if(z)ch[z][ch[z][1]==y]=x; ch[y][l]=ch[x][r],ch[x][r]=y; fa[ch[y][l]]=y;fa[y]=x;fa[x]=z; push_up(y),push_up(x); if(y==f)f=x; } void splay(int x,int &f) { while(x!=f) { int y=fa[x],z=fa[y]; if(y!=f) if(ch[y][0]==x^ch[z][0]==y)rotate(x,f);else rotate(y,f); rotate(x,f); } } void insert(int &x,int f,int p,int k) { if(!x) { w[x=++cnt]=p; fa[x]=f; size[x]=1; sum[x]=v[p]; splay(x,root[k]); return ; } insert(ch[x][v[p]>v[w[x]]],x,p,k); } int find(int x,ll mx) { if(!x)return 0; if(mx<sum[ch[x][0]])return find(ch[x][0],mx); int ans=size[ch[x][0]]; mx-=sum[ch[x][0]]; if(mx<v[w[x]])return ans; ans++,mx-=v[w[x]]; return ans+find(ch[x][1],mx); } void dfs(int x,int f) { if(!x)return; insert(root[f],0,w[x],f); dfs(ch[x][0],f); dfs(ch[x][1],f); //insert(root[f],0,w[x],f); } void merge(int x,int y) { if(size[root[x]]<size[root[y]])swap(root[x],root[y]); dfs(root[y],x); } int main() { n=sc(),mx=sc(); for(int i=1;i<=n;i++) b[i]=sc(),v[i]=sc(),l[i]=sc(),insert(root[i],0,i,i); for(int i=n;i;i--) { int x=find(root[i],mx); ans=max(ans,(ll)x*l[i]); if(i!=1)merge(b[i],i); } cout<<ans; return 0; }
相关文章推荐
- postgresql主备之the database system is starting up
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(57)-插件---ueditor使用
- 算法题目一:如果数组中数字重复最多的次数大于数组长度的一半,返回1,否则返回0
- n-1 个数中三个数乘积最大的最小公倍数
- sqlite3 笔记整理
- VS2015快捷键设置
- ZooKeeper架构及简介
- DeepLearning--Part3--Chapter16:Representation Learning(1) categories:
- 51nod 1347 旋转字符串
- JAVA帮助文档全系列说明
- Android实现后台每日定时更新操作实现知识点和思路
- 将txt文件内容导入sql server 数据库表中
- BigDecimal使用以及异常处理
- DeepLearning--Part2--Chapter6:Feedforward-Deep-Networks(1)
- Java类加载器
- Android UI优化
- 项目3:小试循环---(5)求m!
- Weblogic的Admin server进程将CPU消耗尽问题解决
- 表单与button问题
- BZOJ4170 极光(CDQ分治 或 树套树)