P1966 [NOIP2013 提高组] 火柴排队
题解已经讲的足够好了,我想来补充一点我在思考过程中遇到的“小石子”(此处dalao可以跳过)
1.逆序对和线性代数里的逆序数有点不一样,逆序数 是指一段排列中所有逆序对的数量(蒟蒻当时卡在这里好久)
2.每进行一次交换,最多 能消除一个逆序对 所以为了消除所有的逆序对,最少交换次数就等于逆序数。
题解
1.同一列火柴高度互不相同
2.只能相邻交换
3.要取模
4.顺序<=乱序<=逆序
5.第一遍映射,求出ab数组中各个数字是第几小
6.第二遍映射,将数组a中第i个数的第j小映射为i,令这样的映射叫做C
7.第三遍映射,对数组b 做 C 的映射,然后求逆序对,因为相邻数交换成单调递增最小次数为逆序对的值
code
#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-x))
using namespace std;
const int mod=1e8-3;
// Functions for input and output
inline void read(ll &x) {
x = 0;
ll flag = 1;
char c = getchar();
while(c < '0' || c > '9'){
if(c == '-')flag = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
x *= flag;
}
inline void write(ll x)
{
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
ll len=0;
struct node
{
ll v,id;
}a[100005],b[100005];
ll c[100005]={0};
ll n;
ll asmallth[100005];
ll bsmallth[100005];
ll haxi[100005];
bool cmp(node x,node y)
{
return x.v<y.v;
}
void update(ll x)
{
while(x<=n)
{
c[x]++;
x+=lowbit(x);
}
}
ll query(ll x)
{
ll sum=0;
while(x)
{
sum+=c[x];
x-=lowbit(x);
sum%=mod;
}
return sum;
}
int main()
{
read(n);
for(ll i=1;i<=n;i++)
{
read(a[i].v);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(ll i=1;i<=n;i++) asmallth[a[i].id]=i;
for(ll i=1;i<=n;i++) haxi[asmallth[i]]=i;
for(ll i=1;i<=n;i++)
{
read(b[i].v);
b[i].id=i;
}
sort(b+1,b+n+1,cmp);
for(ll i=1;i<=n;i++) bsmallth[b[i].id]=i;
ll ans=0;
for(ll i=1;i<=n;i++)
{
ll now=haxi[bsmallth[i]];
update(now);
ans+=i-query(now);
ans%=mod;
}
write(ans);
putchar('\n');
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)