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;
}