2017 全国多校第十场 训练日志

solve 2(310 / 634)

J题题意搞错一口大锅。

dzcH题结论猜对了,只是树上二分图不用匈牙利算法,能换成更高效的写法。

Array Challenge

高斯消元 + 矩阵快速幂

Monkeys

二分图结论

Schedule

优先队列

<qj>

题意:

有n个任务,给你开始时间和结束时间,有无数台机器,每台机器可以在同一时间最多处理一个任务,并且开机之后,只能关一次机,不能中途关机又开机。

问至少需要多少机器,在这么多台机器的情况下,最少花费多少。(花费 = 每台机器关机时间 - 开机时间 的和。)

思路:

1.对于至少需要多少台机器,用一个优先队列维护一下就可以求出。

2.求最少花费,需要再开一个优先队列,两个优先队列分别维护:最早未就绪机器,最迟已就绪机器。

3.我们把任务用最迟已就绪机器处理,一定最优。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
    int s,e;
    node(int s=0,int e=0):s(s),e(e){}
    friend bool operator < (node a,node b){
        if(a.s==b.s)return a.e>b.e;
        return a.s<b.s;
    }
}p[100005];
int n;

priority_queue<int,vector<int>,greater<int> >q;
priority_queue<int,vector<int>,less<int> >  qq;

int main(){
    int t;cin>>t;
    while(t--){
        while(!q.empty())q.pop();
        while(!qq.empty())qq.pop();
        int ans1=1;
        ll ans2=0;
        cin>>n;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&p[i].s,&p[i].e);
        }
        sort(p+1,p+1+n);
        q.push(p[1].e);
        for(int i=2;i<=n;i++){
            int val = q.top();
            if(val<=p[i].s){
                q.pop();q.push(p[i].e);
            } else {
                q.push(p[i].e);
                ans1 = max(ans1,(int)q.size());
            }
        }
        while(!q.empty())q.pop();
        for(int i=1;i<=ans1;i++)qq.push(0);

        for(int i=1;i<=n;i++){
            while(!q.empty() && q.top() <= p[i].s){
                qq.push(q.top());q.pop();
            }
            int val = qq.top();
            if(val==0)ans2-=p[i].s;
            qq.pop();
            q.push(p[i].e);
        }
        while(!q.empty()){
            ans2+=q.top();q.pop();
        }
        while(!qq.empty()){
            ans2+=qq.top();qq.pop();
        }
        cout<<ans1<<" "<<ans2<<endl;
    }
    return 0;
}

Two Paths

次短路

原文地址:https://www.cnblogs.com/dowhile0/p/9189924.html

时间: 2024-08-28 10:59:30

2017 全国多校第十场 训练日志的相关文章

2017全国多校第9场

一.HDU-6162 Ch's gift 思路:只要把主席树节点统计个数的意义改为累计所管辖区间的和就行了.剩下的部分就是裸的树上主席树了. #include<bits/stdc++.h> using namespace std; #define MAXN 100010 #define LOGN 20 #define MAXQ 100010 #define LL long long typedef struct { int to, next; } Edge; LL v[MAXN], dv[MA

2018湖南多校第八场 训练日志

solved 3 (7/22) 前缀和乱搞的题看成是模拟退火求最小费马点,很烦. C Permutations (子序列) D Travel Frog (dp + 公式) H Appositive Body (中心对称的结论) <qj> 题意:4维空间里n个点,是否能够中心对称. 首先利用所有点求出中心点的坐标,然后对于每个点,求出对应点的坐标,在set中查找是否存在. 所有的点都有对应点,那么存在. #include <cstdio> #include <iostream&

2014多校第十场1004 || HDU 4974 A simple water problem

题目链接 题意 : n支队伍,每场两个队伍表演,有可能两个队伍都得一分,也可能其中一个队伍一分,也可能都是0分,每个队伍将参加的场次得到的分数加起来,给你每个队伍最终得分,让你计算至少表演了几场. 思路 : ans = max(maxx,(sum+1)/2) :其实想想就可以,如果所有得分中最大值没有和的一半大,那就是队伍中一半一半对打,否则的话最大的那个就都包了. 1 #include <cstdio> 2 #include <cstring> 3 #include <st

2016 全国多校第二场 训练日志

solve 4 (131/582) A Acperience (解方程) E Eureka (几何点对相关) I It's All In The Mind (签到) K Keep On Movin (签到) L La Vie en rose (字符串hash) <qj> 思路: 正解可能是dp之类的,用hash字符串水了出来. 1.对于t串,hash成一个数字.  复杂度O(|t|) 2.对s进行一次滚动hash. 复杂度O(|s|) 3. 对于截取的一段ss,如果ss的hash值等于t的ha

多校第十场:HDU 4973 树状数组+前缀+二分

思路:比赛的时候看到这题感觉是线段树或者树状数组,但是因为要区间加倍,然后不知所措了,想了好久也不知道怎么把那个加倍的数怎么处理,然后就一直想第一道题了就没管这题了.虽然之前也做过这种类型的树状数组,不过这题确实是比较机智,把树状数组用得是非常爽. sum[i]是树状数组的前缀和,cnt[i]表示第i个数共有多少个数. 更新加倍过程:我们让(l,r)这个区间加倍的时候,二分树状数组找到l所对应的数,找到r对应的数,单点更新这两个数,为什么要单点更新这两个数呢?因为比如:1 1 1 2 2 2 3

2018多校第十场 HDU 6430 线段树合并

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6430 题意:一棵树上每个节点权值为v[i],每个节点的heard值是:以它为LCA的两个节点的GCD的最大值,要求输出每个节点的heard值. 题解:权值范围是[1, 1e5],1e5内数因子最多不超过200个,对每个点建一颗线段树,维护每个点的因子,dfs过程中由下往上合并线段树并更新答案. 1 #include <bits/stdc++.h> 2 using namespace std; 3

2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网

 2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/276712b113c6456c8cf31c5073a4f9d7来源:牛客网 牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度. 输入描述: 输入为两行字符串(可能包含空格),长度均小于等于50. 输出描述: 输出为一个整数,表示最长公共连续子串的长度. 输入例子: abcde abgde 输出例子

【题集】牛客网&#183;2018年全国多校算法寒假训练营练习比赛(第二场)

原文链接:2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 小鱼儿吐泡泡,嘟嘟嘟冒出来.小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o". 两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉. (是的你没看错,小气泡和大气泡不会产生任何变化的,原因我也不知道.) 例如:ooOOoooO经过一段时间

【杂题总汇】HDU多校赛第十场 Videos

[HDU2018多校赛第十场]Videos 最后一场比赛也结束了-- +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和看了这部电影会得到的快乐值.电影分成两种类型,若同一个人连续(不是时间连续,是顺序连续)看了两部相同类型的电影,他的快乐值会扣除W,数据保证扣除的值不超过电影增加的快乐值. 特别的,一个人换电影不花费时间,即若第一部电影的结束时间等于下一部电影的开始时间,是可以两场都看的:看电影必须看完:一部电影只能一个人看