Codeforces Round 922 (Div. 2) 赛后总结

  • 自豪的是D题做出来了,悲哀的是B题没能做出来
  • C题的绝对值最小
  • D题,DP存不下状态就把状态放进所求值中
  • 比赛快结束的时候,我想,这个B题,它但凡需要我通过归并排序或者树状数组求逆序对,不比C题进制转化要难?于是我就猜了一个结论
  • 结论是对的,但不幸的是,我编程实现的时候出错了
  • 考虑怎样证明这个结论,发现此时任意操作都不会使结果更优
  • 本质上是以“排序”为贪心策略
  • 实现的时候可以将两个数组捆绑起来一起排序
  • 要相信、也可以相信,自己是对的呀……
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int a[200005],b[200005],r[200005]; 
int read1()
{
	char cc=getchar();
	while(!(cc>=48&&cc<=57))
	{
		if(cc=='-')
		{
			break;
		}
		cc=getchar();
	}
	bool f=false;
	int s=0;
	if(cc=='-')
	{
		f=true;
	}
	else
	{
		s=cc-48;
	}
	while(1)
	{
		cc=getchar();
		if(cc>=48&&cc<=57)
		{
			s=s*10+cc-48;
		}
		else
		{
			break;
		}
	}
	if(f==true)
	{
		s=-s;
	}
	return s;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n=read1();
		for(int i=1;i<=n;i++)
		{
			a[i]=read1();
		}
		for(int i=1;i<=n;i++)
		{
			b[i]=read1();
			r[b[i]]=i;
		}
		for(int i=1;i<=n;i++)
		{
			if(b[i]!=i)
			{
				r[b[i]]=r[i];
				swap(a[i],a[r[i]]);
				swap(b[i],b[r[i]]);
			}
		}
		for(int i=1;i<n;i++)
		{
			printf("%d ",a[i]);
		}
		printf("%d\n",a[n]);
		for(int i=1;i<n;i++)
		{
			printf("%d ",b[i]);
		}
		printf("%d\n",b[n]);
	}
	return 0;
}
posted @ 2024-02-01 21:18  D06  阅读(5)  评论(0编辑  收藏  举报