1 条题解
-
0linjinkun (linjinkun) LV 5 MOD @ 2024-10-04 17:18:24
这个题有很多做法,这里只说最简单的 \(STL\) 做法。
出题人很善,直接暴力有 \(70pts\)。
然后考虑优化,将每一个块存储到 \(vector\) 里,删除时如果两个块可以合并,就合并,结束(没啥难度,重在证明,但我不会,没事儿,写就对了)。
代码(得注意注意边角问题,不然很容易 \(RE90\) 分):#include<bits/stdc++.h> using namespace std; const int N = 2e5+5; int a[N]; int tong[N]; struct node { int l; int r; int x; }; vector<node>s; signed main() { int ss = 2; int n; scanf("%d",&n); int l = 1,r = 1; for(int i = 1;i<=n;i++) { scanf("%d",&a[i]); if(i == 1) { r++; ss = a[i]; continue; } if(a[i]!=ss) { s.push_back({l,r-1,ss}); l = i; } r++; ss = a[i]; } if(s.size() == 0) { s.push_back({1,n,a[n]}); } else if(s[s.size()-1].r<n) { s.push_back({s[s.size()-1].r+1,n,a[n]}); } while(s.size()) { for(int i = 0;i<s.size();i++) { while(tong[s[i].l]) { s[i].l++; } tong[s[i].l] = 1; printf("%d ",s[i].l); if(s[i].l+1>s[i].r) { s.erase(s.begin()+i); i--; } else { s[i].l++; } } for(int i = 0;i<s.size();i++) { if(i>0) { if(s[i-1].x == s[i].x) { int l = s[i-1].l; s.erase(s.begin()+i-1); s[i-1].l = l; i--; } } } printf("\n"); } return 0; }
- 1
信息
- ID
- 1014
- 难度
- 2
- 分类
- (无)
- 标签
- 递交数
- 1
- 已通过
- 1
- 通过率
- 100%
- 上传者