• 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
  • 相关阅读:
    首次在macbook使用unity开发遇到的一些列问题
    Java设计模式——策略模式
    ISODATA 迭代自组织数据分析技术
    js处理数组筛选对象
    LA LA LAND
    P4基础
    【设计模式】最快理解设计模式的几大原则
    【Go数据结构】链表 Linked List
    【go写设计模式】单例模式全都用我的
    【Go数据结构】静态链表 Static List
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/8366462.html
Copyright © 2020-2023  润新知