Codeforces Round #617 (Div. 3)

Posted -ackerman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #617 (Div. 3)相关的知识,希望对你有一定的参考价值。

C. Yet Another Walking Robot

每次把走到的点记录下来,如果后续出现了一个点在之前已经出现过了,那么肯定出现了重复走。另外维护下 r-l 要尽可能小

 

#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <math.h>
#include <cstdio>
#include <iomanip>
#include <time.h>
#include <bitset>
 
#define LL long long
#define INF 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1
 
using namespace std;
 
const int maxn = 2e5 + 10;
const LL mod = 1e9 + 7;
 
char s[maxn];
int main() {
    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        cin >> s+1;
        map<pair<int,int>,int > mp;
        mp[make_pair(0,0)] = 1;
        int x = 0,y = 0;
        int r = 1e9,l = 0;
        for (int i = 1;i <= n;i++) {
            if(s[i]==L){
                x--;
            }else if(s[i]==R){
                x++;
            }else if(s[i]==U){
                y++;
            }else {
                y--;
            }
            if (mp.count(make_pair(x,y))) {
                int l1 = mp[make_pair(x,y)];
                int r1 = i;
                if (r1-l1 < r-l) {
                    r = r1;
                    l = l1;
                }
            }
            mp[make_pair(x,y)] = i+1;
        }
        if (l == 0)
            cout << -1 << endl;
        else
            cout << l << " " << r << endl;
    }
    return 0;
}

 

 

D. Fight with Monsters

 

贪心 + 简单数学

#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <math.h>
#include <cstdio>
#include <iomanip>
#include <time.h>
#include <bitset>

#define LL long long
#define INF 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1

using namespace std;


const int maxn = 2e5 + 10;

int v[maxn];
int main() {
    int n,a,b,k;
    int cnt = 0;
    cin >> n >> a >> b >> k;
    for (int i = 1;i <= n;i++) {
        cin >> v[i];
        v[i] = v[i] % (a + b);
        if (v[i] == 0)
            v[i] = b;
        else
            v[i] -= a;
    }
    sort(v+1,v+1+n);
    for (int i = 1;i <= n;i++) {
        if (v[i] <= 0) {
            cnt++;
        } else {
            if (v[i] % a == 0) {
                if (k >= v[i] / a) {
                    k -= v[i] / a;
                    cnt++;
                }
            } else {
                if (k >= (v[i] / a) + 1) {
                    k -= (v[i] / a) + 1;
                    cnt++;
                }
            }
        }
    }
    cout << cnt << endl;
    return 0;
}

 

 

E1. String Coloring (easy version)

暴力找上升的序列,然后跑两次就可以了

#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <math.h>
#include <cstdio>
#include <iomanip>
#include <time.h>
#include <bitset>

#define LL long long
#define INF 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1

using namespace std;

const int maxn = 2e5 + 10;
const LL mod = 1e9 + 7;

char s[maxn];
int vis[maxn];
int main(){
    memset(vis,-1,sizeof vis);
    int n;
    cin >> n;
    cin >> (s + 1);
    char c = a;
    for(int i = 1;i <= n;++i){
        if(s[i] >= c ) {
            vis[i] = 0;
            c = s[i];
        }
    }
    c = a;
    for(int i = 1;i <= n;++i){
        if(vis[i] == -1){
            if(s[i] >= c) {
                vis[i] = 1;
                c = s[i];
            }
        }
    }
    for(int i = 1;i <= n;++i)
        if(vis[i] == -1) {
            cout << "NO";
            return 0;
        }
    cout << "YES" << endl;
    for(int i = 1;i <= n;++i){
        cout << vis[i];
    }
}

 

E2. String Coloring (hard version)

题目大意:给你一串长度为n的字符串,你可以给每个位置上染上一种不大于n的颜色,对于相邻的两个位置,如果他们的颜色不同则可以交换他们的位置,现在需要交换若干次后按照字典序排序,你需要找到最少满足条件的颜色数并输出方案

可以想到,只有一个字符要与另一个字符交换,才要染成不同颜色,从前往后来考虑,我们只用考虑一个字符与在它前面的字符交换就行了,因为枚举到后面需要与其交换的字符,自然会考虑到它

只有比它大的字符才会跟它交换,所以我们只需要让它与比它大的字符不同颜色即可

然后要想到这样的一个结论,这一些字符的颜色必然在[1,??]这样的一个区间里,而且包含着[1,??]中的每一种颜色,所以我们对于枚举到的字符,找到对应的??,然后把枚举到的字符的颜色设为??+1即可

只有26个字符,暴力就完事了,复杂度??(26??)

 

#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <math.h>
#include <cstdio>
#include <iomanip>
#include <time.h>
#include <bitset>

#define LL long long
#define INF 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1

using namespace std;

const int maxn = 2e5 + 10;
const LL mod = 1e9 + 7;

int ans[maxn],maxx[maxn];

int main() {
    int n;
    cin >> n;
    int col = 0;
    for (int i = 1;i <= n;i++) {
        char c;
        cin >> c;
        int k = c - a + 1;
        int mx = 0;
        for (int j = k+1;j <= 26;j++) {
            mx = max(mx,maxx[j]);
        }
        ans[i] = mx + 1;
        col = max(col,ans[i]);
        maxx[k] = mx + 1;
    }
    cout << col << endl;
    for (int i = 1;i <= n;i++)
        cout << ans[i] << " ";
    return 0;
}

 

 

F. Berland Beauty

给一棵树,边权未知,现在给m组约束,每组约束给出从u到v路径中的最小值,现在让你给出一组边权,使得符合之前的约束,不能给出输出-1

思路:

因为n较小,对于每组约束我们可以直接暴力修改路径上的权值,如果边的权值小于当前约束的最小值,则将权值修改,最后再根据每组约束暴力走一遍路径看路径是否满足要求,如果不满足则输出-1,最后还得对那些没有修改过的边随意赋值

#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <math.h>
#include <cstdio>
#include <iomanip>
#include <time.h>
#include <bitset>

#define LL long long
#define INF 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1



const int maxn = 5010;
const LL mod = 1e9 + 7;

std::vector<int> graph[maxn];
int id[maxn][maxn];
int fa[maxn],dep[maxn];
int from[maxn],to[maxn],w[maxn];
int val[maxn][maxn];
int cst[maxn];

void dfs(int u,int f) {
    fa[u] = f;
    dep[u] = dep[f] + 1;
    for (int i = 0;i < graph[u].size();i++) {
        int v = graph[u][i];
        if (v == f)
            continue;
        dfs(v,u);
    }
}


void dfs2(int u,int f) {
    for (int i = 0;i < graph[u].size();i++) {
        int v = graph[u][i];
        if (v == f)
            continue;
        cst[id[u][v]] = val[u][v];
        dfs2(v,u);
    }
}


int main() {
    int n;
    std::cin >> n;
    for (int i = 1;i <= n-1;i++) {
        int u,v;
        std::cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
        id[u][v] = id[v][u] = i;
    }
    dfs(1,0);
    int m;
    std::cin >> m;
    for (int i = 1;i <= m;i++) {
        std::cin >> from[i] >> to[i] >> w[i];
        if (dep[from[i]] < dep[to[i]])
            std::swap(from[i],to[i]);
        int u = from[i],v = to[i];
        while (dep[u] != dep[v]) {
            int f = fa[u];
            if (val[u][f] <= w[i])
                val[u][f] = val[f][u] = w[i];
            u = f;
        }
        while (u != v) {
            int fu = fa[u],fv = fa[v];
            if (val[u][fu] <= w[i])
                val[u][fu] = val[fu][u] = w[i];
            if (val[v][fv] <= w[i])
                val[v][fv] = val[fv][v] = w[i];
            u = fu,v = fv;
        }
    }
    for (int i = 1;i <= m;i++) {
        int x = INF;
        int u = from[i],v = to[i];
        if (dep[u] < dep[v])
            std::swap(u,v);
        while (dep[u] != dep[v]) {
            int f = fa[u];
            x = std::min(x,val[u][f]);
            u = f;
        }
        while (u != v) {
            int fu = fa[u],fv = fa[v];
            x = std::min(x,val[u][fu]);
            x = std::min(x,val[v][fv]);
            u = fu,v = fv;
        }
        if (x != w[i]) {
            std::cout << -1 << std::endl;
            return 0;
        }
    }
    dfs2(1,0);
    for (int i = 1;i <= n-1;i++) {
        if (!cst[i])
            std::cout << 1000000  << " ";
        else
            std::cout << cst[i] << " ";
    }
    return 0;
}

 

以上是关于Codeforces Round #617 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #617 (Div. 3)

Codeforces Round #617 (Div. 3)

Codeforces Round #617 (Div. 3)

Codeforces Round #617 (Div. 3)

Codeforces Round #617 (Div. 3)

Codeforces Round #617 (Div. 3) A