Codeforces Round #789 (Div. 2)

降智场

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;
}
上一篇
下一篇