Tokitsukaze and Strange Inequality Codeforces Round #789 (Div. 2) C
作者:互联网
复盘
前缀和的姿势增加了
前缀和的作法是处理下 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; }
标签:typedef,const,int,789,long,Codeforces,Tokitsukaze,include,define 来源: https://www.cnblogs.com/magicat/p/16248802.html