5179: [Jsoi2011]任务调度


Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 5  Solved: 4
[Submit][Status][Discuss]

Description


一台超级计算机共有N颗CPU。现在这台超级计算机有M个任务要做,但同时还要考虑到不能让CPU过热。所幸的是这
台超级计算机已经将任务安排好了,现在要做的只是请你根据安排好的指令来模拟它的工作过程。一开始,这N颗C
PU都没有被分配任何的任务。之后,会给你以下几类指令(CPU的编号为1到N的整数,任务的编号为1到M的整数)
指令格式     作用
ADD n k w    将 k 号任务(权值为 w)分配给 n 号 CPU
DEC n k w    将 k 号任务的权值减少 w(已知 k 号任务被分配给了 n 号 CPU)
TRANS n1 n2  将分配给 n1 号 CPU 的任务全部转移给 n2 号 CPU
MIN n        输出分配给 n 号 CPU 的任务中权值最小的任务的权值
WORK n w     将分配给 n 号 CPU 的任务中权值最小的任务的权值加上 w,
如果权值最小的任务不唯一,则不更改权值,并输出一行“ ERROR”
 

Input


包含N+1行。
第1行包含三个正整数N、M、K,分别表示CPU的数目、任务数和指令数。
第2行到N+1行,每行包含一条指令。
N≤500, M≤300000, K≤300000。
保证任务的权值在 32 位有符号整型的范围内。
保证一个任务只会被分配一次(即至多被 ADD 一次)。
保证 ADD 指令、DEC 指令和 WORK 指令中的 w 是非负整数。
保证 TRANS 指令的两个参数不相同。
 

Output


若干行,其中包括MIN语句的输出和“ERROR”输出,每个输出占一行
 

Sample Input


ADD
ADD
MIN
WORK
TRANS
MIN
ADD
TRANS
MIN
DEC
MIN
DEC
WORK

Sample Output



-
ERROR

分析:


裸裸的可并堆题,用左偏树乱搞即可

 

代码:


# include <iostream>
# include <cstdio>
# include <algorithm>
using namespace std;
const int N = 3e5 + ;
int d[],n,m,k;
struct node{
int w,d,lc,rc,fa;
}t[N];
int merge(int x,int y)
{
if(!x)return y;
if(!y)return x;
if(t[x].w > t[y].w)swap(x,y);
t[x].rc = merge(t[x].rc,y);
t[t[x].rc].fa = x;
if(t[t[x].rc].d > t[t[x].lc].d)swap(t[x].rc,t[x].lc);
t[x].d = t[t[x].rc].d + ;
return x;
}
void erase(int x,int y,int z)
{
int u = merge(t[y].lc,t[y].rc),g = t[y].fa;
if(d[x] == y)d[x] = u;
if(t[g].lc == y)t[g].lc = u;
else if(t[g].rc == y)t[g].rc = u;
t[u].fa = g;t[y].lc = t[y].rc = t[y].fa = t[y].d = ;
t[y].w += z;
d[x] = merge(d[x],y);
}
int main()
{
scanf("%d %d %d",&n,&m,&k);char ch[];int x,y,z;
while(k--)
{
scanf("%s",ch);
if(ch[] == 'A')
{
scanf("%d %d %d",&x,&y,&z);
t[y].w = z;
d[x] = merge(d[x],y);
}
if(ch[] == 'D')
{
scanf("%d %d %d",&x,&y,&z);
erase(x,y,-z);
}
if(ch[] == 'T')
{
scanf("%d %d",&x,&y);
d[y] = merge(d[x],d[y]);
d[x] = ;
}
if(ch[] == 'M')
{
scanf("%d",&x);
printf("%d\n",t[d[x]].w);
}
if(ch[] == 'W')
{
scanf("%d %d",&x,&y);
bool flag = true;int l = t[d[x]].lc,r = t[d[x]].rc;
if(l && t[l].w == t[d[x]].w)flag = false;
if(r && t[r].w == t[d[x]].w)flag = false;
if(flag)erase(x,d[x],y);
else puts("ERROR");
}
}
}

[Bzoj5179][Jsoi2011]任务调度(左偏树)的更多相关文章

  1. BZOJ 1455 罗马游戏 ——左偏树

    [题目分析] 左偏树的模板题目,大概就是尽量维护树的深度保持平衡,以及尽可能的快速合并的一种堆. 感觉和启发式合并基本相同. 其实并没有快很多. 本人的左偏树代码自带大常数,借鉴请慎重 [代码] #i ...

  2. 【BZOJ-1455】罗马游戏 可并堆 (左偏树)

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1355  Solved: 561[Submit][Status][Discuss] ...

  3. 【bzoj2809】[Apio2012]dispatching 左偏树

    2016-05-31  15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...

  4. zoj 2334 Monkey King/左偏树+并查集

    原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1389 大致题意:N只相互不认识的猴子(每只猴子有一个战斗力值) 两只 ...

  5. POJ3016-K-Monotonic(左偏树+DP)

    我觉得我要改一下签名了……怎么会有窝这么啰嗦的人呢? 做这题需要先学习左偏树<左偏树的特点及其应用> 然后做一下POJ3666,这题的简单版. 思路: 考虑一下维护中位数的过程原数组为A, ...

  6. POJ3666-Making the Grade(左偏树 or DP)

    左偏树 炒鸡棒的论文<左偏树的特点及其应用> 虽然题目要求比论文多了一个条件,但是……只需要求非递减就可以AC……数据好弱…… 虽然还没想明白为什么,但是应该觉得应该是这样——求非递减用大 ...

  7. bzoj 1455: 罗马游戏 左偏树+并查集

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 668  Solved: 247[Submit][Status] Descriptio ...

  8. 左偏树(Leftist Heap/Tree)简介及代码

    左偏树是一种常用的优先队列(堆)结构.与二叉堆相比,左偏树可以高效的实现两个堆的合并操作. 左偏树实现方便,编程复杂度低,而且有着不俗的效率表现. 它的一个常见应用就是与并查集结合使用.利用并查集确定 ...

  9. 黄源河《左偏树的应用》——数字序列(Baltic 2004)

    这道题哪里都找不到. [问题描述] 给定一个整数序列a1, a2, … , an,求一个不下降序列b1 ≤ b2 ≤ … ≤ bn,使得数列{ai}和{bi}的各项之差的绝对值之和 |a1 - b1| ...

随机推荐

  1. js函数中获得当前被点击元素

    问题描述:在html页面中点击<a>或者’按钮‘,进入js中的函数,在js函数中获得被点击那个<a>或‘按钮’元素 解决方法:方法一: html中: <a>标签:& ...

  2. DROP SCHEMA - 删除一个模式

    SYNOPSIS DROP SCHEMA name [, ...] [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP SCHEMA 从数据库中删除模式. 模式只能被 ...

  3. python基础一 day5 集合

    集合是无序的 增:add()添加进去是无序,不一定是最后面,update()像extend() 删: 没有改,有查,里面的元素是不可变类型 查用for in 交集: 并集: 反交集 叉集: 子集与超集 ...

  4. COM技术开发(一)

    COM :基本的接口(IX,IY), 组件的实现(CA),以及对组件的调用 #include "pch.h" #include <iostream> #include ...

  5. OPENCV3 命名空间等变化

    CV_VERSION 表示的opencv的版本号 命名空间变化:  可以通过增加 #include <cv.h> 解决 1 直接去掉CV_ 前缀 1) nameWindow 函数    C ...

  6. Java练习demo 20190402 优惠券扣减

    实体类: package org.jimmy.autosearch2019.pojo; import java.math.BigDecimal; public class TestEntity2019 ...

  7. Android Studio集成crashlytics后无法编译的问题

    http://blog.csdn.net/zhuobattle/article/details/50555393 问题描述: 在用fabric集成后编译出现如下错误, Error:Cause: hos ...

  8. QT+创建两个不相干的窗口实现一个显示一个不显示

    因为两个窗口互不相干,所以需要重新创建一个窗口类subWidget subWidget.cpp文件 #ifndef SUBWIDGET_H #define SUBWIDGET_H #include & ...

  9. DP || HYSBZ 1207 打鼹鼠

    n*n的网格,有m个鼹鼠,t时间会有一只鼹鼠出现在(x,y)点处,如果机器人也在这个点就可以打到鼹鼠 机器人初始位置任意,每秒可以移动一格,问最多打到多少鼹鼠 *解法:f[i]表示前i只鼹鼠打了多少个 ...

  10. 小程序01 微信小程序介绍和开发准备

    前言 火爆的微信小程序:跳一跳.摩拜单车.美柚.大众点评.滴滴出行 背景 为什么会有小程序? 微信最早推出公众号和服务号,公众号和服务号所传播的网页经常出现加载缓慢甚至页面空白的情况. 微信小程序的诞 ...