1 条题解
-
0
linjinkun (linjinkun) LV 5 MOD @ 7 个月前
这个题有很多做法,这里只说最简单的 做法。
出题人很善,直接暴力有 。
然后考虑优化,将每一个块存储到 里,删除时如果两个块可以合并,就合并,结束(没啥难度,重在证明,但我不会,没事儿,写就对了)。
代码(得注意注意边角问题,不然很容易 分):
- 1
信息
- ID
- 1014
- 难度
- 2
- 分类
- (无)
- 标签
- 递交数
- 1
- 已通过
- 1
- 通过率
- 100%
- 上传者
这个题有很多做法,这里只说最简单的 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;
}