Codeforces Round #316 (Div. 2)

地址:点击打开链接

这个相对简单,自己做了3题。

570А — Elections

分析:简单的数组操作就OK了

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m,a[105];
int main()
{
    while(cin>>n>>m){
        memset(a,0,sizeof(a));
        int x;
       for(int i=0;i<m;i++){
        int maxn=0,pos=0;
        for(int j=0;j<n;j++){
            scanf("%d",&x);
            if(maxn<x){
                maxn=x;
                pos=j;
            }
        }
        a[pos]++;
       }
       int maxv=0,pos;
        for(int i=0;i<n;i++){
            if(maxv<a[i]){
                maxv=a[i];
                pos=i;
            }
        }
        cout<<pos+1<<endl;
    }
    return 0;
}

570B — Simple Game

分析:这个直接计算就可以了,根据m的在中点的左边还是右边来确定a
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m,a;
int main()
{
    while(cin>>n>>m){
      int may=n/2+1;
      if(may>m)a=m+1;
      else if(may<m)a=m-1;
      else{
        int mod=n%2;
        if(mod)a=m-1;
        else a=m-1;
      }
      if(a<=0)a=1;
        cout<<a<<endl;
    }
    return 0;
}

570C — Replacement

分析:因为每次替换m可能300000,如果每次都查询一遍,肯定会超时,我们可以第一次查询一遍‘ . ',以后根据要替换的位置来确定sum的情况

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m,x;
char c;
char s[300005];
int main()
{
    while(cin>>n>>m){
        for(int i=1;i<=n;i++)
            cin>>s[i];
        int sum=0;
        cin>>x>>c;
        m--;
        s[x]=c;
         for(int i=1;i<=n;i++){
                if(s[i]=='.'&&s[i+1]=='.')sum++;
            }
        cout<<sum<<endl;
        while(m--){
           cin>>x>>c;

            if(c=='.'&&s[x]!='.'){
                if(s[x-1]=='.')sum++;
                if(s[x+1]=='.')sum++;
            }
            else if(c!='.'&&s[x]=='.'){
                if(s[x-1]=='.'&&s[x+1]=='.')sum-=2;
                else if(s[x-1]!='.'&&s[x+1]!='.')sum=sum;
                else sum--;
            }
            s[x]=c;
            cout<<sum<<endl;
        }
    }
    return 0;
}

570D — Tree Requests

不会做,以后研究一下:点击打开链接

#include <iostream>
#include <stdio.h>
#include <string.h>
#include<vector>
#include <algorithm>
using namespace std;
vector<int>f[555555][27];
vector<int>g[555555];
int m,n;
char s[555555];
int tim,fst[555555],nxt[555555];
int x,y;
int d[555555];
void dfs(int u,int dis)
{
    tim++;
    fst[u]=tim;
    d[u]=dis;
  //  cout<<u<<' '<<tim<<' ';
    f[dis][s[u]-'a'].push_back(tim);
   // cout<<dis<<' '<<s[u]-'a'<<' '<<tim<<endl;
    for(int i=0;i<g[u].size();i++)
        dfs(g[u][i],dis+1);
    nxt[u]=tim;
   // cout<<u<<' '<<tim<<endl;
}
int main()
{
    scanf("%d%d",&m,&n);
    char kkk;
    for(int i=2;i<=m;i++){
        scanf("%d",&x);
        g[x].push_back(i);
    }
    getchar();
    for(int i=1;i<=m;i++){
        scanf("%c",&s[i]);
    }
    dfs(1,1);
    for(int t=1;t<=n;t++){
        int has=0;
        scanf("%d%d",&x,&y);
        int l=fst[x],r=nxt[x];
        for(int i=0;i<26;i++){
            int num=upper_bound(f[y][i].begin(),f[y][i].end(),r)-lower_bound(f[y][i].begin(),f[y][i].end(),l);
          //  cout<<"num is "<<num<<endl;
            if(num%2==1)has++;
        }
        if(has<2)printf("Yes\n");
        else printf("No\n");
    }return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值