zoukankan      html  css  js  c++  java
  • Codeforces Round #368 (Div. 2)

    A:水题

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=(1<<15)+10,maxn=400000+10,inf=0x3f3f3f3f;
    
    string s;
    int main()
    {
        int n,m;
        cin>>n>>m;
        bool w=1;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>s;
                if(s=="C"||s=="M"||s=="Y")w=0;
            }
        }
        if(w)puts("#Black&White");
        else puts("#Color");
        return 0;
    }
    /********************
    
    ********************/
    A

    B:与环相连的点找一下就好了

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=100000+10,maxn=400000+10,inf=0x3f3f3f3f;
    
    vector<pii>v[N];
    int a[N];
    int ok[N];
    int main()
    {
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;i<m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            v[a].pb(mp(b,c));
            v[b].pb(mp(a,c));
        }
        int ans=1e9+10;
        for(int i=1;i<=k;i++)
        {
            scanf("%d",&a[i]);
            ok[a[i]]=1;
        }
    //    puts("++++");
        for(int i=1;i<=k;i++)
        {
            for(int j=0;j<v[a[i]].size();j++)
            {
                pii te=v[a[i]][j];
                if(!ok[te.fi])ans=min(ans,te.se);
            }
        }
        if(ans>=1e9+10)puts("-1");
        else printf("%d
    ",ans);
        return 0;
    }
    /********************
    
    ********************/
    B

    C:题意:给你一个数,找其他两个数构成勾股数

    题解:通过找规律可以看出对于任一素数x,和(x*x-1)/2,(x*x-1)/2+1可以构成勾股数,那么可以通过分解素数,但是2的倍数不行,但是我们可以通过3,4,5来解决

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=100000+10,maxn=400000+10,inf=0x3f3f3f3f;
    
    int main()
    {
        fio;
        ll n;
        cin>>n;
        ll res=n;
        for(ll i=2;i*i<=res;i++)
        {
            if(res%i==0)
            {
                while(res%i==0)res/=i;
                if(i!=2)
                {
                    ll te=(i*i-1)/2;
                    cout<<n/i*te<<" "<<n/i*(te+1)<<"
    ";
                    return 0;
                }
            }
        }
        if(res>1&&res!=2)
        {
            ll te=(res*res-1)/2;
            cout<<n/res*te<<" "<<n/res*(te+1)<<"
    ";
            return 0;
        }
        if(n%4==0)
        {
            printf("%lld %lld
    ",n/4*3,n/4*5);
            return 0;
        }
        puts("-1");
        return 0;
    }
    /********************
    
    ********************/
    C

    D:题意:n个数,四种操作,1如果这个地方没放过书,那就放上,2如果放过书就拿掉,3把一排书取过的拿走,没有的放上,4回到操作x

    题解:很直观的主席树,主要是区间操作有点麻烦,我们可以用标记永久化,lazy是翻转标记,没有query,直接输出sum【rt【x】】即可,但是更新的时候就需要把这一段经过的lazy标记全部记下来,需要注意的是,以前的主席树修改操作,我都是直接修改标号的,但是这题会有修改修改操作,会有覆盖,所有就要不修改,直接把rt【i】复制成rt【x】,那么访问的时候就会指向rt【x】

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define C 0.5772156649
    //#define ls l,m,rt<<1
    //#define rs m+1,r,rt<<1|1
    #define pil pair<int,ll>
    #define pii pair<int,int>
    #define ull unsigned long long
    #define base 1000000000000000000
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=1000000+10,maxn=400000+10,inf=0x3f3f3f3f;
    
    int tot,ls[N*20],rs[N*20],rt[N],sum[N*20],lazy[N*20];
    int oper[N];
    void build(int &o,int l,int r)
    {
        o=++tot;
        sum[o]=lazy[o]=0;
        if(l==r)return ;
        int m=(l+r)>>1;
        build(ls[o],l,m);
        build(rs[o],m+1,r);
    }
    void update(int &o,int filp,int l,int r,int last,int L,int R,int op)
    {
        o=++tot;
        ls[o]=ls[last];
        rs[o]=rs[last];
        sum[o]=sum[last];
        lazy[o]=lazy[last];
        //printf("%d %d
    ",l,r);
        if(L<=l&&r<=R)
        {
            if(op==1)
            {
    //            printf("+++++%d
    ",sum[o]^filp^lazy[o]);
                if(!(sum[o]^filp^lazy[o]))lazy[o]^=1;
            }
            else if(op==2)
            {
                if(sum[o]^filp^lazy[o])lazy[o]^=1;
            }
            else if(op==3)lazy[o]^=1;
            return ;
        }
        int m=(l+r)>>1;
        if(L<=m)update(ls[o],filp^lazy[o],l,m,ls[last],L,R,op);
        if(m<R)update(rs[o],filp^lazy[o],m+1,r,rs[last],L,R,op);
        sum[o]=0;
        if(lazy[ls[o]])sum[o]+=m-l+1-sum[ls[o]];
        else sum[o]+=sum[ls[o]];
        if(lazy[rs[o]])sum[o]+=r-m-sum[rs[o]];
        else sum[o]+=sum[rs[o]];
    //    printf("%d###%d###%d
    ",l,r,sum[o]);
    }
    int main()
    {
        tot=0;
        int n,m,q;
        scanf("%d%d%d",&n,&m,&q);
        build(rt[0],1,n*m);
        int cnt=0;
        for(int i=1;i<=q;i++)
        {
            int op;
            scanf("%d",&op);
            cnt++;
            if(op==1)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                update(rt[cnt],0,1,n*m,rt[cnt-1],(x-1)*m+y,(x-1)*m+y,1);
    //            printf("
    !!!%d
    ",(x-1)*m+y);
            }
            else if(op==2)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                update(rt[cnt],0,1,n*m,rt[cnt-1],(x-1)*m+y,(x-1)*m+y,2);
    //            printf("
    !!!%d
    ",(x-1)*m+y);
            }
            else if(op==3)
            {
                int x;
                scanf("%d",&x);
                update(rt[cnt],0,1,n*m,rt[cnt-1],(x-1)*m+1,x*m,3);
    //            printf("
    %d-----%d
    ",(x-1)*m+1,x*m);
            }
            else
            {
                int x;
                scanf("%d",&x);
                rt[cnt]=rt[x];
            }
            if(lazy[rt[cnt]])printf("%d
    ",n*m-sum[rt[cnt]]);
            else printf("%d
    ",sum[rt[cnt]]);
        }
        return 0;
    }
    /********************
    19 16 14
    2 11 2
    1 16 3
    1 16 3
    3 13
    1 13 3
    4 9
    1 5 11
    3 1
    ********************/
    D
  • 相关阅读:
    算法竞赛入门经典习题2-3 韩信点兵
    ios入门之c语言篇——基本函数——5——素数判断
    ios入门之c语言篇——基本函数——4——数值交换函数
    144. Binary Tree Preorder Traversal
    143. Reorder List
    142. Linked List Cycle II
    139. Word Break
    138. Copy List with Random Pointer
    137. Single Number II
    135. Candy
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/8366462.html
Copyright © 2011-2022 走看看