哪位dalao可以帮忙想一下解题思路
查看原帖
哪位dalao可以帮忙想一下解题思路
519384
Link_Cut_Y楼主2021/9/1 22:16

以下是我的错误代码

写了半天自己都不知道写的是什么东西

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

const int N=100010;

struct Node
{
	int l,r;
	int v;
}tr[N<<2];
int n;
int a[N];
int b[N];
int c[N];

void pushup(int u)
{
	tr[u].v=tr[u<<1].v+tr[u<<1|1].v;
}

void build(int u,int l,int r)
{
	tr[u]={l,r,0};
	if(l==r) return;
	
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
}

void modify(int u,int pos)
{
	if(tr[u].l==tr[u].r)
	{
		++tr[u].v;
		return;
	}
	
	int mid=(tr[u].l+tr[u].r)>>1;
	if(pos<=mid) modify(u<<1,pos);
	else modify(u<<1|1,pos);
	
	pushup(u);
}

int query(int u,int l,int r)
{
	if(tr[u].l>=l && tr[u].r<=r) return tr[u].v;
	
	int mid=(tr[u].l+tr[u].r)>>1;
	int ans=0;
	
	if(l<=mid) ans+=query(u<<1,l,r);
	if(r>mid) ans+=query(u<<1|1,l,r);
	return ans;
}

int res=0;
void reverse(int l,int r)
{
	for(int i=l;i<=r;i++)
	{
		swap(a[i],a[l+r-i]);
	}
	res++;
}

int main()
{
	scanf("%d",&n);
	
	build(1,1,n);
	
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	
	
	int last=1;
	for(int i=2;i<=n;i++)
		if(a[i]>a[i-1])
		{
			reverse(last,i-1);
			last=i;
		}
	
	reverse(last,n);
	
	for(int i=n;i;i--)
	{
		if(a[i]!=n) res+=query(1,a[i]+1,n);
		modify(1,a[i]);
	}
	
	printf("%d\n",res);
	return 0;
}
2021/9/1 22:16
加载中...