降智场
A. Tokitsukaze and All Zero Sequence
条件判断即可
B. Tokitsukaze and Good 01-String
我们应当考虑到每段均应为偶数,所以我们可以两个两个判断。。。
C. Tokitsukaze and Strange Inequality
应当考虑到固定$b,c$来进行循环,可以树状数组或者二位前缀和
二位前缀和:
#include <algorithm>
#include <bitset>
#include <map>
#include <vector>
#include <string>
#include <iostream>
#include <cmath>
#include <stack>
#include <set>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;
const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;
#define f(i, a, b) for (int i = a; i <= b; i++)
#define LL long long
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "w", stdout)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define sqr(x) (x) * (x)
#define pr1(x) printf("Case %d: ",x)
#define pn1(x) printf("Case %d:\n",x)
#define pr2(x) printf("Case #%d: ",x)
#define pn2(x) printf("Case #%d:\n",x)
#define lowbit(x) (x&(-x))
#define fi first
#define se second
#define sz(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
int s1[5009][5009],s2[5009][5009],tt,n;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>tt;
f(sb,1,tt){
cin>>n;
LL ans=0;
vi v(n+1);
f(i,1,n+2)f(j,1,n+2)s1[i][j]=s2[i][j]=0;
for(int i=1;i<=n;++i){
cin>>v[i];
s1[i][v[i]]+=1,s2[i][v[i]]+=1;
}
f(i,1,n+1)f(j,1,n+1)s1[i][j]+=s1[i-1][j];
f(i,1,n+1)f(j,1,n+1)s1[i][j]+=s1[i][j-1];
f(i,1,n+1)f(j,1,n+1)s2[i][j]+=s2[i][j-1];
for(int i=n+1;i;--i)f(j,1,n+1)s2[i][j]+=s2[i+1][j];
/*f(i,1,n){
f(j,1,n)cout<<s1[i][j]<<" \n"[j==n];
}
cout<<"\n-------\n";
f(i,1,n){
f(j,1,n)cout<<s2[i][j]<<" \n"[j==n];
}*/
f(i,2,n-2){
f(j,i+1,n-1){
// cout<<i<<"::"<<j<<"__";
//cout<<i<<","<<v[j]<<"::"<<j<<","<<v[i]<<"___";\
cout<<s2[j+1][v[i]-1]<<"::"<<s1[i-1][v[j]-1]<<"\n";
ans+=s2[j+1][v[i]-1]*s1[i-1][v[j]-1];
}
}
cout<<ans<<"\n";
}
return 0;
}
树状数组:
#include <algorithm>
#include <bitset>
#include <map>
#include <vector>
#include <string>
#include <iostream>
#include <cmath>
#include <stack>
#include <cstring>
#include <set>
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
*/
using namespace std;
const double eps = 1e-10;
const double pi = 3.1415926535897932384626433832795;
const double eln = 2.718281828459045235360287471352;
#define f(i, a, b) for (int i = a; i <= b; i++)
#define LL long long
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "w", stdout)
#define scan(x) scanf("%d", &x)
#define mp make_pair
#define pb push_back
#define sqr(x) (x) * (x)
#define pr1(x) printf("Case %d: ", x)
#define pn1(x) printf("Case %d:\n", x)
#define pr2(x) printf("Case #%d: ", x)
#define pn2(x) printf("Case #%d:\n", x)
#define lowbit(x) (x & (-x))
#define fi first
#define se second
#define sz(x) int((x).size())
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define summ(a) (accumulate(all(a), 0ll))
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
LL tt, n, x;
int cnt[(int)5e3 + 9][2];
struct Bit
{
long long a[(int)5e3 + 9];
void build()
{
memset(a, 0, sizeof(a));
}
void add(int p, int k)
{
while (p <= n)
{
a[p] += k;
p += lowbit(p);
}
}
long long query(int p)
{
long long res = 0;
while (p)
{
res += a[p];
p -= lowbit(p);
}
return res;
}
} b[2];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> tt;
f(sb, 1, tt)
{
memset(cnt, 0, sizeof(cnt));
LL ans = 0;
cin >> n;
vi v(n + 1);
b[1].build();
b[0].build();
for (int i = 1; i <= n; ++i)
{
cin >> v[i];
if(i==1)b[0].add(v[i],1);
if(i>=3)b[1].add(v[i],1);
}
for(int i=2;i<n-1;++i){
for(int j=i+1;j<n;++j){
b[1].add(v[j],-1);
ans+=b[0].query(v[j])*b[1].query(v[i]);
//cout<<i<<"::"<<j<<"__"<<b[0].query(v[j])<<"::"<<b[1].query(v[i])<<"\n";
}
for(int j=i+2;j<n;++j){
b[1].add(v[j],1);
}
b[0].add(v[i],1);
}
cout << ans << "\n";
}
return 0;
}