Codeforces Round #813 (Div. 2)

这一场打得很稀烂QwQ。

开局先看A,开始秒想了一个假掉的做法,WA了3发,以后一定要先证明正确性再写。。。

A写了16分钟。。。

B很快在35分钟的时候秒掉了,C想到了一个暴力做法,但是由于太暴力了,TLE了一发,稍微优化了一下就过掉了(1h19分)。

之后一个小时在推 E 的式子,但一直陷在死循环里,找不到突破口,浅看一下D,感觉好像要写线段树维护区间然后贪心之类的,没有细想,继续推 E 式子到结束。

A Wonderful Permutation

题意

给出一个长为 n 的排列 p,每一次操作可以交换任意两个位置的数,求使得 p1+p2pk 最小所需的最小操作次数。

思路

由于 p 是一个排列,所以使得只要使得 maxi=1kaik 即可。

所以我们判断一下从 a1ak 中是否有大于 k 的数,是就输出 No,否则输出 Yes

注意多组数据。

const int N = 105;
int a[N];
int n, k;
void solve()
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
int ans = 0;
for(int i=1;i<=k;i++)
{
if(a[i] > k) ans ++;
}
cout<<ans<<endl;
}

B Woeful Permutation

题意

求一个长度为 n 的排列 a,使得 lcm(1,a1)+lcm(2,a2)++lcm(n,an) 最大。

思路

对于 n 为奇数的情况,最后答案为 1,3,2,5,4,7,6,n,n1

对于 n 为奇数的情况,最后答案为 2,1,4,3,6,5,n,n1

Proof

由于 lcm(x,y)=x×ygcd(x,y),所以当 x,y 互质的时候最优。

我们发现,一个数和最小(或大)的比它大(或者小)的且与它互质的数求 lcm 时,是最优的。

那为什么不去和更大的且与它互质的数求 lcm 呢?

设原来的配对为 x1×y11+x2×y21(x1y1x2y2),交换成x1×y21+x2×y11,的话会导致答案偏小。

const int N = 1e5 + 10;
int a[N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) a[i] = i;
if(n % 2 == 1) for(int i=2;i<n;i+=2) swap(a[i],a[i+1]);
if(n % 2 == 0) for(int i=1;i<=n;i+=2) swap(a[i],a[i+1]);
for(int i=1;i<=n;i++) cout<<a[i]<<' ';
cout<<endl;
}

C Sort Zero

题意

给出一个长为 n 的序列 a,每一次操作可以选择一个数 x,将 a 中的所有等于 x 的数变为 0,求将序列变成不下降序列所需要的最少操作次数。

思路

我们发现,一旦出现了 ai>ai+1,那么我们就要将下标为 1i 的数都变成 0

Proof:

如果只是将 ai 变为 0,由于原序列中所有数都是大于 0 的,所以如果 ai10,就有 ai1>ai

如此类推, 下标为 1i 的数都一定为 0

所以我们只要用 set 维护 1i 值的个数,如果出现 ai>ai+1,就将 1i 中的所有值标记为 0,答案更新为 1i 中值的个数即可。

const int N = 1e5 + 10;
int n;
int a[N];
bool st[N];
int main()
{
int t = 1;
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=0;i<=n;i++) st[i] = 0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int ans = 0, last = 0;
set<int> S;
for(int i=1;i<n;i++)
{
if(st[a[i]]) a[i] = 0;
if(st[a[i+1]]) a[i+1] = 0;
if(a[i] != 0) S.insert(a[i]);
if(a[i] > a[i+1])
{
for(int j=last;j<=i;j++) st[a[j]] = 1;
last = i;
ans = S.size();
}
}
cout<<ans<<endl;
}
return 0;
}

本文作者:BorisDimitri

本文链接:https://www.cnblogs.com/BorisDimitri/p/16584702.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   BorisDimitri  阅读(79)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起