Codeforces Round #395 (Div. 2) 题解

比赛链接:

本次比赛解决3题(好水呀QAQ)

A. Taymyr is calling you

水题暴力

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <ctime>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
typedef long double ld;
const double eps = 1e-6;
const double PI = acos(-1);
const int mod = 1000000000 + 7;
const int INF = 0x3f3f3f3f;
// & 0x7FFFFFFF 0xcf
const int seed = 131;
const ll INF64 = ll(1e18);
const int maxn = 100;
int T,n,m,z;


int main() {
//    ios::sync_with_stdio(false);
//    srand((unsigned)time(NULL));
//    freopen("out.txt","w",stdout);
//    freopen("in.txt","r",stdin);
//    scanf("%d",&T);

    scanf("%d%d%d", &n, &m, &z);
    int ans = 0;
    for(int i = 1; i <= z; i++) {
        if(i % n == 0 && i % m == 0) ++ans;
    }
    printf("%d\n", ans);
    return 0;
}

B. Timofey and cubes

从两边向中间,根据变换次数奇偶来改变

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <ctime>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
typedef long double ld;
const double eps = 1e-6;
const double PI = acos(-1);
const int mod = 1000000000 + 7;
const int INF = 0x3f3f3f3f;
// & 0x7FFFFFFF 0xcf
const int seed = 131;
const ll INF64 = ll(1e18);
const int maxn = 2e5+10;
int T,n,m,z,a[maxn];


int main() {
//    ios::sync_with_stdio(false);
//    srand((unsigned)time(NULL));
//    freopen("out.txt","w",stdout);
//    freopen("in.txt","r",stdin);
//    scanf("%d",&T);

    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }

    for(int i = 1; i <= n/2; i++) {
        if(i&1) swap(a[i], a[n-i+1]);
    }

    for(int i = 1; i <= n; i++) {
        printf("%d%c", a[i], i==n?'\n':' ');
    }

    return 0;
}

C. Timofey and a tree

思路:

随便找一个根做dfs序, 然后建立线段树维护区间最大最小值, 再dfs一遍, 枚举每个点做为根, 那么把线段分成了一些区间,  如果区间最大最小值相等, 那么就只有一种颜色。

细节参见代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <ctime>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
typedef long double ld;
const double eps = 1e-6;
const double PI = acos(-1);
const int mod = 1000000000 + 7;
const int INF = 0x3f3f3f3f;
// & 0x7FFFFFFF 0xcf
const int seed = 131;
const ll INF64 = ll(1e18);
const int maxn = 2e5+10;
int T,n,m,z,a[maxn],in[maxn],idex = 0, out[maxn], minv[maxn<<2], maxv[maxn<<2];
int ans;
bool ok;
void pushup(int o) {
    minv[o] = min(minv[o<<1], minv[o<<1|1]);
    maxv[o] = max(maxv[o<<1], maxv[o<<1|1]);
}
void build(int l, int r, int o) {
    minv[o] = INF;
    maxv[o] = -INF;
    if(l == r) {
        minv[o] = maxv[o] = a[l];
        return ;
    }
    int mid = (l + r) >> 1;
    build(l, mid, o<<1);
    build(mid+1, r, o<<1|1);
    pushup(o);
}
int querymin(int L, int R, int l, int r, int o) {
    if(L <= l && r <= R) {
        return minv[o];
    }
    int mid = (l + r) >> 1;
    int ans = INF;
    if(L <= mid) ans = min(ans, querymin(L, R, l, mid, o<<1));
    if(mid < R) ans = min(ans, querymin(L, R, mid+1, r, o<<1|1));
    return ans;
}
int querymax(int L, int R, int l, int r, int o) {
    if(L <= l && r <= R) {
        return maxv[o];
    }
    int mid = (l + r) >> 1;
    int ans = -INF;
    if(L <= mid) ans = max(ans, querymax(L, R, l, mid, o<<1));
    if(mid < R) ans = max(ans, querymax(L, R, mid+1, r, o<<1|1));
    return ans;
}

vector<int> g[maxn];
int c[maxn];
void dfs(int u, int fa) {
    int len = g[u].size();
    in[u] = ++idex;
    a[idex] = c[u];
    for(int i = 0; i < len; i++) {
        int v = g[u][i];
        if(v == fa) continue;
        dfs(v, u);
    }
    out[u] = idex;
}
void dp(int u, int fa) {
    int len = g[u].size();
    bool flag = true;
    if(u != 1) {
        int mincur = INF;
        int maxcur = -INF;
        int id = in[u]-1, id2 = out[u]+1;
        mincur = min(querymin(1, id, 1, n, 1), querymin(id2, n, 1, n, 1));
        maxcur = max(querymax(1, id, 1, n, 1), querymax(id2, n, 1, n, 1));
        if(mincur != maxcur) flag = false;
    }
    for(int i = 0; i < len; i++) {
        int v = g[u][i];
        if(v == fa) continue;
        int mincur = querymin(in[v], out[v], 1, n, 1);
        int maxcur = querymax(in[v], out[v], 1, n, 1);

        if(mincur != maxcur) flag = false;
        dp(v, u);
    }
    if(flag) ok = true, ans = u;
}

int main() {
    scanf("%d", &n);
    for(int i = 1; i < n; i++) {
        int u, v; scanf("%d%d", &u, &v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    for(int i = 1; i <= n; i++) scanf("%d", &c[i]);

    dfs(1, 1);
    ok = false;
    build(1, n, 1);

    dp(1, 1);
    if(ok) {
        printf("YES\n");
        printf("%d\n", ans);
    }
    else {
        printf("NO\n");
    }
    return 0;
}






抱歉,根据提供的引用内容,我无法理解你具体想要问什么问题。请提供更清晰明确的问题,我将竭诚为你解答。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Codeforces Round 860 (Div. 2)题解](https://blog.csdn.net/qq_60653991/article/details/129802687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【CodeforcesCodeforces Round 865 (Div. 2) (补赛)](https://blog.csdn.net/t_mod/article/details/130104033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Codeforces Round 872 (Div. 2)(前三道](https://blog.csdn.net/qq_68286180/article/details/130570952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值