给定一个序列,每次从序列中找一个长度最大的元素相同的片段,删除它. 如果长度相同,删除最靠左边的那个片段. 问,需要删几次. 用链表处理删除片段.对于删除之后两边又能连成一个片段的那种情况,用set记一下合并就好了. 就是如果这个片段被合并成另一片段了,那么优先队列取到这个的时候就直接pop掉. 本来用自定义的结构体实现的.看了大佬的博客,学会了pair的妙用. pair <a, b>若被排序, a是第一关键字,b是第二关键字. #include <bits/stdc++.h> u…
899E - Segments Removal 思路:priority_queue+pair 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mp make_pair #define mem(a,b) memset(a,b,sizeof(a)) ; int pre[N]; int nxt[N]; int col[N]; int num[N]; p…
[题目]E. Segments Removal [题意]给定n个数字,每次操作删除最长的连续相同数字(等长删最左),求全部删完的最少次数.n<=2*10^6,1<=ai<=10^9. [算法]并查集+堆 [题解]将序列的相同数字段压缩,全部插入堆.那么每次操作删除堆顶,并尝试合并堆顶的前驱和后继,能合并就重新插入堆中. 在支持删除的序列中找前驱和后继,是经典的并查集实现. 具体而言,fa[i]表示 i 点左边(含自身)最近的未被删除的点,即把删除了的点全部并入左侧第一个未被删除的点,那么…
题 OvO http://codeforces.com/contest/899/problem/E Codeforces Round #452 (Div. 2) - e 899E 解 用两个并查集(记为fa和ma), fa用于更新可以合并在一起的段,维护每个段的左端点,右端点,中间有多少个相同的值,和这个段的值得是什么, ma用于跳跃, 具体来说 例如 这组数据 标上序号(第三行是序号) 1.那么首先合并4个5(10-13),显然9所在的段和14所在的段不能合并 那么把13指向9( ma[13]…
题目 Vasya has an array of integers of length n. Vasya performs the following operations on the array: on each step he finds the longest segment of consecutive equal integers (the leftmost, if there are several such segments) and removes it. For exampl…
For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far. Input The first line of input contains a single int…
C. Heap Operations time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard output Petya has recently learned data structure named "Binary heap". The heap he is now operating with allows the following…
题目链接:http://codeforces.com/contest/948/problem/C 题目大意:给定长度n(n<=1e5),第一行v[i]表示表示第i堆雪的体积,第二行t[i]表示第1~i天的雪将要消融的体积,一堆雪如果消融到体积为0则消失,求每天消融的雪的体积. 解题思路:用优先队列,第i天就将v[i]+sum[i-1]放入优先队列中,然后初始消融量ans=t[i]*q.size(),假设每堆雪都够消融,然后根据优先队列找到q.top()<=sum[i]即不够消融的,减掉差值.…
<题目链接> 题目大意: 就是一道纯模拟题,具体模拟过程见代码. 解题分析:要掌握不同优先级的优先队列的设置.下面是对优先队列的使用操作详解: priority_queue<int>q 默认为大顶堆. priority_queue<int, vector<int>, less<int>> 大顶堆:表示其他都比堆顶小 priority_queue<int, vector<int>, greater<int>> 小…
题目链接 /* Name: Copyright: Author: Date: 2018/5/2 16:09:54 Description:优先队列 */ #include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <queue> using namespace std; ; int price[MAXN]; struct tshirt{ i…