湖南省第十七届大学生计算机程序设计竞赛

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

const int N =20;
int t1,t2;
typedef  struct Description{
    
    
    int minute;
    int number;
    int snumber;
};
Description team[N];
void fun(int c,int d){
    
    
    if(c>d)
        team[t1].minute+=3,
        team[t1].number+=c-d,
        team[t2].number+=d-c,
        team[t1].snumber+=c,
        team[t2].snumber+=d;
    else
    if(c==d)
        team[t1].minute+=1,
        team[t2].minute+=1,
        team[t1].snumber+=c,
        team[t2].snumber+=d;
    else
        team[t2].minute+=3,
        team[t1].number+=c-d,
        team[t2].number+=d-c,
        team[t1].snumber+=c,
        team[t2].snumber+=d;
}
int main(){
    
    
    int t;
    cin>>t;
    while (t--){
    
    

        for (int i = 1; i <=15; ++i) {
    
    
            char a,b;
            int c,d,e,f;
            cin >>a>>b>>c>>d>>e>>f;
             t1=a-'A'+1;
             t2=b-'A'+1;
            fun(c,d);
            fun(e,f);
        }
        for (int i = 1; i <=6; ++i) {
    
    
            cout<<team[i].minute<<' '<<team[i].number<<' '<<team[i].snumber<<endl;
        }
    }

}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

int main() {
    
    
    int n, m, r, c, x;
    while(cin >> n >> m >> r >> c >> x) {
    
    
        int p1 = r * c - 1;
        int p2 = (n - r + 1) * (m - c + 1) - 1;
        if(p1 > x - 1 || p2 > (n  * m - x)) {
    
    
            cout << "No\n";
        } else {
    
    
            cout << "Yes\n";
        }
    }
    return 0;
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

void slove(int n) {
    
    
    vector<int> a(n);
    set<int> s;
    for(int i=0;i<n;i++) {
    
    
        cin >> a[i];
        s.insert(a[i]);
    }

    for(int i=0;i<n;i++) {
    
    
        for(int j=i+1;j<n;j++) {
    
    
            if((a[i] + a[j]) % 2 == 0 ) {
    
    
                int x = (a[i] + a[j]) / 2;
                if(s.count(x)) {
    
    
                    s.erase(s.find(x));
                }
            }
        }
    }
    cout << n - s.size() << '\n';
}
int main() {
    
    
    int n;
    while(cin >> n) {
    
    
        slove(n);
    }

    return 0;
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int mod = 1e9 + 7;

void slove(int n, int m) {
    
    

    vector<LL> inv(n + m + 1);
    inv[0] = inv[1] = 1;
    for(int i = 2; i <= n + m; i ++ ) {
    
    
        inv[i] = mod - mod / i * inv[mod % i] % mod;
    }

    LL res = 1, ans = 0;
    for(int i=1;i<=m;i++) {
    
    
        res = res * i % mod;
    }

    ans = (ans + res) % mod;
    for(int i=2;i<=n;i++) {
    
    
        res = res * inv[i - 1] % mod * (i + m - 1) % mod;
        ans = (ans + res) % mod;
    }

    cout << ans << '\n';

}
int main() {
    
    
    int n, m;
    while(cin >> n >> m) {
    
    
        slove(n, m);
    }

    return 0;
}


在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int mod = 1e9 + 7;

int norm(int x) {
    
    
    if (x < 0) {
    
    x += mod;}
    if (x >= mod) {
    
    x -= mod;}
    return x;
}
template<class T>
T ksm(T x,LL y){
    
    
    T res = 1;
    for(;y;y>>=1){
    
    
        if(y&1)
            res = res*x;
        x=x*x;
    }
    return res;
}
struct modint {
    
    
    int x;
    modint(int x = 0) : x(norm(x)) {
    
    }
    modint(LL x) : x(norm((int)(x%mod))) {
    
    }
    int val() const {
    
    return x;}
    modint operator-() const {
    
    return modint(norm(mod - x));}
    modint inv() const {
    
    assert(x != 0);return ksm(*this, mod - 2);}
    modint &operator*=(const modint &rhs) {
    
    x = LL(x) * rhs.x % mod;return *this;}
    modint &operator+=(const modint &rhs) {
    
    x = norm(x + rhs.x);return *this;}
    modint &operator-=(const modint &rhs) {
    
    x = norm(x - rhs.x);return *this;}
    modint &operator/=(const modint &rhs) {
    
    return *this *= rhs.inv();}
    friend modint operator*(const modint &lhs, const modint &rhs) {
    
    modint res = lhs;res *= rhs;return res;}
    friend modint operator+(const modint &lhs, const modint &rhs) {
    
    modint res = lhs;res += rhs;return res;}
    friend modint operator-(const modint &lhs, const modint &rhs) {
    
    modint res = lhs;res -= rhs;return res;}
    friend modint operator/(const modint &lhs, const modint &rhs) {
    
    modint res = lhs;res /= rhs;return res;}
    friend std::istream &operator>>(std::istream &is, modint &a) {
    
    LL v;is >> v;a = modint(v);return is;}
    friend std::ostream &operator<<(std::ostream &os, const modint &a) {
    
    return os << a.val();}
};
void slove(int n) {
    
    
    vector<int> a(n);
    for(int i=0;i<n;i++) {
    
    
        cin >> a[i];
    }

    int cnt = 0;
    vector<int> siz(n + 1), l(n + 1), r(n + 1), val(n + 1);

    function<int(int, int)> dfs = [&](int rt, int x) {
    
    
        if(!rt) {
    
    
            rt = ++ cnt;
            siz[rt] = 1;
            val[rt] = x;
            return rt;
        }
        siz[rt] ++;
        if(x < val[rt]) {
    
    
            l[rt] = dfs(l[rt], x);
        } else {
    
    
            r[rt] = dfs(r[rt], x);
        }
        return rt;
    };

    dfs(0, a[0]);
    for(int i=1;i<n;i++) {
    
    
        dfs(1, a[i]);
    }

    vector<modint> fac(n + 1), ifac(n + 1);
    fac[0] = 1;
    for(int i=1;i<=n;i++) {
    
    
        fac[i] = fac[i - 1] * i;
    }
    ifac[n] = fac[n].inv();
    for(int i=n-1;i>=0;i--) {
    
    
        ifac[i] = ifac[i + 1] * (i + 1);
    }

    auto C = [&] (int x, int y) -> modint{
    
    
        return fac[x] * ifac[x - y] * ifac[y];
    };

    function<modint(int)> dfs1 = [&] (int rt) -> modint {
    
    
        if(rt == 0) {
    
    
            return 1;
        }
        return dfs1(l[rt]) * dfs1(r[rt]) * C(siz[l[rt]] + siz[r[rt]], siz[l[rt]]);
    };

    cout << dfs1(1) << '\n';

}
int main() {
    
    
    int n;
    while(cin >> n) {
    
    
        slove(n);
    }
    return 0;
}


在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define se second

void slove(string s, int d) {
    
    
    string ans = s;
    vector<stack<int>> st(10); // 栈
    vector<priority_queue<pii, vector<pii>, greater<pii>>> pq(10);
    vector<vector<int>> a(10);
    d ++;
    int n = s.size();
    for(int i = 1;i <= min(d, n - 1); i ++) {
    
    
        st[s[i] - '0'].push(i);
    }

    vector<int> vis(n); // 标记是否被交换
    for(int i = 0; i < n; i ++) {
    
     // 第一遍找出每个元素的交换数字
        if(i > 0 && i + d < n) {
    
    
            st[s[i + d] - '0'].push(i + d);
        }
        if(!vis[i]) {
    
    
            for(int j = 9; j > s[i] - '0'; j --) {
    
    
                if(!st[j].empty() && st[j].top() > i) {
    
    
                    vis[st[j].top()] = 1;
                    a[j].push_back(i); // 预定
                    st[j].pop();
                    break;
                }
            }
        }
    }

    for(int i = n - 1; i >= 0; i --) {
    
     // 交换已经确定,选择更加好的交换 越后面的换越小的
        if(vis[i]) {
    
     // 这个需要交换
            int x = s[i] - '0';
            while(a[x].size() && a[x].back() + d >= i) {
    
    
                int w = a[x].back();
                pq[x].push({
    
    s[w] - '0', w});
                a[x].pop_back();
            }
            auto y = pq[x].top();
            pq[x].pop();
            swap(ans[y.se], ans[i]);
        }

    }

    cout << ans << '\n';
}
int main() {
    
    
    string s;
    int d;
    while(cin >> s >> d) {
    
    
        slove(s, d);
    }

    return 0;
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define all(x) (x).begin(),(x).end()
const int di[]={
    
    -1, 0, 1, 0, -1};

void slove(int n, int m) {
    
    

    vector<vector<char>> a(n, vector<char>(m, 0));

    int sx = 0, sy = 0; // 起始点
    for(int i=0;i<n;i++) {
    
    
        for(int j=0;j<m;j++) {
    
    
            cin >> a[i][j];
            if((i == 0 || i == n - 1 || j == 0 || j == m - 1) && a[i][j] == '.') {
    
    
                sx = i, sy = j;
            }
        }
    }

    vector<vector<int>> vis(n, vector<int>(m, 0));
    auto vis1 = vis;

    int cnt = 0;
    vector<int> res(30);//是否是陷阱
    vector<vector<int>> g(30), bi(n, vector<int>(m, -1)); // 建图以及编号数组
    vector<pii> id(30);// 每个编号对应坐标
    bi[sx][sy] = 0; // 起始点看做一个点
    id[0] = {
    
    sx, sy};
    // 先标号
    for(int i=0;i<n;i++) {
    
    
        for(int j=0;j<m;j++) {
    
    
            if(a[i][j] != '.' && a[i][j] != '#') {
    
    
                bi[i][j] =  ++ cnt;
                id[cnt] = {
    
    i, j};
                res[cnt] = (a[i][j] == 'X');
            }
        }
    }

    function<void(int, int, int)> dfs1 = [&] (int id, int x, int y) {
    
    
        vis[x][y] = 1;
        for(int k = 0; k < 4; k ++) {
    
    
            int tx = x + di[k];
            int ty = y + di[k + 1];
            if(tx < 0 || tx >= n || ty < 0 || ty >= m || vis[tx][ty] || a[tx][ty] == '#') {
    
    
                continue;
            }

            if(bi[tx][ty] != -1) {
    
    
                g[id].push_back(bi[tx][ty]);
                continue;
            }
            dfs1(id, tx, ty);
        }
    };

    for(int i=0;i<n;i++) {
    
    
        for(int j=0;j<m;j++) {
    
    
            if(bi[i][j] >= 0) {
    
     // 建图
                vis = vis1;
                dfs1(bi[i][j], i, j);
            }
        }
    }

    cnt ++;

    vector<vector<int>> f(1 << cnt, vector<int>(cnt, -1)); // 遍历过的点的状态, 当前点
    vector<int> vis2(30);
    int ans = 0;

    function<void(int, int)> dfs2 = [&] (int s, int x) {
    
    
        if(f[s][x] != -1) {
    
     //这个状态遍历过
            return ;
        }
        f[s][x] = 1;
        if(x == 0) {
    
     // 走到了出口
            int res1 = 0;
            fill(all(vis2), 0);
            for(int i=1;i<cnt;i++) {
    
    
                if((s >> i) & 1) {
    
    
                    if(!res[i]) res1 ++ ;
                    auto [wx, wy] = id[i];
                    for(int k = 0; k < 4 ;k ++) {
    
     // 找每个点周围的宝藏
                        int tx = wx + di[k];
                        int ty = wy + di[k + 1];
                        if(tx < 0 || tx >=n || ty < 0 || ty >= m || a[tx][ty] != '@') {
    
    
                            continue;
                        }
                        int si = bi[tx][ty];
                        if(!((s >> si) & 1) && !vis2[si]) {
    
    
                            res1 ++;
                            vis2[si] = 1;
                        }
                    }
                }
            }
            ans = max(ans, res1);
        }

        for(auto y : g[x]) {
    
    
            if(((s >> y) & 1) && res[y]) {
    
     // 陷阱不能重复走
                continue;
            }
            dfs2(s | (1 << y), y);
        }

    };

    dfs2(1, 0);

    cout << ans << '\n';

}
int main() {
    
    
    int n, m;
    while( cin >> n >> m) {
    
    
        slove(n, m);
    }

    return 0;
}

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

typedef double db;
typedef pair<db, db> PDD;

#define fi first
#define se second

db r1, r2;
struct Point {
    
    
    db x, y, z;
    Point(db _x = 0.0, db _y = 0.0, db _z = 0.0) : x(_x), y(_y), z(_z) {
    
    }
    Point operator-(const Point &m) const {
    
    
        return Point(x - m.x, y - m.y, z - m.z);
    }
    Point operator+(const Point &m) const {
    
    
        return Point(x + m.x, y + m.y, z + m.z);
    }
    Point operator^(const Point &m) const {
    
    
        return Point(y * m.z - z * m.y, z * m.x - x * m.z, x * m.y - y * m.x);
    }
    db operator*(const Point &m) const {
    
     return x * m.x + y * m.y + z * m.z; }
    db len() {
    
     return sqrt(x * x + y * y + z * z); }
    friend istream &operator>>(istream &in, Point &m) {
    
    
        in >> m.x >> m.y >> m.z;
        return in;
    }
} O1, O2, V1, V2;

db U(PDD A, PDD B) {
    
    
    db res = min(A.se, B.se) - max(A.fi, B.fi);
    return res < 0 ? 0 : res;
}

db mat[5][5];
void gauss(int n) {
    
    
    for (int now = 1, to, i = 1; i <= n; i++, now++) {
    
    
        for (to = now; !mat[to][i] && to <= n; to++);
        if (to ^ now)
            for (int j = 1; j <= n + 1; j++) swap(mat[to][j], mat[now][j]);
        db t = mat[now][i];
        assert(t != 0);
        for (int j = 1; j <= n + 1; j++) mat[now][j] /= t;
        for (int j = 1; j <= n; j++)
            if (j ^ now) {
    
    
                t = mat[j][i];
                for (int k = 1; k <= n + 1; k++) mat[j][k] -= t * mat[now][k];
            }
    }
}

int main() {
    
    
    while (cin >> r1 >> O1 >> V1 >> r2 >> O2 >> V2) {
    
    
        Point Di = V1 ^ V2;
        mat[1][1] = V1.x, mat[1][2] = V1.y, mat[1][3] = V1.z, mat[1][4] = V1 * O1;
        mat[2][1] = V2.x, mat[2][2] = V2.y, mat[2][3] = V2.z, mat[2][4] = V2 * O2;
        mat[3][1] = Di.x, mat[3][2] = Di.y, mat[3][3] = Di.z, mat[3][4] = Di * O1;
        gauss(3);
        Point K1(mat[1][4], mat[2][4], mat[3][4]);

        mat[1][1] = V1.x, mat[1][2] = V1.y, mat[1][3] = V1.z, mat[1][4] = V1 * O1;
        mat[2][1] = V2.x, mat[2][2] = V2.y, mat[2][3] = V2.z, mat[2][4] = V2 * O2;
        mat[3][1] = Di.x, mat[3][2] = Di.y, mat[3][3] = Di.z, mat[3][4] = Di * O2;
        gauss(3);
        Point K2(mat[1][4], mat[2][4], mat[3][4]);

        db h1 = (O1 - K1).len(), h2 = (O2 - K2).len();

        if (h1 >= r1 || h2 >= r2) {
    
    
            cout << 0 << '\n';
        } else {
    
    
            db L = (K1 - K2).len();
            db l1 = sqrt(r1 * r1 - h1 * h1), l2 = sqrt(r2 * r2 - h2 * h2);
            cout << U({
    
    -l1, l1}, {
    
    L - l2, L + l2}) << '\n';
        }
    }
    return 0;
}

在这里插入图片描述
#待更新
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

const int maxn = 5e5+10;
int ans[maxn], mi; // 答案数组和区间标记

struct AC {
    
    
    const int N = 1e6 + 10;
    vector<vector<int>> t, num;
    vector<int> fail;
    int tot = 1;
    AC () {
    
    
        num.resize(N);
        fail.resize(N);
        t.resize(N);
        for(int i = 0; i < N; i ++) {
    
    
            t[i].resize(26);
        }
    }
    void insert(string s, int id){
    
    
        int p = 1, len = s.size();
        for(int i = 0; i < len; i ++) {
    
    
            int ch = s[i] - 'a';
            if(!t[p][ch]) {
    
    
                t[p][ch] = ++ tot;
            }
            p = t[p][ch];
        }
        num[p].push_back(id);
    }
    void getfail(){
    
    
        for(int i = 0; i < 26; i ++ ) {
    
    
            t[0][i] = 1;
        }
        queue<int> q;
        q.push(1);
        fail[1] = 0;
        while(q.size()){
    
    
            int u = q.front();
            q.pop();
            for(int i = 0; i < 26; i ++){
    
    //遍历所有儿子
                int v = t[u][i];
                int Fail = fail[u];//失配结点 tire[fail].son[i] 与i相同
                if(!v) {
    
    //没有的话 通过父亲对的失配来连接
                    t[u][i] = t[Fail][i];
                    continue;
                }
                fail[v] = t[Fail][i];//存在 直接指
                q.push(v);
            }
        }
    }
    void query(string s, int l, int r, int op){
    
    
        vector<int> ed(tot + 1); // 防止重复计算
        int p = 1, len = s.size();
        for(int i = 0; i < len; i ++){
    
    
            int v = s[i]-'a';
            int k = t[p][v];//跳fail
            while(k > 1 && !ed[k]){
    
     // 不唯一
                for(auto x : num[k]) {
    
    
                    if(op == 0) {
    
     // 删除的串
                        if(x >= l && x <= r) {
    
     // 注意范围
                            mi = min(mi, x);
                        }
                    } else {
    
     // 询问串
                        if(x >= l && x <= r) {
    
     // 注意范围
                            ans[x] ++; // 直接添加
                        }
                    }
                }
                ed[k] = 1; // 标记
                k = fail[k];
            }
            p = t[p][v];
        }
    }
};
void slove() {
    
    
    int n;
    cin >> n;

    vector<char> op(n);
    vector<string> s(n);

    AC t1, t2;

    for(int i=0;i<n;i++) {
    
    
        cin >> op[i] >> s[i];
        if(op[i] == 'Q') t1.insert(s[i], i);
        if(op[i] == 'D') t2.insert(s[i], i);
    }

    t1.getfail();
    t2.getfail();

    for(int i=0;i<n;i++) {
    
    
        if(op[i] == 'I') {
    
    
            mi = 1e9;
            t2.query(s[i], i, n, 0); // 找范围
            t1.query(s[i], i, mi - 1, 1); // 直接统计
        }
    }

    for(int i=0;i<n;i++) {
    
    
        if(op[i] == 'Q') {
    
    
            cout << ans[i] << '\n';
        }
    }
}
int main() {
    
    
    int t = 1;
    while(t -- ) {
    
    
        slove();
    }

    return 0;
}


在这里插入图片描述

待更新

猜你喜欢

转载自blog.csdn.net/weixin_47174945/article/details/127660508
今日推荐