第二十二次csp认证-邻域均值

#include <bits/stdc++.h>

using namespace std;
#define R return
#define ll long long
#define main WinMain
#define MAX INT_MAX
#define MIN INT_MIN
#define vi vector<int>
#define vii vector<vector<int>>
#define all(x) x.begin(),x.end()
const ll mod = 1e9 + 7;

template<typename T>
bool isOdd(T num) {
    R num & 1;
}

template<typename T>
bool isEven(T num) {
    R !(num & 1);
}

ll cal(vi v) {
    vector<ll> t;
    for (auto it:v)
        t.push_back(it);
    R accumulate(all(t), 0);
}

int calMax(vi v) {
    R *max_element(all(v));
}

int calMin(vi v) {
    R *min_element(all(v));
}

template<typename T>
vector<vector<T>> prefix(vector<vector<T>> v) {
    vector<vector<T>> ret(v.size(), vector<T>(v[0].size()));
    for (int i = 0, val = 0; i < ret.size(); i++, val = 0)
        for (int j = 0; j < ret[i].size(); j++)
            val += v[i][j], ret[i][j] += i ? val + ret[i - 1][j] : val;
    R ret;
}

template<typename T>
vector<T> prefix(vector<T> v) {
    vector<T> ret(v.size());
    ll t = 0;
    for (int i = 0; i < ret.size(); i++)
        t += v[i], ret[i] = t;
//        ret[i] = ret[i - 1] + v[i - 1];
    R ret;
}

template<typename T>
T getPrefix(pair<T, T> a, pair<T, T> b, vector<vector<T>> v) {
    T val1 = a.first - 1 >= 0 && a.second - 1 >= 0 ? v[a.first - 1][a.second - 1] : 0;
    T val2 = a.second - 1 >= 0 ? v[b.first][a.second - 1] : 0;
    T val3 = a.first - 1 >= 0 ? v[a.first - 1][b.second] : 0;
    R v[b.first][b.second] - val2 - val3 + val1;
}

template<typename T>
void coutMat(vector<vector<T>> v) {
    for (auto it:v) {
        for (auto iter:it)
            cout << iter << "  ";
        cout << endl;
    }
    cout << endl;
}

template<typename T>
void coutArr(vector<T> v) {
    for (auto it:v)
        cout << it << "  ";
    cout << endl;
}

vi strToArr(string str) {
    int t = 0;
    vi ret;
    bool f = true;
    for (auto it:str) {
        if (isdigit(it)) {
            t = t * 10 + (it - '0');
        } else if (it == ',') {
            ret.push_back(f ? t : -t);
            f = true;
            t = 0;
        } else if (it == '-')
            f = false;
    }
    ret.push_back(f ? t : -t);
    R ret;
}

vector<char> strToCharArr(string s) {
    vector<char> ret;
    bool f = true;
    for (auto it:s) {
        if (it == '[')
            f = false;
        if ((isdigit(it) || isalpha(it)) && !f)
            ret.push_back(it);
    }
    R ret;

}

vector<vector<char>> strToCharMat(string s) {
    vector<vector<char>> ret;
    string t;
    bool f = true;
    for (auto it:s) {
        if (it == '[') {
            f = false;
            t += '[';
        } else if (it == ']' && !f) {
            ret.push_back(strToCharArr(t));
            f = true;
            t.clear();
        } else if (!f)
            t += it;
    }
    R ret;

}


vector<vector<int>> strToMat(string s) {
    vector<vector<int>> ret;
    string t;
    int l = 0, r = 0;
    for (int i = 0; i < s.size(); i++)
        if (s[i] == '[') {
            l = i + 1;
            break;
        }
    for (int i = s.size() - 1; i >= 0; i--) {
        if (s[i] == ']') {
            r = i - 1;
            break;

        }
    }

    for (int i = l; i <= r; i++) {
        if (s[i] == '[') {

            for (int j = i; j < s.size() && s[j] != ']'; j++, i = j) {
                t += s[j];
            }
            ret.push_back(strToArr(t));
            t.clear();
        }
    }
    R ret;
}

vector<string> strToStrArr(string s) {
    vector<string> ret;
    int l = 0, r = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '[')
            l = i;
        else if (s[i] == ']')
            r = i;
    }

    vector<int> v;
    for (int i = l + 1; i < r; i++) {
        if (s[i] == '"')
            v.push_back(i);

    }
    for (int i = 0; i < v.size(); i += 2) {
        ret.push_back(s.substr(v[i] + 1, v[i + 1] - v[i] - 1));
    }
    R ret;
}

vector<vector<string>> strToStrMat(string s) {
    vector<vector<string>> ret;
    string t;
    int l = -1, r = -1;
    for (int i = 0; i < s.size() && l == -1; i++)
        if (s[i] == '[')
            l = i;

    for (int i = s.size() - 1; i >= 0 && r == -1; i--)
        if (s[i] == ']')
            r = i;

    s = s.substr(l + 1, r - l - 1);
    vector<int> v;
    l = 0;
    for (int i = 0; i < s.size(); i++)
        if (s[i] == '[')
            l = i;
        else if (s[i] == ']')
            ret.push_back(strToStrArr(s.substr(l, i - l + 1)));
    R ret;

}

class UnionFind {
    vi parent;
    int cnt;
public:
    explicit UnionFind(int size) {
        cnt = size;
        parent.resize(size);
        for (int i = 0; i < size; i++)
            parent[i] = i;

    }

    int find(int x) {
        while (x != parent[x])
            parent[x] = parent[parent[x]], x = parent[x];
        R x;
    }

    void _union(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX == rootY)
            R;
        parent[rootX] = rootY;
        cnt--;
    }

    int getCount() const {
        R cnt;
    }

};

//#include "struct.h"
class Solution {
    vii v;
public:

    int neighbor(int n, int l, int r, int t) {
        v.resize(n, vi(n));
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                cin >> v[i][j];

//            计算前缀和
        vii pre = prefix(v);
//        coutMat(pre);
        int ret = 0;
        int idx = 1;
        for (int i = 0; i < n; i++/*, cout << endl*/) {
            for (int j = 0; j < n; j++) {
                int row1 = -r + i > 0 ? -r + i : 0;
                int col1 = -r + j > 0 ? -r + j : 0;
                int row2 = r + i < n ? r + i : n - 1;
                int col2 = r + j < n ? r + j : n - 1;
                int cnt = (row2 - row1 + 1) * (col2 - col1 + 1);
//                cout << cnt << "  ";

//                计算左上角坐标,右下角坐标
//                cout << idx++ << endl;
//                cout << "当前坐标->" << j << "," << i << endl;
//                cout << "(" << col1 << "," << row1 << ")" << endl;
//                cout << "(" << col2 << "," << row2 << ")" << endl;


//                计算两个点的坐标
                int val1 = col1 - 1 >= 0 && row1 - 1 >= 0 ? pre[row1 - 1][col1 - 1] : 0;
                int val2 = col1 - 1 >= 0 ? pre[row2][col1 - 1] : 0;
                int val3 = row1 - 1 >= 0 ? pre[row1 - 1][col2] : 0;
                int val = pre[row2][col2] - val2 - val3 + val1;
//                double d = (double)val / cnt;
                if ((double) val / cnt <= t) {
//                    cout << "i->" << i << ",j->" << j << "     cnt" << cnt << endl;
//                    cout << "(" << row1 << "," << col1 << ")" << endl;
//                    cout << "(" << row2 << "," << col2 << ")" << endl;
                    ret++;
//                } else if (val / cnt == t) {
//                    if (val % cnt == 0)
//                        ret++;

                }


            }
        }
        R ret;
//        cout << ret;


    }
};


///*
int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
//#include "struct.h"

//a 97
//A 65
    Solution obj;
    int n, l, r, t;
    cin >> n >> l >> r >> t;
    cout << obj.neighbor(n, l, r, t);
//    cout << "hello world";


    string s = "         arr      [5,6,4,3,1,2]      ";
    string s10 = "[6,3,3,1,4,5,3,4,1,3,4]";
    vector<int> v = strToArr(s);
    vector<int> v10 = strToArr(s10);
    //    coutArr(v);

    pair<int, int> v13[10];
    for (int i = 0; i < 10; i++) {
        v13[i] = make_pair(i, i + 10);
    }
//    for (auto[a, b]:v13) {
//        cout << a << "  " << b << endl;
//    }


    string s1 = "         mat                        ";
    vector<vector<int>> v2 = strToMat(s1);
//    vii v3{{},
//           {0},
//           {1, 3},
//           {2}};

    //        coutMat(v2);







//
    string s3 = "     char   arr                                         ";
    vector<char> v5 = strToCharArr(s3);
//    coutArr(v5);








    string s4 = "        char     mat                                            ";
    vector<vector<char>> v6 = strToCharMat(s4);
//    coutMat(v6);





    string s5 = "           str     arr                                    ";
    vector<string> v7 = strToStrArr(s5);
//    coutArr(v7);






    string s6 = "        str   mat                                        ";
    vector<vector<string>> v8 = strToStrMat(s6);
//    coutMat(v8);






    R 0;
}
/*





  */
//*/
#undef main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值