逆序对(树状数组OR归并排序)

本文提供了解决POJ 2299问题的两种方法:使用树状数组和归并排序。树状数组方法通过快速读取优化了查询效率,而归并排序方法则通过分治策略计算逆序对数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://poj.org/problem?id=2299

这题用了快读,poj上G++交一直WA,C++尼玛居然就对了,气死我了。

树状数组:

 

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include<iomanip>
using namespace std;
typedef long long ll;
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define mod int(1e9+7)
#define P pair<int,int>
#define pi acos(-1)
inline int read()
{
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
int n,a[500008],qw[500008];
struct as{
int q,w;}b[500008];
bool cmp(as a,as b)
{
	return a.q<b.q;
}
int sum(int x)
{
    int s=0;
    while(x>0)
    {
        s+=a[x];
        x-=x&-x;
    }
    return s;
}
void add(int x,int y)
{
    while(x<=n)
    {
        a[x]+=y;
        x+=x&-x;
    }
    return;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	while(cin>>n&&n)
    {
        REW(a,0);
        REW(qw,0);
        int e=n;
        ll s=0;
        for(int i=1;i<=n;i++)
		{
			b[i].q=read();
			b[i].w=i;
		}
		sort(b+1,b+n+1,cmp);
		for(int i=1;i<=n;i++)
		{
			qw[b[i].w]=i;
		}
		for(int i=1;i<=n;i++)
		{
			add(qw[i],1);
			s+=i-sum(qw[i]);
		}
		cout<<s<<endl;
    }
    return 0;
}

归并排序:

 

 

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include<iomanip>;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod ll(1e9+7)
#define pb push_back
#define eps 1e-6
#define lc d<<1
#define rc d<<1|1
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
#define VI vector<vector<int>>
using namespace std;
const int N=5e5+8;
int a[N],b[N],n;
ll ans;
void getsort(int l,int r)
{
    if(l>=r) return;
    int mid=(l+r)>>1;
    getsort(l,mid);
    getsort(mid+1,r);
    int x=l,y=mid+1,num=0;
    while(x<=mid&&y<=r)
    {
        if(a[x]<=a[y]) b[++num]=a[x++];
        else b[++num]=a[y++],ans+=mid-x+1;
    }
    while(x<=mid) b[++num]=a[x++];
    while(y<=r) b[++num]=a[y++];
    FOR(i,1,num) a[l+i-1]=b[i];
}
int main()
{
    cin.tie(0);
    cout.tie(0);
    while(cin>>n&&n)
    {
        ans=0;
        FOR(i,1,n) si(a[i]);
        getsort(1,n);
        cout<<ans<<endl;
    }
    return 0;
}
/*

*/

 

 

 

 

 

 

 

资源下载链接为: https://pan.quark.cn/s/d37d4dbee12c A:计算机视觉,作为人工智能领域的关键分支,致力于赋予计算机系统 “看懂” 世界的能力,从图像、视频等视觉数据中提取有用信息并据此决策。 其发展历程颇为漫长。早期图像处理技术为其奠基,后续逐步探索三维信息提取,与人工智能结合,又经历数学理论深化、机器学习兴起,直至当下深度学习引领浪潮。如今,图像生成和合成技术不断发展,让计算机视觉更深入人们的日常生活。 计算机视觉综合了图像处理、机器学习、模式识别和深度学习等技术。深度学习兴起后,卷积神经网络成为核心工具,能自动提炼复杂图像特征。它的工作流程,首先是图像获取,用相机等设备捕获视觉信息并数字化;接着进行预处理,通过滤波、去噪等操作提升图像质量;然后进入关键的特征提取和描述环节,提炼图像关键信息;之后利用这些信息训练模型,学习视觉模式和规律;最终用于模式识别、分类、对象检测等实际应用。 在实际应用中,计算机视觉用途极为广泛。在安防领域,能进行人脸识别、目标跟踪,保障公共安全;在自动驾驶领域,帮助车辆识别道路、行人、交通标志,实现安全行驶;在医疗领域,辅助医生分析医学影像,进行疾病诊断;在工业领域,用于产品质量检测、机器人操作引导等。 不过,计算机视觉发展也面临挑战。比如图像生成技术带来深度伪造风险,虚假图像和视频可能误导大众、扰乱秩序。为此,各界积极研究检测技术,以应对这一问题。随着技术持续进步,计算机视觉有望在更多领域发挥更大作用,进一步改变人们的生活和工作方式 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值