题目
求 三元组(i,j,k), i<j<k, 满足 a[i]<a[j]<a[k] 或者 a[i]>a[j]>a[k],有多少组?(a[i] <=1e5)
枚举 j , 考虑 a[i]<a[j] 有多少 i 满足这个条件 c[j]
正反求出 c[ i ] ,d[ i ] ans= c[i]*(n-i-d[i]) + (i-c[i]-1])*d[i]
————————————————
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int M=1e5+2,N=3e4; #define int long long int n,a[N],tr[M]; int c[N],d[N]; int lowbit(int x){ return x&-x; } void add(int x,int v){ for(;x<M;x+=lowbit(x)) tr[x]+=v; } int q(int x){ int t=0; for(;x;x-=lowbit(x)) t+=tr[x]; return t; } void solve(){ int i,j; int ans=0; memset(tr,0,sizeof tr); for(i=1;i<=n;i++){ c[i]=q(a[i]-1); add(a[i],1); } memset(tr,0,sizeof tr); for(i=n;i>=1;i--){ d[i]=q(a[i]-1); add(a[i],1); } for(i=1;i<=n;i++){ ans+= c[i]*(n-i-d[i])+(i-c[i]-1)*d[i]; } cout<<ans<<endl; } signed main(){ //freopen("in","r",stdin); //freopen("out","w",stdout); int cas; cin>>cas; while(cas--){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; solve(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!