Codeforces Round #245 (Div. 2)

91 篇文章 0 订阅
40 篇文章 0 订阅

A. Points and Segments (easy)

题意:给定的区间内0,1的个数之差不能超过一

思路:0,1,0,1...间赋值

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100;
struct node
{
    int x,col,id;
}a[maxn];
int n,m,l,r;
bool cmp1(node a,node b)
{
    return a.x<b.x;
}
bool cmp2(node a,node b)
{
    return a.id<b.id;
}
int main()
{
    //freopen("in.txt","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){scanf("%d",&a[i].x);a[i].id=i;}
    while(m--)cin>>l>>r;
    sort(a+1,a+n+1,cmp1);
    int tmp=0;
    for(int i=1;i<=n;i++)
    {
        a[i].col=tmp;
        tmp^=1;
    }
    sort(a+1,a+n+1,cmp2);
    for(int i=1;i<=n;i++)cout<<a[i].col<<" ";
    return 0;
}

B. Balls Game

题意:祖玛游戏,问最多能有多少个球被抵消

思路:枚举插入位置,然后更新最大值

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=110;
int n,m,k,a[maxn];
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    int tmp=0,ans=0,l,r,cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]==k)
        {
            l=r=i,cnt=0;
            while(a[l]==a[r])
            {
                tmp=2;
                while(l>1&&a[l-1]==a[l])l--,tmp++;
                while(r<n&&a[r]==a[r+1])r++,tmp++;
                if(tmp<3)break;
                cnt+=tmp;
                if(l<=1||r>=n)break;
                l--,r++;
            }
            ans=max(cnt-1,ans);
        }
    }
    printf("%d\n",ans);
    return 0;
}


C. Xor-tree
题目: 有一棵有根树,根是node 1 ,每个结点都有一个值 0 或者 1 , 你有一个操作 , 就是选择一个点 , 将这个点取反 , 他的儿子结点保持不变 , 他的孙子结点取反 , 儿子的孙子保持不变 。 然后给你每个结点的目标状态,问你需要最少的操作次数使初始状态变到目标状态 ,并且把你改变了哪些结点也输出来 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=100010;
vector<int> g[maxn],ans;
int n,in[maxn],goal[maxn];
void dfs(int u,int fa,int num1,int num2)//num1表示父结点的父结点的操作次数,num2表示父节点的操作次数
{
    if(in[u]^num1!=goal[u])
    {
        ans.push_back(u);
        num1^=1;
    }
    for(int i=0;i<g[u].size();i++)
    {
        int v=g[u][i];
        if(v!=fa)
        dfs(v,u,num2,num1);
    }
}
int main()
{
    int u,v;
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&u,&v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    for(int i=1;i<=n;i++)scanf("%d",&in[i]);
    for(int i=1;i<=n;i++)scanf("%d",&goal[i]);
    dfs(1,-1,0,0);
    int len=ans.size();
    printf("%d\n",len);

    for(int i=0;i<len;i++)cout<<ans[i]<<endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值