比较可惜昨天比赛的时候时间不够了,在比赛结束之后五分钟找出了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
    1. #include "bits/stdc++.h"
    2. using namespace std;
    3. typedef long long LL;
    4. const int INF = 0x3f3f3f3f;
    5. const int MOD = ;
    6. //这里的tree其实就是一个懒标记
    7. int tree[];
    8. map<int, int> mp;
    9. int n, m, L, R, cnt;
    10. //查询包含q的区间前端
    11. int queryHead(int l, int r, int id, int q) {
    12. if (tree[id] != ) {
    13. return tree[id];
    14. }
    15. int mid = l + r >> ;
    16. if (q <= mid) {
    17. return queryHead(l, mid, id << , q);
    18. } else {
    19. return queryHead(mid + , r, id << | , q);
    20. }
    21. }
    22. //把区间[L, R]的值修改为L;
    23. void update(int l, int r, int id) {
    24. if (l >= L && r <= R) {
    25. tree[id] = L;
    26. return;
    27. }
    28. int mid = l + r >> ;
    29. if (L <= mid) {
    30. update(l, mid, id << );
    31. }
    32. if (R > mid) {
    33. update(mid + , r, id << | );
    34. }
    35. }
    36. // 查询线段树中包含q的节点的区间末端
    37. int queryTail(int l, int r, int id, int q) {
    38. if (tree[id] != ) {
    39. return r;
    40. }
    41. int mid = l + r >> ;
    42. if (q <= mid) {
    43. return queryTail(l, mid, id << , q);
    44. } else {
    45. return queryTail(mid + , r, id << | , q);
    46. }
    47. }
    48. // 快速幂
    49. int quick_pow(int n, int m) {
    50. int ans = ;
    51. while (m) {
    52. if (m & ) {
    53. ans = 1LL * ans * n % MOD;
    54. }
    55. n = 1LL * n * n % MOD;
    56. m >>= ;
    57. }
    58. return ans;
    59. }
    60. int main() {
    61. scanf("%d", &n);
    62. for (int i = ; i <= n; i++) {
    63. scanf("%d", &m);
    64. L = mp.count(m) ? queryHead(, n, , mp[m]) : i;
    65. R = i;
    66. update(, n, );
    67. mp[m] = i;
    68. }
    69. int mx = -;
    70. for (int i = ; i <= n; i = queryTail(, n, , i) + ) {
    71. int k = queryHead(, n, , i);
    72. // 因为这题区间合并,这里的k得到的不是合并后的区间末端,只是线段树中的区间末端;所以要比较是否和上一个线段树区间属于同一区间
    73. if (k != mx) {
    74. mx = k;
    75. cnt++;
    76. }
    77. }
    78. printf("%d\n", quick_pow(, cnt - ));
    79. return ;
    80. }
  • 并查集解法
    1102E - 22 GNU C++11 Happy New Year! 171 ms 7100 KB
    1. #include "bits/stdc++.h"
    2. using namespace std;
    3. typedef long long LL;
    4. const int INF = 0x3f3f3f3f;
    5. const int MOD = ;
    6. int pre[], cnt;
    7. map<int, int> mp;
    8. int find(int id) {
    9. if (pre[id] == ) {
    10. return id;
    11. }
    12. return pre[id] = find(pre[id]);
    13. }
    14. int quick_pow(int n, int m) {
    15. int ans = ;
    16. while (m) {
    17. if (m & ) {
    18. ans = 1LL * ans * n % MOD;
    19. }
    20. n = 1LL * n * n % MOD;
    21. m >>= ;
    22. }
    23. return ans;
    24. }
    25. int main() {
    26. int n, m;
    27. scanf("%d", &n);
    28. for (int i = ; i <= n; i++) {
    29. scanf("%d", &m);
    30. int head = mp.count(m) ? find(mp[m]) : i;
    31. int tail = i;
    32. while (true) {
    33. int x = find(tail);
    34. if (x == head) {
    35. break;
    36. }
    37. pre[x] = head;
    38. tail = x - ;
    39. }
    40. mp[m] = i;
    41. }
    42. for (int i = n; i > ; i = find(i) - ) {
    43. cnt++;
    44. }
    45. printf("%d\n", quick_pow(, cnt - ));
    46. return ;
    47. }

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. dozer

    1.简介 dozer是用来两个对象之间属性转换的工具,有了这个工具之后,我们将一个对象的所有属性值转给另一个对象时,就不需要再去写重复的set和get方法了. 2.如果两个类之间的属性有些属性意思一样 ...

  2. PAT Basic 1083 是否存在相等的差 (20) [hash映射,map STL]

    题目 给定 N 张卡⽚,正⾯分别写上 1.2.--.N,然后全部翻⾯,洗牌,在背⾯分别写上 1.2.--. N.将每张牌的正反两⾯数字相减(⼤减⼩),得到 N 个⾮负差值,其中是否存在相等的差? 输⼊ ...

  3. v-charts使用总结(随时补充)

    柱状图.折线图.环图的常用配置(配置连接地址https://v-charts.js.org/#/line) :data 绑定基本数据 { // 第一个参数为维度(就是横轴,例如时间),剩余为指标(就是 ...

  4. GetTextExtentPoint32

    /////////////////////////////////////////////////////////////// // 04FirstWindow.cpp文件 #include < ...

  5. Python程序中的进程操作--—--开启多进程

    Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...

  6. zabbix3.4--监控TCP十一种状态

    1.客户端自定义key[root@web01 /etc/zabbix/zabbix_agentd.d]#vim iotps.conf UserParameter=TCP_STATUS_ESTABLIS ...

  7. java去掉数字后面的0

    有些财务业务场景是需要把数字多余的0去掉的. 可以这么写 private String getRealData(BigDecimal num) { if (num == null) { return ...

  8. VS2010无法调试页面问题

    图片: VS2010报:未能将脚本调试器附加到计算机XXX上的进程iexplore.exe . 已附加了一个调试器”.启动调试失败. 解决:1.以管理员身份打开CMD; 2.运行:regsvr32.e ...

  9. tensorflow(二)

    使用图来表示计算任务 在被称之为session的上下文中执行图 使用tensor表示数据 通过变量来维护状态 使用feed和fetch可以为任意的操作复制或者从其中获取数据 tensorflow是一个 ...

  10. 在线好用的json转xml超级好用在线json与xml互相转换

    在线好用的json转xml超级好用在线json与xml互相转换 拿走不谢:http://www.yzcopen.com/json/jsonxmlformat