这题同一个代码可能过也可能不过,网上的题解基本上是同一种做法。个人写的细节差异会容易TLE。
测试了一晚上,终于找出了问题所在。
方法大家一定都知道,但是测试发现加inline会ac,平均提交2-3次能ac一次,运气好一次就能ac 。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
using namespace std;
const int maxn=3e6+10;
int n,m;
char ch;
int arr[maxn],num[10010];
inline int lowerbit(int x)
{
return (x&(-x));
}
inline void add(int pos,int x)
{
while(pos<=10000)
{
num[pos]+=x;
pos+=lowerbit(pos);
}
}
inline int sum(int pos)
{
int ret=0;
while(pos>0)
{
ret+=num[pos];
pos-=lowerbit(pos);
}
return ret;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(num,0,sizeof(num));
long long int ans=0;
for(int i=0; i<n; i++)
{
scanf("%d",&arr[i]);
ans+=sum(arr[i]-1);//注意这个地方要从小于第i个开始求和,避免重复。
add(arr[i],1);
}
scanf("%d",&m);
while(m--)
{
getchar();
scanf("%c",&ch);
if(ch=='Q') printf("%lld\n",ans);
else
{
int l,r;
scanf("%d%d",&l,&r);
int temp=arr[l];
for(int i=l+1; i<=r; i++)
{
if(arr[i]>temp) ans--;
else if(arr[i]<temp) ans++;
arr[i-1]=arr[i];
}
arr[r]=temp;
}
}
}
return 0;
};