傳送門
文章目錄
題意:
思路:
針灸思維不行,數據結構來湊唄。
一開始做的時候想簡單了,一直wawawa,后來想到了hackhackhack樣例,開始換思路構造,結果死活想不到O(m)O(m)O(m)怎么構造,所以用堆維護寫了個mlogmmlogmmlogm的。
首先[1,m][1,m][1,m]肯定是放在[1,m][1,m][1,m]對應的位置是最優的,所以當∑li<n\sum l_i<n∑li?<n或者i+li?1>ni+l_i-1>ni+li??1>n就無解。
那么滿足如上條件后,我們將每個數都放在了[1,m][1,m][1,m]的位置上,現在保證了每個顏色都出現了至少一次了,但是我們沒有保證所有的都被涂色,因為右邊有可能空出來一塊,所以我們考慮將一部分右移。這里我右移的部分是整個一塊右移,即將[l,m][l,m][l,m]右移,所以我們維護一個堆,里面一開始放著i+li?1i+l_i-1i+li??1,從111開始,維護一個sumsumsum表示左邊長度,deldeldel表示要減去多少,每次都讓sum=sum+a[i]sum=sum+a[i]sum=sum+a[i],之后看一下sum+q.top()?del>=nsum+q.top()-del>=nsum+q.top()?del>=n,不滿足繼續i+1i+1i+1,否則就從當前長度一直減到sum+q.top()?del==nsum+q.top()-del==nsum+q.top()?del==n的時候停下,從這里填就好啦。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<assert.h>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
,m
;
int a
[N
],pos
[N
];
int suf
[N
];bool check() {LL sum
=0;for(int i
=1;i
<=m
;i
++) {sum
+=a
[i
];if(i
+a
[i
]-1>n
) return false;}if(sum
<n
) return false; priority_queue
<PII
>q
;for(int i
=2;i
<=m
;i
++) q
.push({i
+a
[i
]-1,-i
});sum
=0; int del
=1;for(int i
=1;i
<=m
;i
++) {pos
[i
]=sum
+1;sum
+=a
[i
];if(!q
.size()) break;while(-q
.top().Y
<i
) q
.pop();if(sum
+q
.top().X
-del
>=n
) {while(sum
+q
.top().X
-del
>n
) sum
--;sum
++;for(int j
=i
+1;j
<=m
;j
++) pos
[j
]=sum
++;break;} del
++;}for(int i
=1;i
<=m
;i
++) printf("%d ",pos
[i
]);return true;
}int main()
{
scanf("%d%d",&n
,&m
);for(int i
=1;i
<=m
;i
++) scanf("%d",&a
[i
]);if(!check()) {puts("-1");return 0;}return 0;
}
總結
以上是生活随笔為你收集整理的Codeforces Round #631 (Div. 2) C. Dreamoon Likes Coloring 构造的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。