POJ 3928 Ping pong(树状数组+两次)
题意:每个人都有一个独特的排名(数字大小)与独特的位置(从前往后一条线上),求满足排名在两者之间并且位置也在两者之间的三元组的个数
思路:单去枚举哪些数字在两者之间只能用O(n^3)时间太高,但是可以转变思想。我们可以转化为对于每个数字a,求出后面比当前数a大的每个数b,再求出数b后面比当前数b大的数字c的个数,接着对于每个a对应的每个b中c的个数之和就是一半结果,当然还有比他小的是另一半求法类似。其实就是树状数组求逆序数第一次求出每个b,接着再用b求出c,这样求两次就好
#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<vector> #include<string> #include<cstdio> #include<cstring> #include<stdlib.h> #include<iostream> #include<algorithm> using namespace std; #define eps 1E-8 /*注意可能会有输出-0.000*/ #define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型 #define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化 #define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0 #define mul(a,b) (a<<b) #define dir(a,b) (a>>b) typedef long long ll; typedef unsigned long long ull; const int Inf=1<<28; const double Pi=acos(-1.0); const int Mod=1e9+7; const int Max=20010; struct node { int val,pos; }num[Max]; int n; ll bit[Max]; int lowbit(int x) { return x&(-x); } void Add(int x,int y) { while(x<=n) { bit[x]+=(ll)y; x+=lowbit(x); } return; } ll Sum(int x) { ll sum=0ll; while(x>0) { sum+=bit[x]; x-=lowbit(x); } return sum; } ll Manx(int n,int *pop,int *ivsn,int *ivsn2,int hh) { ll sum=0ll,manx=0ll; memset(bit,0ll,sizeof(bit)); for(int i=n;i>0;--i) { if(hh) ivsn[i]=sum-Sum(pop[i]); else ivsn[i]=Sum(pop[i]); Add(pop[i],ivsn2[i]); sum+=ivsn2[i]; manx+=ivsn[i]; } return manx; } int pop[Max],ivsn[Max],ivsn2[Max]; bool cmp(struct node p1,struct node p2) { return p1.val<p2.val; } int main() { int t; ll ans; scanf("%d",&t); while(t--) { ans=0ll; scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&num[i].val); num[i].pos=i; ivsn2[i]=1; } sort(num+1,num+n+1,cmp); for(int i=1;i<=n;i++) pop[num[i].pos]=i;//离散化 Manx(n,pop,ivsn,ivsn2,1);//找出pop数组每个数后面比当前大的每个位置的ivsn2数组值的总和 ans+=Manx(n,pop,ivsn2,ivsn,1); for(int i=1;i<=n;i++) ivsn2[i]=1; Manx(n,pop,ivsn,ivsn2,0);//找出pop数组每个数后面比当前小的每个位置的ivsn2数组值的总和 ans+=Manx(n,pop,ivsn2,ivsn,0); printf("%I64d\n",ans); } return 0; }
分类:
ACM_数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决