Codeforce C. Pearls in a Row
2 seconds
256 megabytes
standard input
standard output
There are n pearls in a row. Let's enumerate them with integers from 1 to n from the left to the right. The pearl number i has the type ai.
Let's call a sequence of consecutive pearls a segment. Let's call a segment good if it contains two pearls of the same type.
Split the row of the pearls to the maximal number of good segments. Note that each pearl should appear in exactly one segment of the partition.
As input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to use scanf/printfinstead of cin/cout in C++, prefer to use BufferedReader/PrintWriter instead of Scanner/System.out in Java.
The first line contains integer n (1 ≤ n ≤ 3·105) — the number of pearls in a row.
The second line contains n integers ai (1 ≤ ai ≤ 109) – the type of the i-th pearl.
On the first line print integer k — the maximal number of segments in a partition of the row.
Each of the next k lines should contain two integers lj, rj (1 ≤ lj ≤ rj ≤ n) — the number of the leftmost and the rightmost pearls in the j-th segment.
Note you should print the correct partition of the row of the pearls, so each pearl should be in exactly one segment and all segments should contain two pearls of the same type.
If there are several optimal solutions print any of them. You can print the segments in any order.
If there are no correct partitions of the row print the number "-1".
5
1 2 3 4 1
1
1 5
5
1 2 3 4 5
-1
7
1 2 1 3 1 2 1
2
1 3
4 7
题意:给你一串数字,要你分段,要求每个段中至少有两个相同的数字,要你求最多能分多少段。
思路:贪心,从前面开始循环将出现的数字记录,然后遇到相同的就跳出,这就是一段,然后将前面记录的数字清空,重复前面的操作
这样符合最优原则,遇到有两个了相同的就分为一段。要注意最后一段。
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<cstdio>
6 #include<climits>
7 #include<math.h>
8 #include<queue>
9 #include<string.h>
10 #include<stack>
11 #include<vector>
12 #include<map>
13 #include<ext/hash_map>
14 #define sc(x) scanf("%I64d",&x)
15 #define pr(x) printf("%I64d",x);
16 #define prr(x) printf("%I64d\n",x);
17 #define prrr(x) printf(" %I64d",x);
18 #define FOR(i,p,q) for(int i=p;i<=q;i++)
19 int cmp(const void*p,const void*q);
20 using namespace std;
21 typedef long long ll;
22 typedef struct pp
23 {
24 int x;
25 int y;
26 int flag;
27 } ss;
28 ss bb[3*100005];
29 ss aa[6*100005];
30 ss dd[3*100005];
31 map<int,int>my;//用map记录是否前面出现了某个数字
32 ss rk[3*100005];
33 int main(void)
34 {
35 int n,i,j,k,p,q;
36 while(scanf("%d",&k)!=EOF)
37 {my.clear();
38 for(i=0; i<k; i++)
39 {
40 scanf("%d",&bb[i].x);
41 bb[i].x;
42 bb[i].y=i;
43 }
44 qsort(bb,k,sizeof(ss),cmp);//这里的离散化可以不需要,直接映射就可以了。
45 int cnt=0;
46 dd[bb[0].y].x=cnt;
47 dd[bb[0].y].y=bb[0].y;
48 for(i=1; i<k; i++)
49 {
50 if(bb[i].x!=bb[i-1].x)
51 {
52 cnt++;
53 }
54 dd[bb[i].y].x=cnt;
55 dd[bb[i].y].y=bb[i].y;
56 }
57 int fr=0;
58 int sum=0;
59 for(i=0; i<k; i++)
60 {
61 if(my[dd[i].x]==0)
62 {
63 my[dd[i].x]=1;
64 }
65 else if(my[dd[i].x])
66 {
67 sum++;
68 rk[sum].x=fr;
69 rk[sum].y=i;
70 fr=i+1;
71 my.clear();//有一段后清空映射,因为段不能相交
72 }
73 }
74 if(sum==0)
75 {
76 printf("-1\n");
77 }
78 else
79 {if(rk[sum].y!=k-1)//最后一段要特别注意,如果没到端尾,要到端尾
80 {
81 rk[sum].y=k-1;
82 }
83 printf("%d\n",sum);
84 for(i=1; i<=sum; i++)
85 {
86 printf("%d %d\n",rk[i].x+1,rk[i].y+1);
87 }
88 }
89 }
90 return 0;
91 }
92 int cmp(const void*p,const void*q)
93 {
94 ss*n=(ss*)p;
95 ss*m=(ss*)q;
96 return n->x-m->x;
97 }
Codeforce C. Pearls in a Row的更多相关文章
- Educational Codeforces Round 6 C. Pearls in a Row
Educational Codeforces Round 6 C. Pearls in a Row 题意:一个3e5范围的序列:要你分成最多数量的子序列,其中子序列必须是只有两个数相同, 其余的数只能 ...
- CodeForces - 620C Pearls in a Row 贪心 STL
C. Pearls in a Row time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 620C EDU C.Pearls in a Row ( set + greed )
C. Pearls in a Row There are n pearls in a row. Let's enumerate them with integers from 1 to n from ...
- codeforces C. Pearls in a Row map的应用
C. Pearls in a Row time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- C. Pearls in a Row
C. Pearls in a Row time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Educational Codeforces Round 6 C. Pearls in a Row set
C. Pearls in a Row There are n pearls in a row. Let's enumerate them with integers from 1 to n from ...
- 【32.26%】【codeforces 620C】Pearls in a Row
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- CF620C Pearls in a Row
CF620C Pearls in a Row 洛谷评测传送门 题目描述 There are nn pearls in a row. Let's enumerate them with integers ...
- CodeForces 620C Pearls in a Row
水题,每当出现重复就分割开来,最后留下的尾巴给最后一段 #include<cstdio> #include<cstring> #include<cmath> #in ...
随机推荐
- Spark3学习入门【基于Java】
Spark 是离线数据处理的一种大数据技术,和Flick相比数据处理要延后,因为Flick是实时数据处理,而Spark需要先读取数据到内存. Spark的库是基于Scala写的,虽然Scala也是运行 ...
- springcloud - alibaba快速上手 - 更新完毕
1.简单对比一下springcloud与springcloud-alibaba 2.准备知识 官网:https://nacos.io/zh-cn/ 查看cloud和springboot的对应关系 ht ...
- 学习java的第七天
一.今日收获 1.看完全学习手册上java关键字与标识符两节 2.了解了java的关键字与标识符 二.今日难题 1.基本都理解 三.明日目标 1.继续看完全学习手册上的内容 2.加油!
- 从分布式锁角度理解Java的synchronized关键字
分布式锁 分布式锁就以zookeeper为例,zookeeper是一个分布式系统的协调器,我们将其理解为一个文件系统,可以在zookeeper服务器中创建或删除文件夹或文件.设D为一个数据系统,不具备 ...
- haproxy动态增减主机与keepalived高级应用
一:本文将详细介绍haproxy的配置使用以及高级功能的使用,比如通过haproxy进行动态添加删除负载集群中的后端web服务器的指定主机,另外将详细介绍keepalived的详细配置方法.配置实例及 ...
- Linux环境下为普通用户添加sudo权限
系统环境:Centos6.5 1.背景: sudo是Linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部root命令的一个工具.Linux系统下,为了安全,一般来说我们操作都是在普通用户 ...
- 接下来一段时间会对大家进行网络通信的魔鬼训练-理解socket
引子 下一篇标题是<深入理解MQ生产端的底层通信过程>,建议文章读完之前.或者读完之后,再读一遍我之前写的<RabbitMQ设计原理解析>,结合理解一下. 我大学时流行过一个韩 ...
- [笔记] Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting
原文地址:https://arxiv.org/abs/2012.07436 源码地址:https://github.com/zhouhaoyi/Informer2020
- ciscn_2019_en_3
例行检查我就不放了,64位的程序放入ida中 可以看到s到buf的距离是0x10,因为puts是遇到\x00截止.而且题目没有限制我们s输入的数量,所以可以通过这个puts泄露出libc的基值 很明显 ...
- [BUUCTF]PWN——hitcontraining_magicheap
hitcontraining_magicheap 附件 步骤: 例行检查,64位程序,开启了nx和canary 本地试运行一下,经典的堆的菜单 64位ida载入,检索程序里的字符串的时候发现了后门 m ...