比较可惜昨天比赛的时候时间不够了,在比赛结束之后五分钟找出了bug提交通过了。然并软;

首先这题说b数组的后一项要么等于前一项,要么等于前一项加一,而且如果a[i] == a[j] ,那么b[i] == b[j],所以如果a[i] == a[j],b[i]到b[j]这个区间的值都是一样的,可以看做一个整体;

那么这题要求的不就是2^(区间个数 - 1)吗;

刚看这题就觉得区间合并用并查集,但是当时思路不够清晰后来用了线段树ac掉了,今天就把两种方法的代码都贴上;

  • 线段树解法

    1102E - 22 GNU C++11 Happy New Year! 265 ms 9428 KB
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    const int INF = 0x3f3f3f3f;
    const int MOD = ;
    //这里的tree其实就是一个懒标记
    int tree[];
    map<int, int> mp;
    int n, m, L, R, cnt;
    //查询包含q的区间前端
    int queryHead(int l, int r, int id, int q) {
    if (tree[id] != ) {
    return tree[id];
    }
    int mid = l + r >> ;
    if (q <= mid) {
    return queryHead(l, mid, id << , q);
    } else {
    return queryHead(mid + , r, id << | , q);
    }
    }
    //把区间[L, R]的值修改为L;
    void update(int l, int r, int id) {
    if (l >= L && r <= R) {
    tree[id] = L;
    return;
    }
    int mid = l + r >> ;
    if (L <= mid) {
    update(l, mid, id << );
    }
    if (R > mid) {
    update(mid + , r, id << | );
    }
    }
    // 查询线段树中包含q的节点的区间末端
    int queryTail(int l, int r, int id, int q) {
    if (tree[id] != ) {
    return r;
    }
    int mid = l + r >> ;
    if (q <= mid) {
    return queryTail(l, mid, id << , q);
    } else {
    return queryTail(mid + , r, id << | , q);
    }
    }
    // 快速幂
    int quick_pow(int n, int m) {
    int ans = ;
    while (m) {
    if (m & ) {
    ans = 1LL * ans * n % MOD;
    }
    n = 1LL * n * n % MOD;
    m >>= ;
    }
    return ans;
    }
    int main() {
    scanf("%d", &n);
    for (int i = ; i <= n; i++) {
    scanf("%d", &m);
    L = mp.count(m) ? queryHead(, n, , mp[m]) : i;
    R = i;
    update(, n, );
    mp[m] = i;
    }
    int mx = -;
    for (int i = ; i <= n; i = queryTail(, n, , i) + ) {
    int k = queryHead(, n, , i);
    // 因为这题区间合并,这里的k得到的不是合并后的区间末端,只是线段树中的区间末端;所以要比较是否和上一个线段树区间属于同一区间
    if (k != mx) {
    mx = k;
    cnt++;
    }
    }
    printf("%d\n", quick_pow(, cnt - ));
    return ;
    }
  • 并查集解法
    1102E - 22 GNU C++11 Happy New Year! 171 ms 7100 KB
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    const int INF = 0x3f3f3f3f;
    const int MOD = ;
    int pre[], cnt;
    map<int, int> mp;
    int find(int id) {
    if (pre[id] == ) {
    return id;
    }
    return pre[id] = find(pre[id]);
    }
    int quick_pow(int n, int m) {
    int ans = ;
    while (m) {
    if (m & ) {
    ans = 1LL * ans * n % MOD;
    }
    n = 1LL * n * n % MOD;
    m >>= ;
    }
    return ans;
    }
    int main() {
    int n, m;
    scanf("%d", &n);
    for (int i = ; i <= n; i++) {
    scanf("%d", &m);
    int head = mp.count(m) ? find(mp[m]) : i;
    int tail = i;
    while (true) {
    int x = find(tail);
    if (x == head) {
    break;
    }
    pre[x] = head;
    tail = x - ;
    }
    mp[m] = i;
    }
    for (int i = n; i > ; i = find(i) - ) {
    cnt++;
    }
    printf("%d\n", quick_pow(, cnt - ));
    return ;
    }

CF-1102E-Monotonic Renumeration的更多相关文章

  1. 补题Codeforces 1102E. Monotonic Renumeration

    这个题还是不太懂,下面附上的是大佬的题解(https://zhanghuimeng.github.io/post/codeforces-1102e-monotonic-renumeration/) E ...

  2. 【Codeforces 1102E】Monotonic Renumeration

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 会发现如果a[i]=a[j] 那么b[i]~b[j]都是相同的,等于b[i] 而b[i]等于b[i-1]+1或者b[i] 有两种可能 所以对于 ...

  3. Codeforces J. Monotonic Renumeration(组合)

    题目描述: You are given an array consisting of nmonotonic renumeration as an array b consisting of \(n\) ...

  4. Codeforces Round #531 (Div. 3) E. Monotonic Renumeration (构造)

    题意:给出一个长度为\(n\)的序列\(a\),根据\(a\)构造一个序列\(b\),要求: ​ 1.\(b_{1}=0\) ​ 2.对于\(i,j(i\le i,j \le n)\),若\(a_{i ...

  5. Codeforces Round #531 (Div. 3) ABCDEF题解

    Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividin ...

  6. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  7. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  8. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  9. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  10. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

随机推荐

  1. springboot +Thymeleaf+UEditor整合记录

    1,ueditor官网下载:https://ueditor.baidu.com/website/download.html  下载相应的工具包和源码,ps:源码放到工程中 2,解压放到放到项目中,sp ...

  2. spring学习之依赖注入DI与控制反转IOC

    一 Ioc基础 1.什么是Ioc? Ioc(Inversion of Control)既控制反转,Ioc不是一种技术,而是一种思想,在Java开发中意味着将设计好的对象交给容器来进行控制,并不是像传统 ...

  3. Juniper srx新增接口IP,使PC直连srx(转)

    转自:https://www.jianshu.com/p/bc27134bde3d Juniper srx新增接口IP,使PC直连srx 2018.11.19 14:24:15字数 424 概述 需求 ...

  4. Ambiguous HTTP method Actions require an explicit HttpMethod binding for Swagger 2.0 异常

    网上看了很多关于此异常的解决方案,但是大多数都是不能用的,今天把正确的解决方案记录下来,以帮助需要的人 问题:有些接口没有设置HttpPost或HttpGet,非接口设置访问权限为private,控制 ...

  5. python使用进程池多进程时,如何打印错误信息

    一.说明 1.python进程池进行多进程运行时,如果有错误,该进程会直接跳过,并且不会打印错误信息. 2.如果需要了解到进程内的错误信息,此时就需要通过捕获异常来输出错误信息了. 二.具体方法如下: ...

  6. SQL查询出一个表数据插入到另一个表里

    下面两中方式都是将 srcTbl 的数据插入到 destTbl,但两句又有区别的: 方式一 (select into from)要求目标表(destTbl)不存在,因为在插入时会自动创建. selec ...

  7. JS 特效三大系列总结

    一. offset系列 1. offset系列的5个属性 1. offsetLeft : 用于获取元素到最近的定位父盒子的左侧距离 * 计算方式: 当前元素的左边框的左侧到定位父盒子的左边框右侧 * ...

  8. apache 伪静态配置 .htaccess

    htaccess语法教程apache服务器伪静态规则教程 虽然网上有很多教程,不过发现大部分都是抄袭一个人的,一点都不全,所以我想写一个简单的易于理解的教程,我学习.htaccess是从目录保护开始的 ...

  9. Python list 字符串 注册 登录

    #list #列表 python中 数组.array等都用列表 list表示#创建一个liststu = ['xiaoming','xiaoli','xiaohuang','alex','lily', ...

  10. kaggle——分销商产品未来销售情况预测

    分销商产品未来销售情况预测 介绍 前面的几个实验中,都是根据提供的数据特征来构建模型,也就是说,数据集中会含有许多的特征列.本次将会介绍如何去处理另一种常见的数据,即时间序列数据.具体来说就是如何根据 ...