BZOJ 1293 生日禮物
阿新 • • 發佈:2019-02-18
我發現BZOJ的水題都比較高檔昂。這道題的基本思想是,每次用優先佇列把位置最靠前的顏色彈出來,並把與它顏色相同的下一個點的位置進佇列,每次更新最優長度。
1.初始化:每個點的下一個相同顏色點的位置。
2.將每個顏色的第一個點入佇列,算第一個狀態。
3.每次將佇列最前端的顏色彈出,將他的下一個點放入佇列,更新最優長度。
注:cmp函式、過載運算子有的時候需要加“const”“&”等奇怪的符號,一直都不太懂什麼意思,怎麼用,求神犇指教。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<utility> #include<queue> #define MAXN 1000010 #define INF (1<<30) using namespace std; int t[61],s[61]; struct node{ int first; int second; int next; node(){}; void init(int x,int y,int z){ first=x; second=y; next=z; } friend bool operator < (node a,node b){ return a.second>b.second; } }x[MAXN]; priority_queue<node> q; int main(){ s[0]=0; int n,k,l,r=0; scanf("%d%d",&n,&k); for(int i=1;i<=k;i++){ scanf("%d",&s[i]); s[i]=s[i]+s[i-1]; for(int j=s[i-1]+1;j<=s[i];j++) { int a; scanf("%d",&a); x[j].init(i,a,j+1); } } for(int i=0;i<k;i++) { r=max(r,x[s[i]+1].second); q.push(x[s[i]+1]); } int ans=r-q.top().second; while(1){ node tmp=q.top(); q.pop(); if(tmp.next-1<s[tmp.first]) { r=max(x[tmp.next].second,r); q.push(x[tmp.next]); } else break; tmp=q.top(); ans=min(r-tmp.second,ans); } printf("%d",ans); return 0; }