codeforces round #429 div2

竟然还涨分了。。。rank500+还能涨我rating是有多低。。。

AB不写了

C:类似找规律,具体证明看edtorial

#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
int m;
struct data {
    int b, id;
    bool friend operator < (data A, data B)
    {
        return A.b < B.b;
    }
} x[N], y[N];
int ans[N];
int main()
{
    scanf("%d", &m);
    for(int i = 1; i <= m; ++i)
    {
        scanf("%d", &x[i].b);
        x[i].id = i;
    }
    for(int i = 1; i <= m; ++i)
    {
        scanf("%d", &y[i].b);
        y[i].id = i;
    }
    sort(y + 1, y + m + 1);
    sort(x + 1, x + m + 1);
    for(int i = 1; i <= m; ++i) ans[y[i].id] = x[m - i + 1].b;
    for(int i = 1; i <= m; ++i) printf("%d ", ans[i]);
    return 0;
}

D:首先度数是奇数是不行的,这样是无解,所以我们拿出一个-1让度数变成偶数,然后实行染色,如果当前度数和是偶数就不连,是奇数就得连

#include<bits/stdc++.h>
using namespace std;
const int N = 300010;
int n, m, cnt;
int a[N], vis[N], b[N];
vector<int> G[N], e[N], ans;
bool flag;
void dfs(int u)
{
    vis[u] = 1;
    if(a[u] == 1) b[u] = 1;
    for(int i = 0; i < G[u].size(); ++i)
    {
        int v = G[u][i];
        if(vis[v]) continue;
        dfs(v);
        if(b[v] & 1) ans.push_back(e[u][i]);
        b[u] += b[v];
    }
}
int main()
{
    int pos = -1;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i)
    {
        scanf("%d", &a[i]);
        if(a[i] == 1) ++cnt;
        if(a[i] == -1) pos = i;
    }
    for(int i = 1; i <= m; ++i)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        G[u].push_back(v);
        G[v].push_back(u);
        e[u].push_back(i);
        e[v].push_back(i);
    }
    if(cnt & 1)
    {
        if(pos == -1)
        {
            puts("-1");
            return 0;
        }
        a[pos] = 1;
    }
    dfs(1);
    printf("%d\n", ans.size());
    sort(ans.begin(), ans.end());
    for(int i = 0; i < ans.size(); ++i) printf("%d\n", ans[i]);
    return 0;
}

editorial给太晚,差评

时间: 2024-10-12 08:36:11

codeforces round #429 div2的相关文章

codeforces round #257 div2 C、D

本来应该认真做这场的,思路都是正确的. C题,是先该横切完或竖切完,无法满足刀数要求,再考虑横切+竖切(竖切+横切), 因为横切+竖切(或竖切+横切)会对切割的东西产生交叉份数,从而最小的部分不会尽可能的大. 代码如下,虽然比较长.比较乱,但完全可以压缩到几行,因为几乎是4小块重复的代码,自己也懒得压缩 注意一点,比如要判断最小块的时候,比如9行要分成2份,最小的剩下那份不是9取模2,而应该是4 m/(k+1)<=m-m/(k+1)*k          #include<bits/stdc+

codeforces Round #250 (div2)

a题,就不说了吧 b题,直接从大到小排序1-limit的所有数的lowbit,再从大到小贪心组成sum就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #define N 200000 6 using namespace std; 7 int pos[N],a[N],s[N],f[N],la[N],b[N],i,j,k,ans,n,p

Codeforces Round#320 Div2 解题报告

Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Finding Team Member codeforces 579C A Problem about Polyline codeforces 579D "Or" Game codeforces 579E Weakness and Poorness codeforces 579F LCS Aga

Codeforces Round #254(div2)A

很有趣的题.想到了就非常简单,想不到就麻烦了. 其实就是一种逆向思维:最后结果肯定是这样子: WBWBWBWB... BWBWBWBW... WBWBWBWB... ... 里面有“-”的地方改成“-”就行了. 但是我开始是正着想的,想每个点怎么处理,这还要看它周围点的状态,越想越麻烦... 这题中体现的正难则反的逆向思维很值得学习. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs

Codeforces Round #254(div2)B

就是看无向图有几个连通块,答案就是2n-num. 范围很小,就用矩阵来存图减少代码量. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #inc

Codeforces Round #260(div2)C(递推)

有明显的递推关系: f[i]表示i为数列中最大值时所求结果.num[i]表示数i在数列中出现了几次. 对于数i,要么删i,要么删i-1,只有这两种情况,且子问题还是一样的思路.那么很显然递推一下就行了:f[i]=max(f[i-1],f[i-2]+i*num[i]); 这里技巧在于:为了防止麻烦,干脆就所有数的出现次数都记录一下,然后直接从2推到100000(类似于下标排序),就不用排序了,也不用模拟删除操作了.这一技巧貌似简单,但实际上临场想出来也需要点水平. #include<iostrea

Codeforces Round #289 Div2 E

Problem 给一串长度为N的字符串,对于每个字符,若字符为元音,则权值为1,否则为0.一个子串的权值定义为该串所有字符权值之和除以字符个数,一个母串的权值定义为所有子串的权值之和.求母串的权值. Limits Time Limit(ms): 1000 Memory Limit(MB): 256 N: [1, 5*10^5] 字符集: 'A'-'Z' 元音: I E A O U Y Solution 考虑每个元音字符对母串的贡献,可以找出规律. More 举"ABCDOEFGHKMN"

Codeforces Round #403 div2 C. Andryusha and Colored Balloons

题目链接:Codeforces Round #403 div2 C. Andryusha and Colored Balloons 题意: 给你一棵n个节点的树,然后让你染色,规定相连的三个 节点不能同色,问需要的最少颜色,并输出其中一种方案. 题解: 因为只有相邻3个节点不同色. 所以直接DFS,每个节点都从1开始. 然后ans[v]!=ans[u]!=ans[fa]就行. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i&

CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)

思路来自这里,重点大概是想到建树和无解情况,然后就变成树形DP了- - /* CodeForces 840B - Leha and another game about graph [ 增量构造,树上差分 ] | Codeforces Round #429(Div 1) 题意: 选择一个边集合,满足某些点度数的奇偶性 分析: 将d = 1的点连成一颗树,不在树上的点都不连边. 可以发现,当某个节点u的所有子节点si均可操控 (u, si) 来满足自身要求 即整棵树上至多只有1个点不满足自身要求,