codeforces1473C No More Inversions

https://codeforces.com/contest/1473/problem/C

摸鱼太久不训练智商下降的严重,1 2 3 2 1 和3 2 1 2 3 逆序对我vp的时候数得不一样,直接得出结论 回文串逆序对数量跟安排顺序有关,然后这题就没了,然后E题也没了

我们考虑对于一个回文串,不管他们的字母是什么,我们把他们离散化1-k,长度是2k-1

那么对于这题的后面一段回文串,设最大值的教左位置p1,那么另一个就在2k-p1,他们贡献的逆序对数量是2k-1-p1-1+2k-1-(2k-p1)=2k-3, 跟p1无关,

那么继续推p2,要讨论一下p2在p1的左边还是右边,但最后次大值贡献的逆序对数量也跟p2无关,都是2k-5

特别地,如果某个值在正中间,也就是k这个位置,那么要另行计算一下,但最后总数总与放的位置无关,假设他是第q大,那比他大的k-q个,在左边部分,要形成k-q对逆序对,比他小的q-1个,在右边部分形成q-1对逆序对,反正都要形成k-1对逆序对

其实这种机智题是需要一眼秒的。。。camp前还是多训练恢复一下智商。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxl=3e5+10;

int n,m,k,cnt,cas,ans;
int a[maxl],b[maxl],p[maxl];
bool vis[maxl];
char s[maxl];

inline void prework()
{
	scanf("%d%d",&n,&k);
}

inline void mainwork()
{
	int l=n-k;
	for(int i=1;i<=n-2*l-1;i++)
		 p[i]=i;
	int id=k;
	for(int i=n-2*l;i<=k;i++)
		p[i]=id--;
	for(int i=k+1;i<=n;i++)
		p[i]=++id;
}

inline void print()
{
	for(int i=1;i<=k;i++)
		printf("%d%c",p[i]," \n"[i==k]);
}

int main()
{
	int t=1;
	scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值