zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 30

    Educational Codeforces Round 30 

    A. Chores

    把最大的换掉

    view code
    #pragma GCC optimize("O3")
    #pragma GCC optimize("Ofast,no-stack-protector")
    #include<bits/stdc++.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define endl "
    "
    #define LL long long int
    #define vi vector<int>
    #define vl vector<LL>
    #define all(V) V.begin(),V.end()
    #define sci(x) scanf("%d",&x)
    #define scl(x) scanf("%I64d",&x)
    #define pii pair<int,int>
    #define pll pair<LL,LL>
    #ifndef ONLINE_JUDGE
    #define cout cerr
    #endif
    #define cmax(a,b) ((a) = (a) > (b) ? (a) : (b))
    #define cmin(a,b) ((a) = (a) < (b) ? (a) : (b))
    #define debug(x)  cerr << #x << " = " << x << endl
    function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
    template <typename T> vector<T>& operator << (vector<T> &__container, T x){ __container.push_back(x); return __container; }
    template <typename T> ostream& operator << (ostream &out, vector<T> &__container){ for(T _ : __container) out << _ << ' '; return out; }
    const int MAXN = 2e5+7;
    
    void solve(){
        int n, m, k;
        sci(n); sci(m); sci(k);
        vi A(n); for(int &x : A) sci(x);
        cmin(m,n);
        for(int i = n - 1, j = 0; j < m; j++, i--) cmin(A[i],k);
        cout << accumulate(all(A),0) << endl;
    }
    int main(){
        #ifndef ONLINE_JUDGE
        freopen("Local.in","r",stdin);
        freopen("ans.out","w",stdout);
        #endif
        solve();
        return 0;
    }
    

    B.  Balanced Substring

    (s)为前缀和

    就是要找(s_r-s_{l-1}=frac {r-l+1}{2})

    那就是(2s_r-r = 2s_{l-1}-(l-1))

    维护每个值最早出现的位置

    view code
    #pragma GCC optimize("O3")
    #pragma GCC optimize("Ofast,no-stack-protector")
    #include<bits/stdc++.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define endl "
    "
    #define LL long long int
    #define vi vector<int>
    #define vl vector<LL>
    #define all(V) V.begin(),V.end()
    #define sci(x) scanf("%d",&x)
    #define scl(x) scanf("%I64d",&x)
    #define pii pair<int,int>
    #define pll pair<LL,LL>
    #ifndef ONLINE_JUDGE
    #define cout cerr
    #endif
    #define cmax(a,b) ((a) = (a) > (b) ? (a) : (b))
    #define cmin(a,b) ((a) = (a) < (b) ? (a) : (b))
    #define debug(x)  cerr << #x << " = " << x << endl
    function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
    template <typename T> vector<T>& operator << (vector<T> &__container, T x){ __container.push_back(x); return __container; }
    template <typename T> ostream& operator << (ostream &out, vector<T> &__container){ for(T _ : __container) out << _ << ' '; return out; }
    const int MAXN = 2e5+7;
    
    char s[MAXN];
    void solve(){
        int n; cin >> n;
        cin >> s + 1;
        map<int,int> msk;
        int pre = 0;
        msk[0] = 0;
        int ret = 0;
        for(int i = 1; i <= n; i++){
            pre += s[i] - '0';
            if(msk.count(2*pre-i)) cmax(ret,i-msk[2*pre-i]);
            else msk[2*pre-i] = i;
        }
        cout << ret << endl;
    }
    int main(){
        #ifndef ONLINE_JUDGE
        freopen("Local.in","r",stdin);
        freopen("ans.out","w",stdout);
        #endif
        solve();
        return 0;
    }
    

    C. Strange Game On Matrix

    每一列单独考虑,枚举(q)的起点

    view code
    #pragma GCC optimize("O3")
    #pragma GCC optimize("Ofast,no-stack-protector")
    #include<bits/stdc++.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define endl "
    "
    #define LL long long int
    #define vi vector<int>
    #define vl vector<LL>
    #define all(V) V.begin(),V.end()
    #define sci(x) scanf("%d",&x)
    #define scl(x) scanf("%I64d",&x)
    #define pii pair<int,int>
    #define pll pair<LL,LL>
    #ifndef ONLINE_JUDGE
    #define cout cerr
    #endif
    #define cmax(a,b) ((a) = (a) > (b) ? (a) : (b))
    #define cmin(a,b) ((a) = (a) < (b) ? (a) : (b))
    #define debug(x)  cerr << #x << " = " << x << endl
    function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
    template <typename T> vector<T>& operator << (vector<T> &__container, T x){ __container.push_back(x); return __container; }
    template <typename T> ostream& operator << (ostream &out, vector<T> &__container){ for(T _ : __container) out << _ << ' '; return out; }
    const int MAXN = 2e5+7;
    int A[111][111];
    void solve(){
        int n, m, k;
        sci(n); sci(m); sci(k);
        for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) sci(A[i][j]);
        int ret = 0, exc = 0;
        for(int i = 1; i <= m; i++){
            vi pos;
            for(int j = 1; j <= n; j++) if(A[j][i]==1) pos << j;
            if(pos.empty()) continue;
            int tmpret = 0, tmpexc = 0;
            for(int j = 0; j < (int)pos.size(); j++){
                int sum = 0;
                for(int kk = j; kk < pos.size(); kk++){
                    if(pos[kk] - pos[j] >= k) break;
                    sum++;
                }
                if(sum > tmpret) tmpret = sum, tmpexc = j;
            }
            ret += tmpret; exc += tmpexc;
        }
        cout << ret << ' ' << exc << endl;
    }
    int main(){
        #ifndef ONLINE_JUDGE
        freopen("Local.in","r",stdin);
        freopen("ans.out","w",stdout);
        #endif
        solve();
        return 0;
    }
    

    D. Merge Sort

    递归下去,如果还需要调用的话,就把当前数字区间左右互换然后分别调用,否则直接不换分别调用

    view code
    #pragma GCC optimize("O3")
    #pragma GCC optimize("Ofast,no-stack-protector")
    #include<bits/stdc++.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define endl "
    "
    #define LL long long int
    #define vi vector<int>
    #define vl vector<LL>
    #define all(V) V.begin(),V.end()
    #define sci(x) scanf("%d",&x)
    #define scl(x) scanf("%I64d",&x)
    #define pii pair<int,int>
    #define pll pair<LL,LL>
    #ifndef ONLINE_JUDGE
    #define cout cerr
    #endif
    #define cmax(a,b) ((a) = (a) > (b) ? (a) : (b))
    #define cmin(a,b) ((a) = (a) < (b) ? (a) : (b))
    #define debug(x)  cerr << #x << " = " << x << endl
    function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
    template <typename T> vector<T>& operator << (vector<T> &__container, T x){ __container.push_back(x); return __container; }
    template <typename T> ostream& operator << (ostream &out, vector<T> &__container){ for(T _ : __container) out << _ << ' '; return out; }
    const int MAXN = 2e5+7;
    int n, k, A[MAXN];
    void merge(int L, int R, int numl, int numr, int &T){
        if(L+1==R){
            A[L] = numl;
            return;
        }
        int mid = (L + R) >> 1;
        if(T>0) T-=2, merge(L,mid,numr-mid+L,numr,T), merge(mid,R,numl,numr-mid+L,T);
        else merge(L,mid,numl,numl+mid-L,T), merge(mid,R,numl+mid-L,numr,T);
    }
    void solve(){
        sci(n); sci(k); k--;
        merge(0,n,1,n+1,k);
        if(k!=0) cout << -1 << endl;
        else for(int i = 0; i < n; i++) cout << A[i] << ' ';
    }
    int main(){
        #ifndef ONLINE_JUDGE
        freopen("Local.in","r",stdin);
        freopen("ans.out","w",stdout);
        #endif
        solve();
        return 0;
    }
    

    E. Awards For Contestants

    先所有数从大到小排序

    枚举前两个的位置然后可以确定下一个位置的可行范围,然后(ST)表找最大的位置即可

    view code
    #pragma GCC optimize("O3")
    #pragma GCC optimize("Ofast,no-stack-protector")
    #include<bits/stdc++.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define endl "
    "
    #define LL long long int
    #define vi vector<int>
    #define vl vector<LL>
    #define all(V) V.begin(),V.end()
    #define sci(x) scanf("%d",&x)
    #define scl(x) scanf("%I64d",&x)
    #define pii pair<int,int>
    #define pll pair<LL,LL>
    #ifndef ONLINE_JUDGE
    #define cout cerr
    #endif
    #define cmax(a,b) ((a) = (a) > (b) ? (a) : (b))
    #define cmin(a,b) ((a) = (a) < (b) ? (a) : (b))
    #define debug(x)  cerr << #x << " = " << x << endl
    function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
    template <typename T> vector<T>& operator << (vector<T> &__container, T x){ __container.push_back(x); return __container; }
    template <typename T> ostream& operator << (ostream &out, vector<T> &__container){ for(T _ : __container) out << _ << ' '; return out; }
    const int MAXN = 3333;
    int n, d1, d2, d3, x, y, z, ret[MAXN];
    pii A[MAXN];
    pii st[MAXN][20];
    void solve(){
        sci(n); for(int i = 1; i <= n; i++) sci(A[i].first), A[i].second = i;
        sort(A+1,A+1+n,greater<pii>());
        for(int i = 1; i <= n; i++) st[i][0] = make_pair(A[i].first-A[i+1].first,i);
        for(int j = 1; (1 << j) <= n; j++) for(int i = 1; i + (1 << j) - 1 <= n; i++){
            if(st[i][j-1].first > st[i+(1<<(j-1))][j-1].first) st[i][j] = st[i][j-1];
            else st[i][j] = st[i+(1<<(j-1))][j-1];
        }
        auto query = [&](int l, int r){
            int d = (int)log2(r - l + 1);
            if(st[l][d].first>st[r-(1<<d)+1][d].first) return st[l][d];
            else return st[r-(1<<d)+1][d];
        };
        d1 = d2 = d3 = -1;
        for(int i = 1; i <= n - 2; i++) for(int j = i + 1; j <= n - 1; j++){
            int a = i, b = j - i;
            if(min(a,b) * 2 < max(a,b)) continue;
            int l = 1, r = n - j;
            cmax(l,(max(a,b)+1)/2);
            cmin(r,min(a,b)*2);
            if(l>r) continue;
            l += j; r += j;
            auto p = query(l,r);
            int t1 = A[i].first - A[i+1].first, t2 = A[j].first - A[j+1].first, t3 = p.first;
            if(t1>d1 or (t1==d1 and t2>d2) or (t1==d1 and t2==d2 and t3>d3)){
                d1 = t1; d2 = t2; d3 = t3;
                x = i; y = j; z = p.second;
            }
        }
        for(int i = 1; i <= x; i++) ret[A[i].second] = 1;
        for(int i = x + 1; i <= y; i++) ret[A[i].second] = 2;
        for(int i = y + 1; i <= z; i++) ret[A[i].second] = 3;
        for(int i = z + 1; i <= n; i++) ret[A[i].second] = -1;
        for(int i = 1; i <= n; i++) cout << ret[i] << ' ';
        cout << endl;
    }
    int main(){
        #ifndef ONLINE_JUDGE
        freopen("Local.in","r",stdin);
        freopen("ans.out","w",stdout);
        #endif
        solve();
        return 0;
    }
    

    F. Forbidden Indices

    后缀自动机,插入一个字符的时候如果这个位置末尾被禁止的话,当前点的(right)集合大小设为(0),否则设为(1),然后就是计算每个状态节点的(len[i]cdot right[i])最大值了

    view code
    #pragma GCC optimize("O3")
    #pragma GCC optimize("Ofast,no-stack-protector")
    #include<bits/stdc++.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define endl "
    "
    #define LL long long int
    #define vi vector<int>
    #define vl vector<LL>
    #define all(V) V.begin(),V.end()
    #define sci(x) scanf("%d",&x)
    #define scl(x) scanf("%I64d",&x)
    #define pii pair<int,int>
    #define pll pair<LL,LL>
    #ifndef ONLINE_JUDGE
    #define cout cerr
    #endif
    #define cmax(a,b) ((a) = (a) > (b) ? (a) : (b))
    #define cmin(a,b) ((a) = (a) < (b) ? (a) : (b))
    #define debug(x)  cerr << #x << " = " << x << endl
    function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
    template <typename T> vector<T>& operator << (vector<T> &__container, T x){ __container.push_back(x); return __container; }
    template <typename T> ostream& operator << (ostream &out, vector<T> &__container){ for(T _ : __container) out << _ << ' '; return out; }
    const int MAXN = 1e6+7;
    char s[MAXN], t[MAXN];
    struct SAM{
        int len[MAXN],link[MAXN],ch[MAXN][26],cnt[MAXN],tot,last;
        int buc[MAXN], sa[MAXN];
        SAM(){ link[0] = -1; }
        void extend(int c, int ct){
            int np = ++tot, p = last;
            len[np] = len[last] + 1; cnt[np] = ct;
            while(p!=-1 and !ch[p][c]){
                ch[p][c] = np;
                p = link[p];
            }
            if(p==-1) link[np] = 0;
            else{
                int q = ch[p][c];
                if(len[p]+1==len[q]) link[np] = q;
                else{
                    int clone = ++tot;
                    len[clone] = len[p] + 1;
                    link[clone] = link[q];
                    memcpy(ch[clone],ch[q],sizeof(ch[q]));
                    link[np] = link[q] = clone;
                    while(p!=-1 and ch[p][c]==q){
                        ch[p][c] = clone;
                        p = link[p];
                    }
                }
            }
            last = np;
        }
        void rua(){
            for(int i = 1; i <= tot; i++) buc[i] = 0;
            for(int i = 1; i <= tot; i++) buc[len[i]]++;
            for(int i = 1; i <= tot; i++) buc[i] += buc[i-1];
            for(int i = tot; i >= 1; i--) sa[buc[len[i]]--] = i;
            LL ret = 0;
            for(int i = tot; i >= 1; i--){
                int u = sa[i];
                cnt[link[u]] += cnt[u];
            }
            for(int i = 1; i <= tot; i++) cmax(ret, 1ll * cnt[i] * len[i]);
            cout << ret << endl;
        }
    }sam;
    void solve(){
        int len;
        cin >> len >> s >> t;
        for(int i = 0; i < len; i++) sam.extend(s[i]-'a',(t[i]-'0')^1);
        sam.rua();
    }
    int main(){
        #ifndef ONLINE_JUDGE
        freopen("Local.in","r",stdin);
        freopen("ans.out","w",stdout);
        #endif
        solve();
        return 0;
    }
    
  • 相关阅读:
    $ is not defined
    Java排序算法(三):直接插入排序
    Onsctl 配置ONS服务(10G)
    在Google Drive上建立免费静态站点
    NB大了,增强现实走进安防行业了!竟然还有智能家居的规划!
    highcharts 阶梯图表并填充颜色(自己觉得:直角折线图表)
    nginx学习十一 nginx启动流程
    LeetCode_ZigZag Conversion
    SICP 习题 (1.39)解题总结
    bug 7715339 登录失败触发 ‘row cache lock’ 等待
  • 原文地址:https://www.cnblogs.com/kikokiko/p/13562906.html
Copyright © 2011-2022 走看看