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

又是签到的一天。。。

只会A题系列

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

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

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

 

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

#include
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 
using namespace std;
unordered_mapmp[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;jsecond;
            t="";
            for(int j=0;jsecond;
            t="";
            for(int j=0;jsecond;
        }
    }
    cout<

 

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

#include 
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; jK) 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
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=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=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(nownow||mn[now]

 

你可能感兴趣的:(牛客网,ACM)