Problem E: 穷游中国在统题 优先队列 + 模拟

http://www.gdutcode.sinaapp.com/problem.php?cid=1049&pid=4

Problem E: 穷游中国在统题

Description

Travel_poorly队是广工大目前最年轻的金牌队伍,队内成员分别是tmk、YFQ、Maple。这天他们接到教练的order要给新生杯统题,统题是个不轻松的工作,要评估各个题目的难度,设计出一套有梯度的套题,使得做题的情况有区分度。tmk很快想出了解决的办法,他给每道题目都设置了一个难度值,然后按照难度值进行筛选题目,这时候他发现难度值刚开始有可能是无序的,于是他决定要让全部题目都按照难度值从小到大排好序。 这时候YFQ说让他来排序,排序是一个展现算法魅力的过程,他要通过一种有趣的方法来给题目的难度值排序: 首先他把题目划分成很多组,每组的题目都是连续的,例如某一组包含从i到j的题目,那么这一组包含的是第i,i+1,i+2,i+3,...,j题。 这样每道题都属于某一个组,然后他再到组内把题目按照难度值进行从小到大排序。 当每个组内都进行排序之后,最终全部题目的难度值将按照从小到大的顺序排列好。 我们知道每一组里面的题目越多,排序的压力就越大,所以Maple提出一个合理的要求,就是让每个组里面的题目数量尽可能的少,聪明的ACMer,你知道Travel_poorly一共要分出多少个组吗?

Input

第一行是一个整数t ( t<= 10 ),表示有t组数据。在每组数据中: 第一行是一个整数n ( n<=1000 00 ),表示题目的总数; 第二行是n个整数A1,A2,A3...An ( 0<=Ai<= 1000 000 000),表示每道题目的难度值

Output

对于每组数据,输出一个正整数,表示一共要分出多少个组能满足Travel_poorly的要求,每两组样例之间输出一个空行。

Sample Input

2 5 3 2 5 4 6 5 5 4 3 2 1

Sample Output

3 1

HINT

[Submit][Status][Web Board]

考虑下这个列子吧

2 4 1 3 5

2 4 1 5 3

首先它的数字不是1--n的,而且可能重复。

那么就离散化吧。把他们离散到1--n中。注意,如果数字是2、1、5、4、2

那么离散后的结果是2、1、5、4、3,总是要把她们离散到1---n

至于怎么离散,如果离散成2、1、5、4、2很容易,就是排序 + lowerbound

那么用book[val]表示这个数字出现了多少次,加上权值就可以了。

至于为什么我要离散成这样。就是因为其实这题每次都是要把最小的数字归位。

比如样例1,一开始我肯定是要让最小的那个数字,就是1,归位的吧,所以区间数字的数量最小都是3.

然后归位的时候发现途中有一个4,所以区间数字的数量要更改为4.(如果a[4]是5,那么就要变成5)

然后就在剩下的数字中,(现在只身下5)去找一个最小的数字归位。

其实就是模拟题,只不过每次必须的任务是把最小的数字归位。

离散成这样的目的是相对大小很明显,知道需要比较到那一位数字。

复杂度是O(nlogn)的

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 100000 + 20;
int b[maxn];
int a[maxn];
int book[maxn];
bool vis[maxn];
struct node {
    int val, pos;
    bool operator < (const struct node & rhs) const {
        if (val != rhs.val) return val > rhs.val;
        else return pos > rhs.pos;
    }
};
priority_queue<struct node>que;
void work() {
    while (!que.empty()) que.pop();
    memset(book, 0, sizeof book);
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &b[i]);
        a[i] = b[i];
    }
    sort(b + 1, b + 1 + n);
    for (int i = 1; i <= n; ++i) {
        a[i] = lower_bound(b + 1, b + 1 + n, a[i]) - b;
        book[a[i]]++;
        a[i] += book[a[i]] - 1;
    }
//    for (int i = 1; i <= n; ++i) {
//        printf("%d ", a[i]);
//    }
//    printf("\n");
    memset(vis, false, sizeof vis);
    for (int i = 1; i <= n; ++i) {
        struct node t;
        t.pos = i;
        t.val = a[i];
        que.push(t);
        assert(vis[a[i]] == false);
        vis[a[i]] = true;
    }
    int ans = 0;
    int lef = -inf;
    int be = 1;
    while (!que.empty()) {
        struct node t = que.top();
        que.pop();
        if (t.pos <= lef) continue;
        lef = t.pos;
        int mx = -inf;
        while (true) {
            int tmx = mx;
            for (int i = be; i <= lef; ++i) {
                mx = max(a[i], mx);
            }
            if (tmx == mx) {
                be = mx + 1;
                lef = mx;
                break;
            }
            be = lef + 1;
            lef = mx;
        }
        ans++;
    }
    cout << ans << endl;
}

int main() {
#ifdef local
    freopen("data.txt", "r", stdin);
//    freopen("data.txt", "w", stdout);
#endif
    int t;
    scanf("%d", &t);
    while (t--) {
        work();
        if (t) printf("\n");
    }
    return 0;
}

时间: 2024-10-23 05:55:26

Problem E: 穷游中国在统题 优先队列 + 模拟的相关文章

穷游中国在统题

穷游中国在统题 Description Travel_poorly队是广工大目前最年轻的金牌队伍,队内成员分别是tmk.YFQ.Maple.这天他们接到教练的order要给新生杯统题,统题是个不轻松的工作,要评估各个题目的难度,设计出一套有梯度的套题,使得做题的情况有区分度.tmk很快想出了解决的办法,他给每道题目都设置了一个难度值,然后按照难度值进行筛选题目,这时候他发现难度值刚开始有可能是无序的,于是他决定要让全部题目都按照难度值从小到大排好序. 这时候YFQ说让他来排序,排序是一个展现算法

蚂蜂窝VS穷游最世界-自由行类App分析

更多内容请关注博客: http://www.china10s.com/blog/?p=150 一.产品概述 体验环境: 机型:iPhone 6 型号:64G版 系统:iOS9.2 蚂蜂窝APP版本:7.4.3 最世界APP版本:1.9.4 体验时间:20160327--20160330   地铁上.公交上.回家.上班.走路中 产品简介: 随着收入水品不断提高,人们对于旅游的需求也越来越旺盛.而自由行作为一种新型的旅游方式,以其可自定义行程的特点,为游客提供了更加个性化的旅游项目,深得游客们的青睐

HDU 4910 HDOJ Problem about GCD BestCoder #3 第四题

首先 m = 1 时 ans = 0对于 m > 1 的 情况 由于 1 到 m-1 中所有和m互质的数字,在 对m的乘法取模 运算上形成了群 ai = ( 1<=a<m && gcd(a,m) == 1 ) 所以 对于 a 必然存在b = a^(-1) = inv(a) 使得 a * b = 1 (mod m) 这里存在两种情况 a != b 那么最后的连乘式中a b均出现一次,相乘得1 a == b 那么最后的连乘式中只出现一个a 实际上所有 a = inv(a) 的

【谜院群】2017年4月14日天穷主擂谜会题

[谜院群]2017年4月14日天穷主擂谜会题 1.挥金邀朋游青天(月份口诀表三句/不连)一月大 二月平 十月大2.自从减肥反弹后,泪水常常挂面腮(网球术语二,5+2)打重复落点 长盘3.画中古人独赏月(嵌目)胡奋4.镐京兵败已是事实(拼音输入错误)西安输成现5.“杏花吹满头”(知名红学家)曲沐6.嬴荡故去,乃八子所期(离合字)王亡月望7.“飞梅弄晚”(明人)王木8.暮年洪武帝真厉害(5字人物比较语,含带姓俗称,粉底)老朱重八磅(棒)9.“离肠未语先断”(3字网络小说主角连相貌评价)杨明 丑10.

狮城五日穷游攻略(上)

原文链接:http://chengyuanlaodao.com/chatter/狮城五日穷游攻略_上/ 前几天有个朋友来新加坡玩,让我帮他安排一下行程.他刚工作不久,预算不太充裕,所以帮他做了这篇穷游攻略.高富帅不差钱的请自觉点右上角的红叉叉. 首先列出最后的花销列表(两人),单位是软妹币:签证 300机票 3700 (酷航南京往返)住宿五晚 1200各类门票 1290 (包含环球影城 动物园 摩天轮 海洋馆 时光之翼)交通费+手机费+吃喝 1000 签证新加坡现在不允许个人游客自己去办旅游签证

580 穷游澳洲旅游攻略

穷游澳洲(凯恩斯-悉尼,南昌出发)九日攻略 签证 因为觉得澳洲一次玩不够,所以直接办了3年多次的签证. 虽然旅行社要求有2次以上的发达国家签证记录,但其实我只有1次也成功出签了. 大交通 国内 (580)国内的话, 直接用中航国际空, 580的售价是不是超实惠,像这样的特价航班并不多见,这次特别感谢好惠付公众号,对于心怀诗和远方的驴友们最好就是经常关注一些优惠网站或者公众号.这次选择清明节请3休8前往悉尼,拿到含税2500的价格, T舱. 查了下HGH-SYD的距离, 7000公里,按照去年的T

带你穷游阿里云,寻找阿里云最省钱网站建设攻略!

有人发最省钱旅游攻略,有人发最省钱美味饭功略,有人发最省钱购物攻略~今儿,小编就发一个穷游阿里云,最省钱网站建设攻略! 这篇文章主要给已经在或者准备在阿里云混迹的站长们传授下如何能够在阿里云各种淘,花最少的钱搭建并且装扮自己的网站~ 这里以搭建phpwind社区论坛为例. 准备工作: 1. 获取phpwind安装包(加商业授权) http://market.aliyun.com/products/55586021/cmjz000388.html 重点介绍下商业授权,站长们都知道phpwind是开

poj 1005:I Think I Need a Houseboat(水题,模拟)

I Think I Need a Houseboat Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 85149   Accepted: 36857 Description Fred Mapper is considering purchasing some land in Louisiana to build his house on. In the process of investigating the land,

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分