codeforces round #324(div2) E题 Anton and lra

这道E题真的毒瘤啊,看完题解后还花了三小时AC。。。

主要是让这个位置上的数字如果要换到前面,那么前面至少有一个要到这个位置上,交换就好啦。

交换之后更新位置,直到这个数字被交换到指定位置。

为了 简化操作,我们可以把所有目标序列(s列)中数字出现的位置替换p序列中的数字,这样目标序列转化成一个1到n的序列

#include<bits/stdc++.h>
using namespace std;
int p[2001];
int s[2001];
int pos[2001];
int tot;
int res=0;
struct oper{
	int i;
	int j;
}op[2000001];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&p[i]);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&s[i]);
		pos[s[i]]=i;
	}
	for(int i=1;i<=n;i++)
	{
		if(pos[p[i]]<i)
		  res+=(i-pos[p[i]]);
	}
	printf("%d\n",res);
	for(int i=1;i<=n;i++)
	{
		p[i]=pos[p[i]];
	}
	for(int i=1;i<=n;i++)//从头开始找,找到p[i]<i,
	{
		if(p[i]<i)//找到之后从后向前遍历, 找到第一个p[j] >=i交换,更新i的位置,继续向前交换,直到p[i]==pos
		{
			int pos=i;
			while(pos>p[pos])
			{
			   for(int j=pos-1;j>=1;j--)
			   {
				  if(p[j]>=pos)
				  {
					 swap(p[j],p[pos]);
					 op[++tot].i=pos;
					 op[tot].j=j;
					 pos=j;
					 break;
			      }
			    }
			}
		}
	}
	printf("%d\n",tot);
	for(int i=1;i<=tot;i++)
	{
		printf("%d %d\n",op[i].i,op[i].j);
	}
}

  

原文地址:https://www.cnblogs.com/lishengkangshidatiancai/p/10035425.html

时间: 2024-10-08 07:40:21

codeforces round #324(div2) E题 Anton and lra的相关文章

codeforces round#259 div2 B题(KMP)

先上链接:http://codeforces.com/contest/454/problem/B B. Little Pony and Sort by Shift time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output One day, Twilight Sparkle is interested in how to sort a se

codeforces round #499(div2) 做题记录

A. Stages 题意: 给你n个字母,你要选k个,你选择的相邻两个字母在字母表中必须满足中间至少隔一个字母,每个字母的权值是c-'a'+1,求最小权值和. k<=n<=50 题解:贪心,从前向后扫,满足题意的就加进去就可以了 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define maxn 55 4 using namespace std; 5 int n,k; 6 char s[maxn]; 7 int w[max

codeforces round 422 div2 补题 CF 822 A-F

A I'm bored with life 水题 #include<bits/stdc++.h> using namespace std; typedef long long int LL; const LL N=1,M=1,MOD=1; int main() {//freopen("t.txt","r",stdin); ios::sync_with_stdio(false); LL a,b; scanf("%I64d%I64d",&

codeforces round 418 div2 补题 CF 814 A-E

A An abandoned sentiment from past 水题 #include<bits/stdc++.h> using namespace std; int a[300],b[300],n,k; bool cmp(int a,int b) { return a>b; } int main() {//freopen("t.txt","r",stdin); scanf("%d%d",&n,&k); f

codeforces round 421 div2 补题 CF 820 A-E

A Mister B and Book Reading  O(n)暴力即可 #include<bits/stdc++.h> using namespace std; typedef long long int LL; const LL N=1,M=1,MOD=1; int main() {//freopen("t.txt","r",stdin); int c,v0,v1,a,l; scanf("%d%d%d%d%d",&c,&

codeforces round #257 div2 C、D

本来应该认真做这场的,思路都是正确的. C题,是先该横切完或竖切完,无法满足刀数要求,再考虑横切+竖切(竖切+横切), 因为横切+竖切(或竖切+横切)会对切割的东西产生交叉份数,从而最小的部分不会尽可能的大. 代码如下,虽然比较长.比较乱,但完全可以压缩到几行,因为几乎是4小块重复的代码,自己也懒得压缩 注意一点,比如要判断最小块的时候,比如9行要分成2份,最小的剩下那份不是9取模2,而应该是4 m/(k+1)<=m-m/(k+1)*k          #include<bits/stdc+

codeforces Round #250 (div2)

a题,就不说了吧 b题,直接从大到小排序1-limit的所有数的lowbit,再从大到小贪心组成sum就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #define N 200000 6 using namespace std; 7 int pos[N],a[N],s[N],f[N],la[N],b[N],i,j,k,ans,n,p

Codeforces Round #254(div2)A

很有趣的题.想到了就非常简单,想不到就麻烦了. 其实就是一种逆向思维:最后结果肯定是这样子: WBWBWBWB... BWBWBWBW... WBWBWBWB... ... 里面有“-”的地方改成“-”就行了. 但是我开始是正着想的,想每个点怎么处理,这还要看它周围点的状态,越想越麻烦... 这题中体现的正难则反的逆向思维很值得学习. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs

【前行】◇第3站◇ Codeforces Round #512 Div2

[第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了:) +传送门+ ◇ 简单总结 前两道题非常OK,秒掉还好.心态爆炸是从第三题开始的……一开始设计的判断方法没有考虑0,然后就错了很多次,然后改了过后又没有考虑整个数要分成2个及以上的数,继续WA,最后整个程序删了重新魔改了一次终于AC.感觉最后的AC代码的复杂度要比原来高一些,但是毕竟AC了,还是不