2021黑龙江省赛

A.And RMQ

hznu寒假集训补了的题,吉司机线段树(虽然我一直以为是泥头车线段树),结果蒟蒻本人只记得是要维护区间或值,完全忘记了是干什么用的,结果巨佬丽丽酱虽然寒假没补题,直接盲敲

题解:其实本质上还是每个取&运算,但是这道题维护区间或的目的就是为了当或值不变时,直接不进行取&运算达到节省时间的,但是呢,傻逼(define int long long)

#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
//#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());



struct node {
    int l, r, maxx, val;
}tree[1600010];
int vl[400010];
void build(int id, int l, int r) {
    tree[id].l = l, tree[id].r = r;
    if (l == r) {
        tree[id].maxx = vl[l];
        tree[id].val = vl[l];
    }
    else {
        int mid = (l + r) >> 1;
        build(id << 1, l, mid);
        build(id << 1 | 1, mid + 1, r);
        tree[id].maxx = max(tree[id << 1].maxx, tree[id << 1 | 1].maxx);
        tree[id].val = (tree[id << 1].val | tree[id << 1 | 1].val);
    }
}
void query_and(int id, int l, int r, int x) {
    if (tree[id].l == tree[id].r) {
        tree[id].val = (tree[id].val & x);
        tree[id].maxx = tree[id].val;
    }
    else if (tree[id].l >= l && tree[id].r <= r) {
        if ((tree[id].val & x) == tree[id].val)return;
        else {
            query_and(id << 1, l, r, x);
            query_and(id << 1 | 1, l, r, x);
            tree[id].maxx = max(tree[id << 1].maxx, tree[id << 1 | 1].maxx);
            tree[id].val = (tree[id << 1].val | tree[id << 1 | 1].val);
        }
    }
    else {
        int mid = (tree[id].l+tree[id].r) >> 1;
        if (mid >= l)query_and(id << 1, l, r, x);
        if (mid < r)query_and(id << 1 | 1, l, r, x);
        tree[id].maxx = max(tree[id << 1].maxx, tree[id << 1 | 1].maxx);
        tree[id].val = (tree[id << 1].val | tree[id << 1 | 1].val);
    }
}
void query_upd(int id, int st, int x) {
    if (tree[id].l == tree[id].r) {
        tree[id].maxx = tree[id].val = x;
    }
    else {
        int mid = (tree[id].l + tree[id].r) >> 1;
        if (st <= mid)query_upd(id << 1, st, x);
        else query_upd(id << 1 | 1, st, x);
        tree[id].maxx = max(tree[id << 1].maxx, tree[id << 1 | 1].maxx);
        tree[id].val = (tree[id << 1].val | tree[id << 1 | 1].val);
    }
}
int query(int id, int l, int r) {
    if (tree[id].l >= l && tree[id].r <= r)return tree[id].maxx;
    else {
        int mid = (tree[id].l + tree[id].r) >> 1;
        if (mid >= r)return query(id << 1, l, r);
        else if (mid < l)return query(id << 1 | 1, l, r);
        else return max(query(id << 1, l, r), query(id << 1 | 1, l, r));
    }
}
void resolve() {
    int n, m; cin >> n >> m;
    for (int i = 1; i <= n; i++)cin >> vl[i];
    build(1, 1, n);
    while (m--) {
        char str[10];
        cin >> str;
        if (str[0] == 'A') {
            int l, r, x;
            cin >> l >> r >> x;
            query_and(1, l, r, x);
        }
        else if (str[0] == 'U') {
            int x, v;
            cin >> x >> v;
            query_upd(1, x, v);
        }
        else {
            int l, r;
            cin >> l >> r;
            cout << query(1,l, r) << endl;
        }
    }
}
signed main() {
    fast;
    int _ = 1;
    //cin >> _;
    //sci(_);
    // rand (time(NULL));
    while (_--) {
        resolve();
    }
}
//template <typename T>
//inline void read(T& X) {
//    X = 0; int w = 0; char ch = 0;
//    while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
//    while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
//    if (w) X = -X;
//}
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
int qpow(int a, int n) {
    int ans = 1;
    while (n) {
        if (n & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}
int qmul(int a, int b) {
    ll ans = 0;
    while (b > 0) {
        if (b & 1) ans = (ans + a) % mod;
        a = (a + a) % mod;
        b >>= 1;
    }
    return ans;
}

B.Bo Bing

待补
给大模拟恶心烂了,前前后后wa了9发

#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());

// price
// 1 zhuangyuan 2 duitang a sanhong b sijin c erju d yixiu
int now, n, m, c[10], tot[10];
int z[5][maxn], last[maxn], ans[maxn][7];
bool nother,mul;
pair<int, pair<int, int>>maxx = { 0,{0,0} };
string s;

bool _4444ab() { return c[4] == 4; }
bool _aaaaab() {//mul
    for (int i = 1; i <= 6; i++) {
        if (i == 4)continue;
        if (c[i] == 5)return 1;
    }
    return 0;
}
bool _44444a() { return c[4] == 5; }
bool _aaaaaa() {
    for (int i = 1; i <= 6; i++) {
        if (i == 4)continue;
        if (c[i] == 6)return 1;
    }
    return 0;
}
bool _666666() { return c[6] == 6; }
bool _444444() { return c[4] == 6; }
bool _444411() {
    if (c[4] == 4 && c[1] == 2)return 1;
    else return 0;
}
void solvezy(int x) {
    z[1][now] = x, z[2][now] = 0, z[3][now] = m;
    if (x == 5 || x == 6)return;
    if (x == 4) {//_aaaaaa  compare a
        for (int i = 1; i <= 6; i++) {
            if (c[i] == 6) {
                z[2][now] = i;
                break;
            }
        }
    }
    if (x == 3) {//_44444a   compare a
        for (int i = 1; i <= 6; i++) {
            if (c[i] == 1) {
                z[2][now] = i;
                break;
            }
        }
    }
    if (x == 2) {//_aaaaab   compare a
        int id = 0, ot = 0;
        for (int i = 1; i <= 6; i++) {
            if (c[i] == 5) {
                id = i;
            }
            else if (c[i])ot = i;
        }
        z[2][now] = id * 10 + ot;
    }
    if (x == 1) {//_4444ab  compare a+b
        int sum = 0;
        for (int i = 1; i <= 6; i++) {
            if (i != 4) {
                sum += c[i] * i;
            }
        }
        z[2][now] = sum;
    }
}
void init() {
    for (int i = 0; i <= 6; i++) {
        c[i] = 0;
    }
    nother = mul = 0;
}
void allblack() {
    for (int i = 2; i <= 6; i++) {
        ans[now][i] += tot[i];
        tot[i] = 0;
    }
}
void checkzy() {
    if (_444411()) {
        solvezy(6);
        now = (now) % n + 1;
        return;
    }
    if (_444444()) {
        solvezy(5);
        now = (now) % n + 1;
        return;
    }
    if (_aaaaaa()) {
        solvezy(4);
        if(_666666())allblack();
        now = (now) % n + 1;
        return;
    }
    if (_44444a()) {
        solvezy(3);
        now = (now) % n + 1;
        return;
    }
    if (_aaaaab()) {
        solvezy(2);
        mul = 1;//mul
        //now = (now) % n + 1;
        return;
    }
    if (_4444ab()) {
        solvezy(1);
        now = (now) % n + 1;
        return;
    }
    nother = 1;//another
}

bool _123456() {
    for (int i = 1; i <= 6; i++) {
        if (c[i] != 1)return 0;
    }
    return 1;
}
bool _444abc() { return c[4] == 3; }
bool _aaaabc() {//mul
    for (int i = 1; i <= 6; i++) {
        if (i == 4)continue;
        if (c[i] == 4)return 1;
    }
    return 0;
}
bool _44abcd() { return c[4] == 2; }
bool _4abcde() { return c[4] == 1; }


void solveoth(int x) {
    if (!tot[x])return;
    ans[now][x]++;
    tot[x]--;
}
void checkoth() {
    if (_123456()) {
        solveoth(2);
        now = (now) % n + 1;
        return;
    }
    if (_444abc()) {
        solveoth(3);
        now = (now) % n + 1;
        return;
    }
    if (!mul&&_aaaabc()) {// no mul
        solveoth(4);
    }
    if (_44abcd()) {
        solveoth(5);
        now = (now) % n + 1;
        return;
    }
    if (_4abcde()) {
        solveoth(6);
        now = (now) % n + 1;
        return;
    }
    now = (now) % n + 1;
    return;
}

void resolve() {
    cin >> n >> m;
    for (int i = 1; i <= 6; i++) {
        if (i == 1 || i == 2) {
            tot[i] = i;
        }
        else {
            cin >> tot[i];
        }
    }
    now = 1;

    getline(cin, s);
    while (m--) {
        getline(cin, s);
        if (last[now]) {// last appear 0
            last[now] = 0;
            now = (now) % n+1;
            continue;
        }
        init();

        for (int i = 1; i <= 11; i+=2) {
            c[s[i] - '0']++;
        }

        if (c[0]) {
            last[now] = 1;
            now = (now) % n + 1;
            continue;
        }
        checkzy();
        if (!nother && !mul) {
            //cout << endl;
            continue;
        }

        checkoth();

    }
    int id = 0;
    for (int i = 1; i <= n; i++) {
        if (z[1][i] && make_pair(z[1][i], make_pair(z[2][i], z[3][i])) > maxx) {
            maxx = make_pair(z[1][i], make_pair(z[2][i], z[3][i]));
            id = i;
        }
    }
    ans[id][1]++;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= 6; j++) {
            cout << ans[i][j] << edl(j, 6);
        }
    }
}
signed main() {
    fast;
    int _ = 1;
    //cin >> _;
    //sci(_);
    // rand (time(NULL));
    while (_--) {
        resolve();
    }
}
//template <typename T>
//inline void read(T& X) {
//    X = 0; int w = 0; char ch = 0;
//    while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
//    while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
//    if (w) X = -X;
//}
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
int qpow(int a, int n) {
    int ans = 1;
    while (n) {
        if (n & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}
int qmul(int a, int b) {
    ll ans = 0;
    while (b > 0) {
        if (b & 1) ans = (ans + a) % mod;
        a = (a + a) % mod;
        b >>= 1;
    }
    return ans;
}


C.Cookie

待补

D.Doin' Time

a这题的时候我大概率在搞筛法??丽丽酱来了句区间dp板子题,然后臭傻逼嘉晚饭冲到机上叭叭猛敲,我连题目还没读就结束了

放个队友的码

#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 3e2 + 7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());


int a[maxn][maxn];
int dp[maxn][maxn];
void resolve() {
    int n; cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i][i];
    }
    for (int len = 1; len <= n - 1; len++) {
        for (int i = 1; i <= n; i++) {
            int j = min(i + len, n);
            for (int k = i; k < j; k++) {
                dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j] + (int)pow(a[i][k] - a[k + 1][j], 2));
                a[i][j] = a[i][k] * a[k + 1][j] % mod;
            }
        }
    }
    cout << dp[1][n] << endl;
}
signed main() {
    fast;
    int _ = 1;
    //cin >> _;
    //sci(_);
    // rand (time(NULL));
    while (_--) {
        resolve();
    }
}
//template <typename T>
//inline void read(T& X) {
//    X = 0; int w = 0; char ch = 0;
//    while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
//    while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
//    if (w) X = -X;
//}
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
int qpow(int a, int n) {
    int ans = 1;
    while (n) {
        if (n & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}
int qmul(int a, int b) {
    ll ans = 0;
    while (b > 0) {
        if (b & 1) ans = (ans + a) % mod;
        a = (a + a) % mod;
        b >>= 1;
    }
    return ans;
}


E.Elastic Search

待补

F.Function

一眼筛法题,但是呢,思考了半天,发现自己还没化简,化简完后总觉得哪里差点,先去敲发现连样例都没过,发现自己忘记弄多质数合数了,然后改了一下a了。赛后知道别的队有打表过的,人麻了

#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());


int notPrime[maxn], tot, prime[maxn],f[maxn];
void init() {
    f[1] = 1;
    for (int i = 2; i < maxn; ++i){
        if (!notPrime[i]){// one prime
            prime[tot++] = i;
            f[i] = 1;
        }
        for (int j = 0; j < tot && i * prime[j] < maxn; ++j){
            notPrime[i * prime[j]] = 1;
            if (i % prime[j] == 0) {
                int x = i;
                int cnt = 0;
                while (x % prime[j]==0) {
                    x /= prime[j];
                    cnt++;
                }
                if (cnt & 1) {
                    f[i * prime[j]] = f[i] * prime[j];
                }
                else {
                    f[i * prime[j]] = f[i];
                }
                break;
            }
            f[i * prime[j]] = i;
        }
    }
}
void resolve() {
    int n; cin >> n;
    int sum = 0;
    for (int i = 1; i <= n; i++)sum += f[i];
    cout << sum << endl;
}
signed main() {
    fast;
    int _ = 1;
    init();
    //cin >> _;
    //sci(_);
    // rand (time(NULL));
    while (_--) {
        resolve();
    }
}
//template <typename T>
//inline void read(T& X) {
//    X = 0; int w = 0; char ch = 0;
//    while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
//    while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
//    if (w) X = -X;
//}
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
int qpow(int a, int n) {
    int ans = 1;
    while (n) {
        if (n & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}
int qmul(int a, int b) {
    ll ans = 0;
    while (b > 0) {
        if (b & 1) ans = (ans + a) % mod;
        a = (a + a) % mod;
        b >>= 1;
    }
    return ans;
}


G.Go? No

待补

H.Hack DSU!

这个时候蒟蒻本人在干嘛,我在因补过a题但是在赛场上没写出来被队友罚面壁??然后两个大腿你说一句我说一句对对对wa了一发,过了一会儿丽丽酱来了一句那反过来不就好了就a了,我还不知道发生了什么

#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());


int notPrime[maxn], tot, prime[maxn],f[maxn];
void init() {
    f[1] = 1;
    for (int i = 2; i < maxn; ++i){
        if (!notPrime[i]){// one prime
            prime[tot++] = i;
            f[i] = 1;
        }
        for (int j = 0; j < tot && i * prime[j] < maxn; ++j){
            notPrime[i * prime[j]] = 1;
            if (i % prime[j] == 0) {
                int x = i;
                int cnt = 0;
                while (x % prime[j]==0) {
                    x /= prime[j];
                    cnt++;
                }
                if (cnt & 1) {
                    f[i * prime[j]] = f[i] * prime[j];
                }
                else {
                    f[i * prime[j]] = f[i];
                }
                break;
            }
            f[i * prime[j]] = i;
        }
    }
}
void resolve() {
    int n, m; cin >> n >> m;
    for (int i = n - 1; i >= 1; i--)cout << n << " " << i << endl;
    cout << n << " " << n;
}
signed main() {
    fast;
    int _ = 1;
    init();
    //cin >> _;
    //sci(_);
    // rand (time(NULL));
    while (_--) {
        resolve();
    }
}
//template <typename T>
//inline void read(T& X) {
//    X = 0; int w = 0; char ch = 0;
//    while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
//    while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
//    if (w) X = -X;
//}
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
int qpow(int a, int n) {
    int ans = 1;
    while (n) {
        if (n & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}
int qmul(int a, int b) {
    ll ans = 0;
    while (b > 0) {
        if (b & 1) ans = (ans + a) % mod;
        a = (a + a) % mod;
        b >>= 1;
    }
    return ans;
}

I. ICU4C

在A题和H题都结束之后,队友也不让我面壁了,我干脆解放天性,直接冲最爱的博弈论,顺便带上了嘉晚饭,然后玩了半个多小时,出了好多样例,但是每一次就会有一个新的样例把我们自己的想法hack掉。然后三个b就瘫在那边了。然后我去看了一下自己的博弈论大礼包,赌怪辅助器(其实就是一堆博弈论题目的经典模型),??我拍了下嘉晚饭,这是不是和阶梯博弈模型一模一样,“嘶,好像” “要不冲一下” “可冲” ,然后又花了十几分钟时间把杂七杂八的东西给剥掉(其实就是将阶梯给搭起来),然后交了一发,wa了。

我就巨奇怪,这不可能wa啊,然后发现自己奇数忘记敲了(阶梯博弈其实就是本质是奇数位的Nim博弈),好像下午就没带脑子??然后就a了

#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
void resolve() {
    
    int n; cin >> n;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        map<int, int>mp;
        int m, e; cin >> m >> e;
        for (int j = 1; j <= m; j++) {
            int x; cin >> x;
            mp[e - x - m+j]++;//���յ㲽��
        }
        for (auto j : mp) {
            if (j.first & 1) {
                ans ^= j.second;
            }
            
        }
    }
    cout << (ans ? "Alice" : "Bob") << endl;
}
signed main() {
    fast;
    int _ = 1;
    cin >> _;
    //sci(_);
    // rand (time(NULL));
    while (_--) {
        resolve();
    }
}
//template <typename T>
//inline void read(T& X) {
//    X = 0; int w = 0; char ch = 0;
//    while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
//    while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
//    if (w) X = -X;
//}
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
int qpow(int a, int n) {
    int ans = 1;
    while (n) {
        if (n & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}
int qmul(int a, int b) {
    ll ans = 0;
    while (b > 0) {
        if (b & 1) ans = (ans + a) % mod;
        a = (a + a) % mod;
        b >>= 1;
    }
    return ans;
}

J. JOJO's Factory

我和丽丽酱说:你的题,二分图。把他骗过去想半天,回来他告诉我“***,**思维”

#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 3e2 + 7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int nl[500010], nr[500010];
vector<int>vec1[500010], vec2[500010];
int vis1, vis2;
void resolve() {
    int n, m; cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int l, r; cin >> l >> r;
        nl[l]++, nr[r]++;
        vec1[l].push_back(r);
        vec2[r].push_back(l);
    }
    for (int i = 1; i <= n; i++) {
        if (vec1[i].size() == n || vec2[i].size() == n) {
            cout << n - 1 << endl;
            return;
        }
    }
    for (int i = 1; i <= n; i++) {
        if (vec1[i].size() == n - 1) {
            sort(vec1[i].begin(), vec1[i].end());
            int ij = 1;
            for (auto j : vec1[i]) {
                if (ij != j) {
                    if (vis1 == 0) {
                        vis1 = ij;
                        break;
                    }
                    else {
                        vis2 = ij;
                        break;
                    }
                }
                ij++;
            }
            if (ij == n && vis1 == 0)vis1 = n;
            else if (ij == n && vis2 == 0)vis2 = n;
        }
    }
    //cout << vis1 << " " << vis2 << endl;
    if (vis1 == vis2 && vis1 != 0) {
        cout << n - 1 << endl;
        return;
    }
    vis1 = vis2 = 0;
    for (int i = 1; i <= n; i++) {
        if (vec2[i].size() == n - 1) {
            sort(vec2[i].begin(), vec2[i].end());
            int ij = 1;
            for (auto j : vec2[i]) {
                if (ij != j) {
                    if (vis1 == 0) {
                        vis1 = ij;
                        break;
                    }
                    else {
                        vis2 = ij;
                        break;
                    }
                }
                ij++;
            }
            if (ij == n && vis1 == 0)vis1 = n;
            else if (ij == n && vis2 == 0)vis2 = n;
        }
    }
    //cout << vis1 << " " << vis2 << endl;
    if (vis1 == vis2 && vis1 != 0) {
        cout << n - 1 << endl;
        return;
    }
    cout << n;
}
signed main() {
    fast;
    int _ = 1;
    //cin >> _;
    //sci(_);
    // rand (time(NULL));
    while (_--) {
        resolve();
    }
}
//template <typename T>
//inline void read(T& X) {
//    X = 0; int w = 0; char ch = 0;
//    while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
//    while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
//    if (w) X = -X;
//}
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
int qpow(int a, int n) {
    int ans = 1;
    while (n) {
        if (n & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}
int qmul(int a, int b) {
    ll ans = 0;
    while (b > 0) {
        if (b & 1) ans = (ans + a) % mod;
        a = (a + a) % mod;
        b >>= 1;
    }
    return ans;
}

K. Keep Eating

签到题。也是写的很久的一道题,原因是大猪鼻嘉晚饭把题多错了,说只能吃一半,然后他就搁那不说话了,(估计叛逆期到了),

#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 2e5 + 7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 998244353;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());


int a[maxn];
void resolve() {
    int sum = 0;
    int n, k; cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        sum += a[i];
    }
    int ans=0;
    if (sum >= k) {
        sum -= k;
        ans = sum + k / 2;
    }
    cout << ans << endl;
}
signed main() {
    fast;
    int _ = 1;
    //cin >> _;
    //sci(_);
    // rand (time(NULL));
    while (_--) {
        resolve();
    }
}
//template <typename T>
//inline void read(T& X) {
//    X = 0; int w = 0; char ch = 0;
//    while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
//    while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
//    if (w) X = -X;
//}
int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
int qpow(int a, int n) {
    int ans = 1;
    while (n) {
        if (n & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}
int qmul(int a, int b) {
    ll ans = 0;
    while (b > 0) {
        if (b & 1) ans = (ans + a) % mod;
        a = (a + a) % mod;
        b >>= 1;
    }
    return ans;
}


L. Labi-Ribi

hznu2021Oct. Training 5的时候写了,当时就是按照学长给的题解补的,今天就没写了,时间花博弈论上了,写博客的时候发现短短半年,码风截然不同(哭泣.jpg)

题意: 有\(n\)个关卡,需要你的攻击力大于等于\(BOSS\)的生命值才能过关,击败\(BOSS_i\)后你可以增加\(b_i\)的攻击力,其他剩余\(BOSS\)会增加 \(a_i\)生命值。问至少要多少初始生命值能全部通关。有\(q\)个询问,依次增加一个关卡,输出新增后需要的最低通关生命值。

思路: 怪的生命值\(h_i\) ,打一只怪可以得到\(b_i\)攻击力,但是其他怪会得到\(a_i\)命值,所以其实可以转化为打一只怪得到\(b_i-a_i\)攻击力。 那么对于\(b_i-a_i\)大于等于\(0\)的,我们肯定优先拿,拿取顺序可以直接按\(h_i\)小的贪心取,然后是对于\(b_i-a_i\)小于\(0\)的情况,令 \(c_i=b_i-a_i\),可以按\(h_i+c_i\)大的贪心拿取。对于第二种情况两个怪 ,先拿哪个,会有情况先打第一个,就打不了第二个,先打第二个可以打第一个。那么就有:

\(x+c_2>=h_1\)

\(x+c_1<h_2\)

所以有\(h_1-c_2<=x<h_2-c_1\),也就是\(h_1+c_1<h_2+c_2\)可知优先拿取\(h_i+c_i\)大的最优。 题目\(q=1000\),可以复杂度\(O(nq)\)做。

#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>   
//const int MAXN = 1e6 + 7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-10;
typedef long long ll;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef unsigned long long ull;
const int maxn = 2e5;
using namespace std;
const double gold = (sqrt(5.0) - 1) / 2;
#define sci(x) scanf("%d",&x)
#define scI(x) scanf("%lld",&x)
const int mod = 1e9 + 7;


int n;
struct node {
	ll num, a, b, limit;
	node() {}
	node(ll _num, ll _a, ll _b, ll _limit) {
		num = _num;
		a = _a;
		b = _b;
		limit = _limit;
	}
	bool operator<(const node& x)const {
		if (limit >= 0 && x.limit >= 0)return num < x.num;
		else if (limit < 0 && x.limit < 0)return num + limit > x.num + x.limit;
		return limit > x.limit;
	}
}no[maxn];


ll solve() {
	ll cntnow = no[1].num + no[1].limit;
	ll cnt = no[1].num;
	for (int i = 2; i <= n; i++) {
		if (cntnow >= no[i].num) {
			cntnow += no[i].limit;
		}
		else {
			cnt += no[i].num - cntnow;
			cntnow = no[i].num;
			cntnow += no[i].limit;
		}
	}
	return cnt;
}
int main() {

	sci(n);
	for (int i = 1; i <= n; i++) {
		ll x;
		scI(x);
		no[i].num = x;
	}
	for (int i = 1; i <= n; i++) {
		ll x, y;
		scI(x), scI(y);
		no[i].a = x;
		no[i].b = y;
		no[i].limit = y - x;
	}
	sort(no + 1, no + 1 + n);
	//	for(int i=1;i<=n;i++){
	//		cout<<"no"<<i<<":"<<no[i].num<<" "<<no[i].a<<" "<<no[i].b<<" "<<no[i].limit<<endl;
	//	}
	printf("%lld\n", solve());
	int q;
	sci(q);
	while (q--) {
		ll h, a, b;
		scI(h), scI(a), scI(b);
		node x;
		x.num = h;
		x.a = a;
		x.b = b;
		x.limit = b - a;
		int pos = upper_bound(no + 1, no + n + 1, x) - no;
		for (int i = n; i >= pos; i--) {
			no[i + 1] = no[i];
		}
		no[pos] = x;
		n++;
		printf("%lld\n", solve());

	}
}
posted @ 2022-03-30 19:06  Hxin-C  阅读(238)  评论(0)    收藏  举报