洛谷P1878 舞蹈课 贪心 堆

Posted third2333

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P1878 舞蹈课 贪心 堆相关的知识,希望对你有一定的参考价值。

洛谷P1878 舞蹈课
贪心 堆

 1 #include <bits/stdc++.h>
 2 #define LL long long
 3 #define GG int
 4 #define For(i, j, k) for(register int i=j; i<=k; i++)
 5 #define Dow(i, j, k) for(register int i=j; i>=k; i--)
 6 using namespace std;
 7 inline GG read() {
 8     GG x = 0, f = 1;
 9     char ch = getchar();
10     while(ch<0||ch>9) { if(ch==-) f = -1; ch = getchar(); }
11     while(ch>=0&&ch<=9) { x = x*10+ch-48; ch = getchar(); }
12     return x * f;
13 }
14 void write(GG x) {
15     if(x<0) putchar(-), x = -x;
16     if(x>9) write(x/10);
17     putchar(x%10+48);
18 }
19 inline void writeln(GG x) { write(x); putchar(\n); }
20 
21 const int N = 2e5+11; 
22 struct node{
23     int l, r, del; 
24     friend bool operator <(node a, node b) {
25         if(a.del != b.del) return a.del > b.del; 
26         return a.l > b.l; 
27     }
28 };
29 priority_queue <node> Q; 
30 int n, tot;
31 int val[N], vis[N], L[N], R[N];  
32 char s[N]; 
33 
34 inline void work() {
35     while(!Q.empty()) {
36         node p = Q.top(); Q.pop(); 
37         if(vis[p.l] || vis[p.r]) continue; 
38         vis[p.l] = 1; vis[p.r] = 1; 
39         L[++tot] = p.l; R[tot] = p.r; 
40         
41         int l = p.l-1, r = p.r+1; 
42         while(l>=1 && vis[l]) --l; 
43         while(r<=n && vis[r]) ++r;
44         if(l>=1 && r<=n && s[l]!=s[r]) 
45             Q.push((node){l, r, abs(val[l]-val[r]) });  
46     }
47 }
48 
49 int main() {
50     n = read(); 
51     scanf("%s", s+1); 
52     For(i, 1, n) val[i] = read(); 
53     For(i, 1, n-1) 
54         if(s[i] != s[i+1]) 
55             Q.push((node){i, i+1, abs(val[i]-val[i+1])} ); 
56     work(); 
57     writeln(tot); 
58     For(i, 1, tot) {
59         write(L[i]); putchar( ); writeln(R[i]); 
60     }
61 }

 

以上是关于洛谷P1878 舞蹈课 贪心 堆的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P3620 [APIO/CTSC 2007] 数据备份 [堆,贪心,差分]

D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]

贪心算法舞蹈室的安排

舞蹈课

舞蹈课(dancingLessons)

[HNOI2010]取石头游戏(博弈论+贪心)