Codeforces Round #452 (Div. 2)

http://codeforces.com/contest/899

http://codeforces.com/contest/899/problem/A

题意:
给出一串数字,只有1 和 2 ,然后三人一组才能比赛。之后 是 ,两个人的必须全部参赛

题解:
按照题意模拟即可

#include <bits/stdc++.h>

using namespace std;
const int maxn = 2e5 + 5;
int a[maxn];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            cin>>a[i];

        std::sort(a,a+n);
        int ans=0;
        int l=n-1;
        for(int i=0;i<=l;i++)
        {
            if(a[i]+a[l]==3)
            {
                l--;
                ans++;
            }
            else if(a[i]==1&&a[i+1]==1&&a[l]==1&&i+1<l)
            {
                i++;
                l--;
                ans++;
            }
            else break;
        }
        cout<<ans<<endl;
    }
}

http://codeforces.com/contest/899/problem/B

#include <bits/stdc++.h>

using namespace std;
int a[13]={31,28,31,30,31,30,31,31,30,31,30,31};
int b[13]={31,29,31,30,31,30,31,31,30,31,30,31};
int d[26];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>d[i];
        }
        int p=0,ans=0;
        for(int i=0;i<12;i++)
        {
            ans=0;
            for(int j=0;j<n;j++)
            {
                if(d[j]==29) ans++;
                if(ans==2) 
                {
                    cout<<"No"<<endl;
                    return 0;
                }
                if(a[(i+j)%12]!=d[j]&&b[(i+j)%12]!=d[j]) break;
                else if(j==n-1) p=1;
            }
        }
        if(p) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}

https://codeforces.com/contest/899/problem/F

题意:给出一串字符串,只有大小写和数字的字符串。
然后每次输入l r c ,把l区间到r区间的c字符删除掉。
最后输出字符。

题解:
线段树造62个线段树,一个字符一颗,另外一颗线段树标记前缀里面多少字符被删除了,以此确定剩下的准确位置。
之后代码略长。
输出的时候标记下输出,否则超时。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 5;
int tree[66][maxn * 4], tag[maxn * 4], zimu[maxn];
char str[200005];
int n, m;
void builds ( int l, int r, int t )
{
    if ( l == r )
    {
        tag[t] = 1;
        return ;
    }

    int mid = ( l + r ) / 2;
    builds ( l, mid, t * 2 );
    builds ( mid + 1, r, t * 2 + 1 ) ;
    tag[t] = tag[t * 2] + tag[t * 2 + 1] ;

}

void updatetag ( int l, int r, int t, int v )
{
    if ( l == r )
    {
        tag[t] = 0;
        zimu[l] = 1;
        return ;
    }
    int mid = ( l + r ) / 2;
    if ( v <= mid )
        updatetag ( l, mid, t * 2, v );
    else
        updatetag ( mid + 1, r, t * 2 + 1, v );

    tag[t] = tag[t * 2] + tag[t * 2 + 1];

}

int tagsum ( int l, int r, int left, int right, int t )
{
    if ( left > right )
        return 0;
    if ( l == left && r == right )
    {
        return tag[t];
    }
    int mid = ( l + r ) / 2;
    int x = 0, y = 0;
    x = tagsum ( l, mid, max ( l, left ), min ( mid, right ), t * 2  );
    y = tagsum ( mid + 1, r, max ( l, mid + 1 ), min ( r, right ), t * 2 + 1 ) ;
    return x + y;
}
void build ( int l, int r, int t, int tre[], char c )
{

    if ( l == r )
    {
        if ( c == str[l] )
        {
            //   cout<<c<<' '<<l<<endl;
            tre[t] = 1;
        }
        return ;
    }

    int mid = ( l + r ) / 2;

    build ( l, mid, t * 2, tre, c );

    build ( mid + 1, r, t * 2 + 1, tre, c );

    tre[t] = tre[t * 2] + tre[t * 2 + 1 ] ;

}

void change_s ( int l, int r, int t, int ttree[] )
{

    if ( l == r )
    {
        updatetag ( 1, n, 1, l );
        // cout<<"dddddddddddddd  "<<l<<' '<<r<<' '<<t<<' '<<str[l]<<' '<<ttree[t]<<endl;
        ttree[t] = 0;
        return ;
    }
    ttree[t] = 0;

    int mid = ( l + r ) / 2;
    if ( ttree[t * 2] != 0 )
        change_s ( l, mid, t * 2, ttree );
    if ( ttree[t * 2 + 1] != 0 )
        change_s ( mid + 1, r, t * 2 + 1, ttree ) ;


}
int update ( int l, int r, int left, int right, int t, int ttree[], int p )
{
    //if(p) cout<<l<<' '<<r<<' '<<left<<' '<<right<<endl;
    if ( left > right )
        return 0;

    if ( l == left && right == r )
    {
        if ( p && ttree[t] )
        {
            change_s ( l, r, t, ttree );
        }

        return ttree[t];

    }

    int mid = ( l + r ) / 2;
    int x = 0, y = 0 ;
    x = update ( l, mid, max ( left, l ), min ( right, mid ), t * 2, ttree, p );
    y = update ( mid + 1, r, max ( left, mid + 1 ), min ( right, r ), t * 2 + 1, ttree, p ) ;
    ttree[t] = ttree[t * 2] + ttree[t * 2 + 1];
    return x + y;
}
int tage[66];


int findlr ( int x )
{
    int l = 1, r = n, tt = n;
    while ( l < r + 1 )
    {
        int mid = ( l + r ) / 2;
        int sum = tagsum ( 1, n, 1, mid, 1 ) ;
        // cout<<"asd  "<<mid<<' '<<sum<<endl;
        if ( sum < x )
            l = mid + 1;
        else if ( sum >= x )
            r = mid - 1;
    }
    return r + 1;
}
int findr ( int x )
{
    int l = 1, r = n, tt = n;
    while ( l <= r )
    {
        int mid = ( l + r ) / 2;
        int sum = tagsum ( 1, n, 1, mid, 1 ) ;
        if ( sum <= x )
            l = mid + 1;
        else if ( sum >= x )
            r = mid - 1, tt = min ( tt, mid );
    }
    return l - 1;
}

int main()
{
    while ( cin >> n >> m )
    {
        // cin>>str;
        str[0] = '0';
        scanf ( "%s", str + 1 );
        // cout<<str<<endl;
        int x, y;
        char c;
        memset ( tree, 0, sizeof ( tree ) );
        memset ( zimu, 0, sizeof ( zimu ) );
        builds ( 1, n, 1 ) ;
        for ( int i = 0; i < 62; i++ )
        {
            if ( i < 26 )
                build ( 1, n, 1, tree[i], 'a' + i );
            else if ( i < 52 )
                build ( 1, n, 1, tree[i], 'A' + i - 26 );
            else
                build ( 1, n, 1, tree[i], '0' + i - 52 );
            // cout<<i<<endl;
        }
        for ( int i = 0; i < m; i++ )
        {
            cin >> x >> y >> c;
            int vis;
            if ( c <= '9' )
                vis = c - '0' + 52;
            else if ( c >= 'a' )
                vis = c - 'a';
            else
                vis = 26 + c - 'A';

            x = findlr ( x );
            y = findr ( y );
            //  cout<<"xxxxxxxxxxx   "<<vis<<' '<<c<<' '<<int('9')<<' '<<x<<' '<<y<<endl;
            //  cout<<"find  "<<update(1,n,1,n,1,tree[vis],ctree[vis],0)<<endl ;
            update ( 1, n, x, y, 1, tree[vis], 1 ) ;
            //   cout<<"find  "<<update(1,n,1,n,1,tree[vis],ctree[vis],0)<<endl ;
        }
        memset ( tage, 0, sizeof ( tage ) );
        for ( int i = 1; i <= n; i++ )
        {
            if ( !zimu[i] )
                cout << str[i];
        }
        cout << endl;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值