Codeforces Round #789 (Div. 2) C. Tokitsukaze and Strange Inequality
题目大意:
给出一个长度为n的排列,让你找出有多少种四元组[a, b, c, d] 满足
输出数量。 T <= 1000 , n<=5000
题目思路:
显然a与c相关,b与d相关,那么只要能预处理出a与c的状态便可以直接求解答案
考虑线性dp求方案,直接硬枚举每个a与c, 对于每个a,记录一下a为i时候的所有满足条件的j,放进f[i][j],然后再让f[i][j] += f[i -1][j] (因为求得是所有包括i与j之前的方案数)
然后再枚举b, d直接判断求答案即可, 对于i为d, j为b,满足条件时,ans += f[i - 1][j - 1]
时间复杂度 O(n^2) pretest 93ms/124ms
memset让我爆T两发(T_T) 后来发现好像都是直接从0的状态转移来的,初始化0即可。
#include <bits/stdc++.h> //#define int long long #define endl '\n' using namespace std; typedef long long LL; const int N = 5010; LL f[N][N]; int q[N]; signed main() { int T; cin>>T; while(T--) { //memset(f, 0, sizeof f); int n; cin>>n; for(int i = 1; i <= n; i++) scanf("%d", &q[i]); for(int i = 0; i <= n; i++) f[0][i] = 0, f[1][i] = 0; for(int i = 2; i <= n; i++) { int tem = 0; for(int j = 1; j <= i - 2; j++) { if(q[i] > q[j]) tem++; f[i][j] = f[i - 1][j] + tem; } } LL ans = 0; for(int i = 4; i <= n; i++) for(int j = 2; j <= i - 2; j++) if(q[i] < q[j]) ans += f[i - 1][j - 1]; cout<<ans<<endl; } }
这题的做法好像很多... 群里大佬线段树,树状数组,二分什么的都有
作者:@lviy_ptilopsis_
本文为作者原创,转载请注明出处:https://www.cnblogs.com/lviy/p/16250396.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)