●POJ 3378 Crazy Thairs
题链:
http://poj.org/problem?id=3378
题解:
树状数组维护,高精度。
依次考虑以每个位置结尾可以造成的贡献。
假设当前位置为i,为了达到5个元素的要求,我们需要求出,在序列1~i-1中有多少个合法4元组(a<b<c<d且Aa<Ab<Ac<Ad)的最后那个元素是小于Ai的(即为了满足a<b<c<d<i且Aa<Ab<Ac<Ad<Ai),求出这种四元组的个数,那么就是以i位置结尾可以贡献的答案。
所以我们用树状数组"D4"维护以权值x结尾的合法四元组的个数,那么对于当前的A_i,就只需要查询树状数组的[1~A_i-1]的区间的和,这个和便是应该贡献的答案。
然而为了维护以某一元素结尾的合法四元组的个数,我们不得不再用一个树状数组"D3"维护以权值x结尾的合法三元组的个数。
同理,为了维护以某一元素结尾的合法三元组的个数,还需要一个树状数组"D2"维护以权值x结尾的合法二元组的个数,然后是一个树状数组"D1"维护以权值x结尾的合法一元组的个数。。。。。。
然后就只需要对于依次枚举到的第i个元素,进行查询和更新树状数组就好了。
(本体比较恶心,爆longlong,就再弄一个高精度咯。)
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 50050 #define ll long long using namespace std; struct BigInt{ #define Bit 1000 int val[10],len; BigInt(){len=1; memset (val,0, sizeof (val));} void operator = ( int rtm){ memset (val,0, sizeof (val)); len=0; do { val[++len]=rtm%Bit; rtm/=Bit; } while (rtm); } BigInt operator + ( const BigInt &rtm) const { BigInt now; now.len=max(rtm.len,len); for ( int i=1;i<=now.len;i++){ now.val[i]+=val[i]+rtm.val[i]; now.val[i+1]+=now.val[i]/Bit; now.val[i]%=Bit; } while (now.val[now.len+1]) now.len++; return now; } void Print(){ printf ( "%d" ,val[len]); for ( int i=len-1;i;i--) printf ( "%03d" ,val[i]); } }; struct BIT{ BigInt val[MAXN]; int n; int Lowbit( int x){ return x&-x;} void Reset( int _n){n=_n; while (_n) val[_n]=0,_n--;} void Modify( int p,BigInt v){ while (p<=n) val[p]=val[p]+v,p+=Lowbit(p); } BigInt Query( int p){ static BigInt ret; ret=0; while (p) ret=ret+val[p],p-=Lowbit(p); return ret; } }D1,D2,D3,D4; int A[MAXN],tmp[MAXN]; int N,tnt; BigInt ANS,t,one; int main(){ one=1; while (~ scanf ( "%d" ,&N)){ for ( int i=1;i<=N;i++) scanf ( "%d" ,&A[i]),tmp[i]=A[i]; sort(tmp+1,tmp+N+1); tnt=unique(tmp+1,tmp+N+1)-tmp-1; for ( int i=1;i<=N;i++) A[i]=lower_bound(tmp+1,tmp+tnt+1,A[i])-tmp; D1.Reset(tnt); D2.Reset(tnt); D3.Reset(tnt); D4.Reset(tnt); ANS=0; for ( int i=1;i<=N;i++){ D1.Modify(A[i],one); t=D1.Query(A[i]-1); D2.Modify(A[i],t); t=D2.Query(A[i]-1); D3.Modify(A[i],t); t=D3.Query(A[i]-1); D4.Modify(A[i],t); t=D4.Query(A[i]-1); ANS=ANS+t; } ANS.Print(); printf ( "\n" ); } return 0; } |
Do not go gentle into that good night.
Rage, rage against the dying of the light.
————Dylan Thomas
分类:
数据结构
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用