[hihocoder][Offer收割]編程練習賽58

最大的K-誤差排列node

每次取可選範圍裏的最大的數字,若是最左側的數字尚未使用就直接使用最左側的數字ios

#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef queue<int> QI;

void makedata() {
    freopen("input.txt", "w", stdout);
    fclose(stdout);
}


int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    //makedata();
    std::ios::sync_with_stdio(0), cin.tie(0);
    int n, k;
    bool f[200];
    cin >> n >> k;
    memset(f, false, sizeof(f));
    for (int i = 1; i <= n; i++) {
        if (i - k > 0 && !f[i - k]) {
            f[i - k] = true;
            cout << i - k << ' ';
            continue;
        }
        for (int j = i + k; j > i - k; j--) {
            if (j > n || j < 0) continue;
            if (!f[j]) {
                f[j] = true;
                cout << j << ' ';
                break;
            }
        }
    }
    return 0;
}
View Code

孤獨的字符c++

枚舉每一個字符,計算它是一個孤獨字符時包含它的區間有多少個ide

#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef queue<int> QI;

void makedata() {
    freopen("input.txt", "w", stdout);
    fclose(stdout);
}

string s;
int pre[110000], nex[110000], last[256];

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    //makedata();
    std::ios::sync_with_stdio(0), cin.tie(0);
    cin >> s;
    int n = s.length();
    memset(last, -1, sizeof(last));
    for (int i = 0; i < n; i++) {
        pre[i] = last[s[i]];
        nex[i] = n;
        if (last[s[i]] >= 0) nex[pre[i]] = i;
        last[s[i]] = i;
    }
    lint ans = 0;
    for (int i = 0; i < n; i++) {
        ans += 1LL * (nex[i] - i) * (i - pre[i]);
    }
    cout << ans << endl;
    return 0;
}
View Code

秋天來了spa

這題有問題,都說了l是惟一最高完了樣例好幾個最高???最高的還能看到別人???3d

Nim森林code

這題跟這棵樹沒啥關係。兩個回合之後,是一個典型的反nim遊戲,先手獲勝的條件爲:1)全部堆的石子個數爲1,且NIM_sum=0或2)至少有一堆的石子個數大於1,且 NIM_sum≠0。第一種獲勝狀況是全部堆獅子個數爲1且有偶數堆,這種狀況是不可能達到的。通過第一回合操做後,只要有石子數爲1的石堆,B均可以拿完多於1的石堆且剩下奇數個石子數爲1的石堆,因此只需考慮第二種狀況(且全部石堆石子數大於1)。按代價從大到小的順序添加各個石堆的石子數到線性基中,成功添加進去的就是第二回合給B留下的。blog

#include <bits/stdc++.h>
using namespace std;
using LL = int64_t;
using LD = long double;
const LL INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;

template <typename T>
struct LnBase{
    int sz, szc;
    T *x;
    int *y;
    LnBase (){x = 0; sz = sizeof(T) << 3; szc = -1; resize(sz);}
    void resize(int size){
        sz = size; if(!x) delete(x); x = new T[sz + 2]; y = new int[sz + 2];
        memset(x, 0, sz * sizeof(T)); memset(y, 0, sz << 2);
    }
    T operator[](int h){return x[h];}
    int add(T v){
        for(int i = sz - 1; i >= 0; i--)
            if(v & (T)1 << i){if(!x[i]){x[i] = v; szc = -1; return i;} v ^= x[i];}
        return -1;
    }
    int find(T v){
        for(int i = sz - 1; i >= 0; i--){
            if(v & (T)1 << i && x[i]) v ^= x[i]; if(!v) return 1;}
        return 0;
    }
    T Max(){
        T s = 0;
        for(int i = sz - 1; i >= 0; i--){if((s ^ x[i]) > s) s ^= x[i];}
        return s;
    }
    T Min(){
        for(int i = 0; i < sz; i++) if(x[i]) return x[i];
        return -1;
    }
    void Canonicity(){
        int i, j;
        for(i = sz - 1; i > 0; i--)
            for(j = i - 1; j >= 0; j--) if(x[i] & (T)1 << j) x[i] ^= x[j];
        for(szc = i = 0; i < sz; i++) if(x[i]) y[szc++] = i;
    }
    T Kth(long long K){
        if(szc < 0) Canonicity(); if(K >= 1ll << szc) return -1; T s = 0;
        for(int i = szc - 1; i >= 0; i--) if(K & 1ll << i) s ^= x[y[i]];
        return s;
    }
};

struct node {
    __int128 a, t;
    bool operator<(const node &e) const { return t > e.t; }
};
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    n--;
    vector<node> a(n);
    for (auto &i : a) {
        LL u, v, a, t;
        cin >> u >> v >> a >> t;
        i.a = a;
        i.t = u ^ v ^ t;
    }
    sort(a.begin(), a.end());
    int flag = 1;
    __int128 ans = 0, sum = 0;
    LnBase<__int128> b;
    for (auto& s : a) {
        sum += s.t;
        if (s.a == 1) continue;
        flag = 0;
        if (b.add(s.a) != -1) ans += s.t;
    }
    if (flag) cout << "No\n";
    else {
        ans = sum - ans;
        string s = "";
        while (ans) {
            s += '0' + ans % 10;
            ans /= 10;
        }
        if (s == "") s = "0";
        reverse(s.begin(), s.end());
        cout << s << '\n';
    }
}
View Code
相關文章
相關標籤/搜索