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
原文地址:https://www.cnblogs.com/acjiumeng/p/8366462.html