牛客网暑期ACM多校训练营(第七场)

又是签到的一天。。。

只会A题系列

链接:https://www.nowcoder.com/acm/contest/145/A
来源:牛客网
 

题意:左面一列分别为 0 ~ n-1   问你右面这一列怎么排数字使得 一一对应之后权值最小

权值是两个数字按位与的结果

开始想成了找规律。。后来队友提示按位取反。 n等于多少最好的情况权值都可以为0

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int ans[N];

int lb(int k)
{
    int n = 0;
    while(k > 0)
    {
        n ++;
        k >>= 1;
    }
    return n;
}

int main()
{
    int n;
    cin >> n;
    bitset<32> b;
    memset(ans, -1,sizeof(ans));
    for(int i = n - 1;i >= 0;i --)
    {
        if(ans[i] == -1)
        {
            b = ~i;
            int len = lb(i);
            int sum = 0;
            int t = 1;
            for(int k = 0;k < len;k ++)
            {
                sum += b[k] * t;
                t *= 2;
            }

            ans[i] = sum;
            ans[sum] = i;
        }
    }
    for(int i = 0;i < n;i ++)
        cout << ans[i] << " ";
    return 0;
}

链接:https://www.nowcoder.com/acm/contest/145/C
来源:牛客网

 

#include <bits/stdc++.h>
using namespace std;
unordered_map<string,int>mp[20];
string s;
string t;
int main(){
    int n;
    cin>>n>>s;
    mp[0][s]=1;
    for(int i=1;i<=n;i++){
        for(auto it=mp[i-1].begin();it!=mp[i-1].end();it++){
            s=it->first;
            t="";
            int len=(1<<(n+1-i));
            for(int j=0;j<len;j+=2){
                t+=((s[j]-'0')|(s[j+1]-'0'))+'0';
            }
            mp[i][t]+=it->second;
            t="";
            for(int j=0;j<len;j+=2){
                t+=((s[j]-'0')&(s[j+1]-'0'))+'0';
            }
            mp[i][t]+=it->second;
            t="";
            for(int j=0;j<len;j+=2){
                t+=((s[j]-'0')^(s[j+1]-'0'))+'0';
            }
            mp[i][t]+=it->second;
        }
    }
    cout<<mp[n]["1"]<<endl;
}

链接:https://www.nowcoder.com/acm/contest/145/E
来源:牛客网
 

#include <bits/stdc++.h>
using namespace std;
 
int f[1000777];
int C3(int n)
{
    return (n-2)*(n-1)*n/6;
}
int C4(int n)
{
    return (n-3)*(n-2)*(n-1)*n/24;
}
 
void print(int t,int a,int b,int c,int d,int e)
{
    int m=t*(t-1)/2+a+b+c+d+e;
    printf("%d %d\n",t+5,m);
 
    for(int i=1; i<=t; i++)
        for(int j=1; j<i; j++)
            printf("%d %d\n",i,j);
 
    for(int i=1; i<=a; i++) printf("%d %d\n",i,t+1);
    for(int i=1; i<=b; i++) printf("%d %d\n",i,t+2);
    for(int i=1; i<=c; i++) printf("%d %d\n",i,t+3);
    for(int i=1; i<=d; i++) printf("%d %d\n",i,t+4);
    for(int i=1; i<=e; i++) printf("%d %d\n",i,t+5);
    return ;
}
int main()
{
    for(int i=2; i<70; ++i) f[C3(i)]=i;
    int K,t=4;
    scanf("%d",&K);
    while(C4(t)<=K) ++t;
    --t;
    t=min(t,70);
    for(int i=2; i<=t; ++i) for(int j=i; j<=t; ++j) for(int k=j; k<=t; ++k) for(int l=k; l<=t; ++l)
    {
        int tot=C3(i)+C3(j)+C3(k)+C3(l);
        if(tot+C4(t)>K) break;
        tot=K-tot-C4(t);
        if(f[tot])
        {
            print(t,i,j,k,l,f[tot]);
            return 0;
        }
    }
}

链接:https://www.nowcoder.com/acm/contest/145/J
来源:牛客网

 

#include<bits/stdc++.h>
using namespace std;
#define maxn 1020
#define hsh accepted
char s[maxn];
int a[maxn][maxn];
int rig[maxn][maxn],up[maxn][maxn];
int n,m;
bool vis[55];
inline int idx(char c)
{
    if(c>='A'&&c<='Z') return c-'A';
    else return c-'a'+26;
}
int mn[1050];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;++i)
    {
        scanf("%s",s);
        for(int j=0;j<m;++j)
            a[i][j]=idx(s[j]);
    }
    for(int j=0;j<m;++j)
    {
        for(int i=0;i<52;++i) vis[i]=0;
        int now=n-1;
        while(now>=0&&(!vis[a[now][j]]))
        {
            vis[a[now][j]]=1;
            now--;
        }
        up[n-1][j]=now+1;
        for(int i=n-2;i>=0;--i)
        {
            vis[a[i+1][j]]=0;
            while(now>=0&&(!vis[a[now][j]]))
            {
                vis[a[now][j]]=1;
                now--;
            }
            up[i][j]=now+1;
        }
    }
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<52;++j) vis[j]=0;
        int now=0;
        while(now<m&&(!vis[a[i][now]]))
        {
            vis[a[i][now]]=1;
            now++;
        }
        rig[i][0]=now-1;
        for(int j=1;j<m;++j)
        {
            vis[a[i][j-1]]=0;
            while(now<m&&(!vis[a[i][now]]))
            {
                vis[a[i][now]]=1;
                now++;
            }
            rig[i][j]=now-1;
        }
    }
    long long ans=0;
    for(int i=0;i<n;++i)
        for(int j=0;j<m;++j)
        {
            int now=up[i][j];
            mn[i]=rig[i][j];
            for(int k=i-1;k>=now;--k) mn[k]=min(mn[k+1],rig[k][j]);
            ans+=i-now+1;
            for(int k=j+1;k<=rig[i][j];++k)
            {
                while(now<i&&(up[i][k]>now||mn[now]<k)) now++;
                ans+=i-now+1;
            }
        }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Soul_97/article/details/81537648