CF1479B Painting the Array
CF1479B1 Painting the Array I
CF1479B1 Painting the Array II
題意:
本題與 CF1480D2 的唯一區別是本題詢問最大可能解.
給定一個數組a,你將ai染為bi色,其中b是由你指定的一個01數組.將a數組中被染成0色的數字取出來并依在a中出現的順序排列,組成數組a(0).同理,將a數組中被染成1色的數字取出來并依在a中出現的順序排列,組成數組a(1).給定一個數組 a, 你將 a_i染為 b_i色, 其中 b 是由你指定的一個 01 數組. 將 a 數組中被染成 0 色的數字取出來并依在 a 中出現的順序排列, 組成數組 a^{(0)}. 同理, 將 a 數組中被染成 1 色的數字取出來并依在 a 中出現的順序排列, 組成數組 a^{(1)}.給定一個數組a,你將ai?染為bi?色,其中b是由你指定的一個01數組.將a數組中被染成0色的數字取出來并依在a中出現的順序排列,組成數組a(0).同理,將a數組中被染成1色的數字取出來并依在a中出現的順序排列,組成數組a(1).
我們定義seg(c)是一個正整數,其中c是一個數組,seg(c)的值為在我們將c中相鄰的所有相同元素合并后,c數組的大小.例如,seg([1,1,4,5,1,4])=∣[1,4,5,1,4]∣=5.最大化seg(a(0))+seg(a(1))我們定義 seg(c) 是一個正整數, 其中 c 是一個數組, seg(c) 的值為在我們將 c 中相鄰的所有相同元素合并后, c 數組的大小. 例如, seg([1, 1, 4, 5, 1, 4]) = |[1, 4, 5, 1, 4]|=5. 最大化 seg(a^{(0)})+seg(a^{(1)})我們定義seg(c)是一個正整數,其中c是一個數組,seg(c)的值為在我們將c中相鄰的所有相同元素合并后,c數組的大小.例如,seg([1,1,4,5,1,4])=∣[1,4,5,1,4]∣=5.最大化seg(a(0))+seg(a(1))
題解:
貪心策略,問題D1,如果我們想讓值更大,就要盡可能避免相同數字相鄰的情況,現在有兩數組a0a^0a0和a1a^1a1,那么我們可以這樣把其當作棧,分配數組a時,盡可能讓相同元素岔開
D2問題就是反過來統計答案
代碼:
D1
#include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; void read(){}; template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar) {x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...); } template <typename T> inline void write(T x) {if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0'); } void rd_test() { #ifdef ONLINE_JUDGE #elsestartTime = clock ();freopen("data.in", "r", stdin); #endif } void Time_test() { #ifdef ONLINE_JUDGE #elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } const int maxn=2e5+9; int a[maxn]; int nxt[maxn]; int id[maxn]; vector<PII>x,y; int main() {//rd_test();int n;read(n);for(int i=1;i<=n;i++){read(a[i]);id[i]=n+1;}for(int i=n;i>=1;i--){nxt[i]=id[a[i]];id[a[i]]=i;}x.push_back({0,n+1});y.push_back({0,n+1});int ans=0;for(int i=1;i<=n;i++){if(a[i]==x.back().first&&a[i]==y.back().first){x.push_back({a[i],nxt[i]});}else if(a[i]==x.back().first){y.push_back({a[i],nxt[i]});ans++;}else if(a[i]==y.back().first){x.push_back({a[i],nxt[i]});ans++;}else {ans++;if(x.back().second>y.back().second){y.push_back({a[i],nxt[i]});}else x.push_back({a[i],nxt[i]});}}cout<<ans<<endl;//Time_test(); }D2
#include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; void read(){}; template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar) {x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...); } template <typename T> inline void write(T x) {if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0'); } void rd_test() { #ifdef ONLINE_JUDGE #elsestartTime = clock ();freopen("data.in", "r", stdin); #endif } void Time_test() { #ifdef ONLINE_JUDGE #elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } const int maxn=2e5+9; int a[maxn]; int nxt[maxn]; int id[maxn]; vector<PII>x,y; int main() {//rd_test();int n;read(n);for(int i=1;i<=n;i++){read(a[i]);id[i]=n+1;}for(int i=n;i>=1;i--){nxt[i]=id[a[i]];id[a[i]]=i;}x.push_back({0,n+1});y.push_back({0,n+1});int ans=0;for(int i=1;i<=n;i++){if(a[i]==x.back().first&&a[i]==y.back().first){x.push_back({a[i],nxt[i]});}else if(a[i]==x.back().first){x.push_back({a[i],nxt[i]});}else if(a[i]==y.back().first){y.push_back({a[i],nxt[i]});}else {ans++;if(x.back().second>y.back().second){x.push_back({a[i],nxt[i]});}else y.push_back({a[i],nxt[i]});}}cout<<ans<<endl;//Time_test(); }總結
以上是生活随笔為你收集整理的CF1479B Painting the Array的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初识数据中心Mesos
- 下一篇: CF1479C Continuous C