头像

Lumen3ever




离线:2天前


最近来访(51)
用户头像
Kh2023
用户头像
松鼠会
用户头像
带有细胞壁的未知生物
用户头像
汪汪队
用户头像
宇哥
用户头像
有野心的内向男人
用户头像
TRswag
用户头像
甜菜丘
用户头像
kzyz
用户头像
Baiye959
用户头像
yxc
用户头像
outlier_3
用户头像
翎枫寂然ん
用户头像
Updater
用户头像
吉不拉几_7
用户头像
用户头像
Acwer
用户头像
shh_1
用户头像
菜鸡不配有昵称
用户头像
Ethereum


就是编译原理的东西 悔不当初啊

//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PII;

unordered_map<int, vector<PII>> attr_u; // key -> vector<int, int> -> first : user second : val 

int n, m;


vector<int> base_expr() {
    int key, val;
    char op;
    vector<int> res;
    cin >> key >> op >> val;
    if(op == ':') {
        for(auto &x: attr_u[key]) {
            if(x.second == val) {
                res.push_back(x.first);
            }
        }
    } else {
        for(auto &x : attr_u[key]) {
            if(x.second != val) {
                res.push_back(x.first);
            }
        }
    }
    return res;
}

vector<int> expr() {
    char c;
    cin >> c;
    vector<int> res;
    if(isdigit(c)) {
        cin.unget();
        res = base_expr(); 
    } else {
        char ch;
        cin >> ch; assert(ch == '(');
        auto a = expr();
        cin >> ch; assert(ch == ')');
        cin >> ch; assert(ch == '(');
        auto b = expr();
        cin >> ch; assert(ch == ')');
        if(c == '&') {
            set_intersection(a.begin(), a.end(), b.begin(), b.end(), inserter(res, res.begin()));
        } else if(c == '|') {
            set_union(a.begin(), a.end(), b.begin(), b.end(), inserter(res, res.begin()));
        }
    }
    return res;
}


void print(vector<int> res) {
    for(auto &x: res) {
        cout << x << ' ';
    }
    cout << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i = 0; i < n; i++) {
        int dn, cnt;
        cin >> dn >> cnt;
        for(int j = 0; j < cnt; j++) {
            int key, val;
            cin >> key >> val;
            attr_u[key].push_back({dn, val});
        }
    }
    auto cmp = [](const PII &a, const PII &b) {
        return a.first < b.first;
    };
    for(auto &v : attr_u) {
        sort(v.second.begin(), v.second.end(), cmp);
    }
    cin >> m;
    while(m--) {
        print(expr());
    }
    return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~


活动打卡代码 AcWing 5018. LDAP

就是编译原理的东西 悔不当初啊

//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PII;

unordered_map<int, vector<PII>> attr_u; // key -> vector<int, int> -> first : user second : val 

int n, m;


vector<int> base_expr() {
    int key, val;
    char op;
    vector<int> res;
    cin >> key >> op >> val;
    if(op == ':') {
        for(auto &x: attr_u[key]) {
            if(x.second == val) {
                res.push_back(x.first);
            }
        }
    } else {
        for(auto &x : attr_u[key]) {
            if(x.second != val) {
                res.push_back(x.first);
            }
        }
    }
    return res;
}

vector<int> expr() {
    char c;
    cin >> c;
    vector<int> res;
    if(isdigit(c)) {
        cin.unget();
        res = base_expr(); 
    } else {
        char ch;
        cin >> ch; assert(ch == '(');
        auto a = expr();
        cin >> ch; assert(ch == ')');
        cin >> ch; assert(ch == '(');
        auto b = expr();
        cin >> ch; assert(ch == ')');
        if(c == '&') {
            set_intersection(a.begin(), a.end(), b.begin(), b.end(), inserter(res, res.begin()));
        } else if(c == '|') {
            set_union(a.begin(), a.end(), b.begin(), b.end(), inserter(res, res.begin()));
        }
    }
    return res;
}


void print(vector<int> res) {
    for(auto &x: res) {
        cout << x << ' ';
    }
    cout << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i = 0; i < n; i++) {
        int dn, cnt;
        cin >> dn >> cnt;
        for(int j = 0; j < cnt; j++) {
            int key, val;
            cin >> key >> val;
            attr_u[key].push_back({dn, val});
        }
    }
    auto cmp = [](const PII &a, const PII &b) {
        return a.first < b.first;
    };
    for(auto &v : attr_u) {
        sort(v.second.begin(), v.second.end(), cmp);
    }
    cin >> m;
    while(m--) {
        print(expr());
    }
    return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~



//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 100010;
int a[N], n, m;
int c[2][N], sum[N];

int ask(int k, int x) {
    int res = 0;
    for(; x; x -= x & -x) res += c[k][x];
    return res;
}

void add(int k, int x, int y) {
    for(; x <= n; x += x & -x) {
        c[k][x] += y;
    }
}

signed main() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        sum[i] = sum[i - 1] + a[i];
    }

    while(m--) {
        char op[2];
        int l, r, d;
        cin >> op >> l >> r;
        if(op[0] == 'C') {
            cin >> d;
            add(0, l, d);
            add(0, r + 1, -d);
            add(1, l, l * d);
            add(1, r + 1, -(r + 1) * d);
        } else {
            cout << sum[r] + (r + 1) * ask(0, r) - ask(1, r) - (sum[l - 1] + l * ask(0, l - 1) - ask(1, l - 1)) << '\n';
        }
    }
    return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~



//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;

const int N = 100010;
int b[N], a[N];
int n, m;

void add(int i, int x) {
    for(; i < N; i += i & -i) b[i] += x; 
}

int ask(int i) {
    int res = 0;
    for(; i; i -= i & -i) res += b[i];
    return res;
}

int main() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];
    while(m--) {
        char op;
        cin >> op;
        if(op == 'Q') {
            int x;
            cin >> x;
            cout << ask(x) + a[x] << '\n';
        } else if(op == 'C') {
            int l, r, d;
            cin >> l >> r >> d;
            add(l, d);
            add(r + 1, -d);
        }
    }
    return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~


活动打卡代码 AcWing 241. 楼兰图腾

//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int N = 200010;
int tr[N], tl[N];
int a[N];

int r1[N], l1[N], r2[N], l2[N];
int n;

void add(int i, int x, int h[]) {
    for(; i < N; i += i & -i) h[i] += x;
}

int ask(int i, int h[]) {
    int res = 0;
    for(; i; i -= i & -i) res += h[i];
    return res;
}

signed main() {
    cin >> n;
    int maxa = 0;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        maxa = max(maxa, a[i]);
    }
    for(int i = n; i; i--) {
        r1[i] = ask(maxa, tr) - ask(a[i], tr);
        add(a[i], 1, tr);
    }

    for(int i = 1; i <= n; i++) {
        l1[i] = ask(maxa, tl) - ask(a[i], tl);
        add(a[i], 1, tl);
    }

    memset(tr, 0, sizeof tr);
    memset(tl, 0, sizeof tl);
    for(int i = n; i; i--) {
        r2[i] = ask(a[i] - 1, tr);
        add(a[i], 1, tr);
    }

    for(int i = 1; i <= n; i++) {
        l2[i] = ask(a[i] - 1, tl);
        add(a[i], 1, tl);
    }
    int rr = 0, rl = 0;
    for(int i = 1; i <= n; i++) rr += r1[i] * l1[i];
    for(int i = 1; i <= n; i++) rl += r2[i] * l2[i];
    cout << rr << ' ' << rl;

    return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~



Lumen3ever
2个月前
//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;

const int N = 100010;
int n;
int a[N];

int main() {
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        a[i] += a[i - 1];
    }

    if(a[n] % 3) {
        cout << "0\n";
        return 0;
    }

    long long res = 0, cnt = 0;
    for(int i = 1; i < n; i++) {
        if(a[i] == 2 * a[n] / 3) res += cnt;
        if(a[i] == a[n] / 3) cnt++;
    }

    cout << res << '\n';
    return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~



Lumen3ever
2个月前
//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;

const int N = 1010;
int n, m;
int l[N]; // l[i]表示计算节点i在可用区l[i]中
int cnt[N]; // 表示计算节点运行的任务数量
unordered_map<int, vector<int>> app; // app[a] = {2, 3}表示应用a占用节点2,3
bool paa_st[N]; // paa_st[i]表示第i个计算节点上是否有paa应用
bool pa_st[N]; // pa[i]表示第i个计算节点上是否有pa应用

int find(int na, int pa, int paa, int paar) {
    // 过滤阶段
    // 过滤出所有满足要求的点
    // na == 0则不用过滤 na > 0则计算节点需要满足 l[i] == na
    // pa == 0不用过滤 pa > 0表示必须和编号为pa的应用在同一个可用区运行
    // paa == 0则不用过滤 paa > 0计算任务反亲和性 表示任务不能和应用编号为paa的任务在同一个计算节点上运行
    // paar == 0表示尽量满足 paar == 1表示必须满足

    memset(paa_st, false, sizeof paa_st);
    memset(pa_st, false, sizeof pa_st);
    if(paa) {
        for(auto x : app[paa]) {
            paa_st[x] = true; // 表示x节点上有运行paa应用
        }
    }

    if(pa) {
        for(auto x : app[pa]) {
            pa_st[l[x]] = true;
        }
    }

    // 排序阶段 
    // 选择此时任务数量最少的结点
    // 选择此时编号最小的结点
    int ret = -1, c = 0x3f3f3f3f; 
    for(int i = 1; i <= n; i++) {
        if(cnt[i] < c && (na == 0 || l[i] == na) && (paa == 0 || paa_st[i] == false) && (pa == 0 || pa_st[l[i]])) {
            ret = i;
            c = cnt[i];
        }
    }

    if(paar == 0) {
        if(ret == -1) {
            for(int i = 1; i <= n; i++) {
                if(cnt[i] < c && (na == 0 || l[i] == na) && (pa == 0 || pa_st[l[i]])) {
                    ret = i;
                    c = cnt[i];
                }
            }
        }
    }
    return ret;
}

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%d", &l[i]);
    int g;
    scanf("%d", &g);
    while(g--) {
        int f, a, na, pa, paa, paar;
        scanf("%d%d%d%d%d%d", &f, &a, &na, &pa, &paa, &paar);
        vector<int> ans;
        for(int i = 0; i < f; i++) {
            int x = find(na, pa, paa, paar); // 找到符合条件的计算节点编号
            if(x == -1) ans.push_back(0);
            else {
                ans.push_back(x);
                cnt[x]++; // 计算节点x的任务数+1
                app[a].push_back(x); // 应用a需要占用x计算节点
            }
        }
        for(auto x : ans) {
            printf("%d ", x);
        }
        cout << '\n';
    }
    return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~


活动打卡代码 AcWing 4511. 角色授权

Lumen3ever
2个月前
//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;

int n, m, q;

unordered_map<string, vector<string>> Usermap;
unordered_map<string, vector<string>> Groupmap;

typedef struct Role {
    unordered_map<string, bool> opList; // 操作清单
    unordered_map<string, bool> typeList; // 资源种类清单
    unordered_map<string, bool> nameList; // 资源名称清单
}role;

unordered_map<string, role> roles;

int main() {
    scanf("%d%d%d", &n, &m, &q);
    while(n--) { // n个角色
        role r;
        string rname; // 角色名称
        cin >> rname;
        int nv, no, nn;
        scanf("%d", &nv);
        while(nv--) {
            string op;
            cin >> op;
            r.opList[op] = true;
        }
        scanf("%d", &no);
        while(no--) {
            string type;
            cin >> type;
            r.typeList[type] = true;
        }
        scanf("%d", &nn);
        while(nn--) {
            string name;
            cin >> name;
            r.nameList[name] = true;
        }
        roles[rname] = r;
    }

    while(m--) {
        string rname;
        cin >> rname;
        int ns;
        scanf("%d", &ns);
        while(ns--) {
            char c;
            string obj;
            cin >> c >> obj;
            if(c == 'g') Groupmap[obj].push_back(rname);
            else Usermap[obj].push_back(rname);
        }
    }
    vector<string> groups;
    while(q--) {
        groups.clear();
        string username, op, type, sname;
        int ng;
        cin >> username >> ng;
        while(ng--) {
            string groupname;
            cin >> groupname;
            groups.push_back(groupname);
        }
        cin >> op >> type >> sname;
        bool flag = false;
        for(int i = 0; Usermap.count(username) && i < Usermap[username].size(); i++) {
            string user = Usermap[username][i];
            if(roles[user].opList.count("*") == 0 && roles[user].opList.count(op) == 0) continue;
            if(roles[user].typeList.count("*") == 0 && roles[user].typeList.count(type) == 0) continue;
            if(roles[user].nameList.size() != 0 && roles[user].nameList.count(sname) == 0) continue;
            else {
                flag = true;
                break;
            }
        }

        for(int i = 0; !flag && i < groups.size(); i++) {
            string group = groups[i];
            if(Groupmap.count(group) == 0) continue;
            for(int j = 0; j < Groupmap[group].size(); j++) {
                string user = Groupmap[group][j];
                if(roles[user].opList.count("*") == 0 && roles[user].opList.count(op) == 0) continue;
                if(roles[user].typeList.count("*") == 0 && roles[user].typeList.count(type) == 0) continue;
                if(roles[user].nameList.size() != 0 && roles[user].nameList.count(sname) == 0) continue;
                else {
                    flag = true;
                    break;
                }
            }
        }
        if(flag) cout << "1\n";
        else cout << "0\n";
    }
    return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~


活动打卡代码 AcWing 4701. 防疫大数据

Lumen3ever
2个月前

accept

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_map>
#include <vector>
#include <set>

using namespace std;
int n;
const int N = 1010;

struct F{
    int begin;
    int end;
};

struct G{
    int d;
    int u;
    int r;
};

unordered_map<int, F> region;
vector<G> vi[N];
unordered_map<int, set<int>> v;


int main()
{
    scanf("%d", &n);

    for(int i = 0; i < n; i ++)
    {
        int r, m;
        scanf("%d%d", &r, &m);
        for(int j = 0; j < r; j ++)
        {
            int x;
            scanf("%d", &x);
            if(!region.count(x) || i > region[x].end + 1)
                region[x].begin = i;
            region[x].end = i + 6;
        }

        for(int j = 0; j < m; j ++)
        {
            int d, u, re;
            scanf("%d%d%d", &d, &u, &re);

            //地区有风险并且这个人到达的时刻在该地区正处于风险中
            if(region.count(re) && region[re].begin <= d && d <= region[re].end){
                vi[i].push_back({d, u, re});
            }
        }

        // 前6天找 
        for (int j = max(0, i - 6); j <= i; j ++) {
            for (int t = 0; t < vi[j].size(); t ++) {
                G g = vi[j][t];
                // 当前漫游信息的日期~第i日:地区都是有风险
                if (region[g.r].end >= i && g.d >= i - 6 && g.d >= region[g.r].begin) 
                    v[i].insert(g.u);
            }
        }
    }

    for(int i = 0; i < n; i ++)
    {
        if(i) printf("\n%d ", i);
        else printf("%d ", i);

        for(auto j = v[i].begin(); j != v[i].end(); j ++) printf("%d ", *j);
    }

    return 0;
}


活动打卡代码 AcWing 3195. 有趣的数

Lumen3ever
2个月前
//这里填你的代码^^
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1010, mod = 1e9 + 7;
int n;
int st[N][6];

signed main() {
    scanf("%lld", &n);
    for(int i = 1; i <= n; i++) {
        int j = i - 1;
        st[i][0] = 1;
        st[i][1] = (st[j][0] + st[j][1] * 2) % mod;
        st[i][2] = (st[j][0] + st[j][2]) % mod;
        st[i][3] = (st[j][1] + st[j][3] * 2) % mod;
        st[i][4] = (st[j][1] + st[j][2] + st[j][4] * 2) % mod;
        st[i][5] = (st[j][3] + st[j][4] + st[j][5] * 2) % mod;
    }

    printf("%lld\n", st[n][5]);
    return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~