round 633

A

n种即可

 

B

头尾开始取或中间开始取都可

#include <bits/stdc++.h>
#define debug freopen("r.txt","r",stdin)
#define mp make_pair
using namespace std;
typedef long long ll;
const int maxn = 2e6+6;
const int INF = 0x3f3f3f3f; 
const int mod = 998244353;
inline ll read(){ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;}
ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
int t,n,i,a[maxn],f,l,r,b[maxn],k;
int main()
{
//    debug;
    t=read();
    while (t--)
    {
        n=read();
        for (i=1;i<=n;i++) a[i]=read();
        sort(a+1,a+1+n);
        l=1,r=n;f=1;k=0;
        while (l<=r)
        {
            if (f==1) 
            {
                
                b[++k]=a[l];
                f*=-1;
                l++;
            }
            else
            {
                b[++k]=a[r];
                f*=-1;
                r--;
            }
        }
        for (i=n;i;i--) cout<<b[i]<<" ";
        cout<<endl;
    }
 } 
View Code

 

C

看错题目,以为只能连续区间的元素加2^(x-1),结果题目意思是可以在第x秒选一些元素让它们都加上2^(x-1)

只能感叹一下自己的英语水平像shi一样

改编一段台词,回复一下已经崩了的心态

选自《无间道1》

我:挺倒霉的。
出题人:我也出过题意易懂的题目。
我:哼,你们这些出题人真有毛病,老喜欢出些迷惑性强的数据。
出题人:我不像你,我不用比赛。我要的题解呢?
我:我要的rating分你也未必给我。
出题人:什么意思?你上来谈条件的?
我:给我上rating分。
出题人:怎么给你上rating分?
我:我以前没好好学习英语,现在我只想读懂题意然后AC。
出题人:好,跟评测机说,看它让不让你AC。
我:那你就是让我死?
出题人:对不起,我是出题人。
我:我错了…

学好英语,很有必要

#include <bits/stdc++.h>
#define debug freopen("r.txt","r",stdin)
#define mp make_pair
using namespace std;
typedef long long ll;
const int maxn = 2e5+6;
const int INF = 0x3f3f3f3f; 
const int mod = 998244353;
inline ll read(){ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;}
ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
int t,n,i,a[maxn],maxx,maxxx;
int main()
{
    t=read();
    while (t--)
    {
        n=read();
        for (i=1;i<=n;i++) a[i]=read();
        maxx=-INF;
        maxxx=0;
        for (i=1;i<=n;i++)
        {
            if (a[i]>maxx) maxx=a[i];
                else maxxx=max(maxxx,maxx-a[i]);
         } 
        if (maxxx==0) cout<<0<<endl;
        else
        {
            for (i=40;i>=0;i--) 
                if ((1ll<<i)&maxxx)
                {
                    cout<<i+1<<endl;
                    break;
                }
        }
    }
    return 0;
}
View Code

 

D

对于最小的f,总是可以用不多于3个数字。如果每个叶子点对之间的距离都是偶数(即所有叶子点奇偶性都是偶数),那么最小f为1,否则为3。

对于最大的f,为所有边的个数减去(每个C点连接的叶子点个数(未合并前) - 1)

 

 图源于cf官方题解

#include <bits/stdc++.h>
#define debug freopen("r.txt","r",stdin)
#define mp make_pair
using namespace std;
typedef long long ll;
const int maxn = 2e5+6;
const int INF = 0x3f3f3f3f; 
const int mod = 998244353;
inline ll read(){ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;}
ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
int n,i,x,y,du[maxn],lca[maxn],leave,noleave,check[maxn],cnt,minn,maxx;
vector <int> G[maxn];
bool t;
void dfs(int u,int father,int step)
{
    if (check[u] && step)
    {
        t=true;
    }
    for (auto v:G[u])
    {
        if (v==father) continue;
        dfs(v,u,step^1);
    }
}
int main()
{
    n=read();
    memset(check,false,sizeof(check));
    for (i=1;i<n;i++)
    {
        x=read(),y=read();
        G[x].push_back(y);
        G[y].push_back(x);
        du[x]++,du[y]++;
    }
    for (i=1;i<=n;i++)
        if (du[i]==1)
        {
            leave++;
            lca[++cnt]=G[i][0];
        }
    minn=1;
    t=false;
    sort(lca+1,lca+1+cnt);
    int num=unique(lca+1,lca+1+cnt)-lca-1; 
    for (i=1;i<=num;i++)
    {
        check[lca[i]]=true;
        noleave++;
    }
    dfs(lca[1],0,0);
    if (t) minn=3;
    cout<<minn<<" "<<n-leave+noleave-1<<endl;
}
View Code

 

posted @ 2020-04-13 17:38  Y-KnightQin  阅读(131)  评论(0编辑  收藏  举报