复盘
前缀和的姿势增加了
前缀和的作法是处理下 a,c b,d
计算当c为第i个时, l[c][a] 为满足条件个数 c取 1 ~ n-1 a取1 ~ c-1 注意循环的顺序的
当b为第i个时 r[b][d] 为满足条件的个数 b取 2 ~ n j取 n ~ b+1 注意循环的顺序
最后枚举bc
b 2 ~ n-2
c b+1 ~ n-1
这时候由于有前缀和处理,l[c][b+1]就是满足条件pa<pc的数量
r[b][c+1]就是满足条件pb>pd的数量
实现见代码
正解
// AC one more times
#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include<string>
#include<string.h>
#include <cstring>
#include <complex>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <list>
#include <bitset>
#include <assert.h>
#include <unordered_set>
#include <unordered_map>
#include <iomanip>
#include <random>
#include <iterator>
#include <time.h>
#define fi first
#define se second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<long long,long long> PLL;
#define inf64 0x3f3f3f3f3f3f3f3f
const int inf = 0x3f3f3f3f;
const int maxn = 2e6 + 6;
const double eps = 1e-8;
const long long mod = 1000000;
template<typename T>
void init(T q[], int n, T val){ for (int i = 0; i <= n; i++) q[i] = val; }
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
bool cmp(int c, int d) { return c > d; }
int n,a[5010],l[5010][5010],r[5010][5010];
void solve()
{
LL ans=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n+1;i++) for(int j=1;j<=n+1;j++) r[i][j]=0;
for(int i=1;i<=n-1;i++)
for(int j=1;j<i;j++)
l[i][j]=l[i][j-1]+(a[j]<a[i]);
for(int i=n;i>=2;i--)
for(int j=n;j>i;j--)
r[i][j]=r[i][j+1]+(a[i]>a[j]);
for(int i=2;i<=n-2;i++)
for(int j=i+1;j<=n-1;j++)
ans+=l[j][i-1]*r[i][j+1];
cout<<ans<<endl;
}
int main()
{
std::ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
int T;cin>>T;
while(T--)
solve();
return 0;
}
暴力:TLE5 的
// AC one more times
#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include<string>
#include<string.h>
#include <cstring>
#include <complex>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <list>
#include <bitset>
#include <assert.h>
#include <unordered_set>
#include <unordered_map>
#include <iomanip>
#include <random>
#include <iterator>
#include <time.h>
#define fi first
#define se second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<long long,long long> PLL;
#define inf64 0x3f3f3f3f3f3f3f3f
const int inf = 0x3f3f3f3f;
const int maxn = 2e6 + 6;
const double eps = 1e-8;
const long long mod = 1000000;
template<typename T>
void init(T q[], int n, T val){ for (int i = 0; i <= n; i++) q[i] = val; }
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
bool cmp(int c, int d) { return c > d; }
void solve()
{
int n;
int s[5010];
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
int ans=0;
vector<PII> a;
vector<PII> b;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(s[j]>s[i]) a.pb({i,j}); //a c
if(s[i]>s[j]) b.pb({i,j}); //b d
}
}
for(auto &it:a)
{
for(auto &iter:b)
{
if(iter.first>=it.second) break;
if(it.first<iter.first&&it.second>iter.first&&iter.second>it.second)
ans++;
}
}
cout<<ans<<endl;
}
int main()
{
std::ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
int T;cin>>T;
while(T--)
solve();
return 0;
}
本文来自博客园,作者:magicat,转载请注明原文链接:https://www.cnblogs.com/magicat/p/16248802.html