比较可惜昨天比赛的时候时间不够了,在比赛结束之后五分钟找出了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. 30 docker swarm service 的创建维护和水平拓展

    运行环境在上两篇文章中已经搭建 1. 创建一个service (与 docker run 类似 ,创建一个 container) docker service create --name demo b ...

  2. thinkcmf2.2 火狐浏览器图片上传以及谷歌图片上传打开稍慢

    对目录中 admin/themes/simplebootx/asset/plupload.html 文件 进行更改如下图:

  3. JavaSE--类加载器

    参考:http://www.importnew.com/6581.html Java 编译器会为虚拟机转换源指令.虚拟机代码存储在以 .class 为扩展名的类文件中,每个类文件都包含某个类或者接口的 ...

  4. 从西班牙、英国出租车与Uber之争,看共享打车未来发展趋势

    一种新事物.新服务的崛起,必然会损害传统事物和服务的既得利益.比如在电灯泡发明之初,煤油灯企业就将电灯泡专利收购并"雪藏"以维护自己的利益.而电商的崛起,也让传统的线下实体店受到严 ...

  5. 886C. Petya and Catacombs#墓室探险(set集合)

    题目出处:http://codeforces.com/problemset/problem/886/C 题目大意:很多墓穴之间有通道,探险家来回穿梭并记录日志 日志规则:第一次到该墓穴计时间t,0&l ...

  6. nginx 反向代理学习

    目录 nginx 反向代理学习 一.正向代理和反向代理的区别 1.1正向代理 1.2 反向代理 二.nginx反向代理的使用 nginx 反向代理学习 一.正向代理和反向代理的区别 正向代理代理客户端 ...

  7. Python的变量和注释

    变量 python的变量就像一个名字,一个变量对应一个内存地址.当我们定义一个变量时,Python解释器会在内存中开辟一片空间,用于存放各种数据(字符串.列表.元组.字典.对象....). 不同的变量 ...

  8. 扯下Python的super()

    注: Python 2.7.x 环境下 今晚搜东西无意中看到这篇Understanding Python super() with __init__() methods. 其实这篇老早就看过了, 不过 ...

  9. 吴裕雄--天生自然 PYTHON3开发学习:多线程

    import _thread import time # 为线程定义一个函数 def print_time( threadName, delay): count = 0 while count < ...

  10. Java之常见异常

    package com.atguigu.java1; import java.io.File;import java.io.FileInputStream;import java.util.Date; ...