Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value F. Swaps Again

题目:click
题意:给定n个元素的数组,当数组的数分为二进制,你可以挑选k个数,如果这k个数的二进制的第i位的1的个数大于等于max(1,k-2),那么就计算他的贡献值。问最大的贡献值。

可以发现,k<=3的时候只要有一个1就是贡献,本质就是或操作,当话需要其他位贡献的时候,k=4那么需要2个1,比如3个构成了:101011
我需要去贡献第2位的1那么需要两个不可能做到,再增加需要3个,而且对比他高的位数可能会发生负贡献,O( n n n n*n*n )暴力即可。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define MAX_len 200005*4
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
const int mod=998244353;
const int MAXlen=1e5+10;
long double eps=1e-9;
ll a[510];
int book[62];
int vis[62];
int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%I64d",&a[i]);
    }
    ll ans=0;
    for(i=1;i<=n;i++)
    {
        ll temp=0;
        temp|=a[i];
        ans=max(temp,ans);
        for(j=i+1;j<=n;j++)
        {
            ll t1=temp|a[j];
            ans=max(t1,ans);
            for(int k=j+1;k<=n;k++)
            {
                ll t2=t1|a[k];
                ans=max(ans,t2);
            }
        }
    }
    printf("%I64d\n",ans);
    return 0;
}

题目:click
题意:问a是否能够通过前缀和后缀交换得到数组b。
看个样例就更明显了,t1 t2 t3 t4 t5 t6,如果我们选择交换的个数为3,可以得到,t4 t5 t6 t1 t2 t3,思路就出来了,无论怎么交换,t4始终对应t3,t1对应t6。直接针对b数组的数组对应模式到a数组中找就可以了。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define MAX_len 200005*4
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
const int mod=998244353;
const int MAXlen=1e5+10;
long double eps=1e-9;
int a[510],b[510];
int book[510];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(book,0,sizeof(book));
        int n,i,j;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(i=1;i<=n;i++)
            scanf("%d",&b[i]);
        if(n&1)
        {
            if(a[n/2+1]!=b[n/2+1])
            {
                printf("No\n");
                continue;
            }
        }
        bool flag=true;
        int yy=n/2;
        for(i=1;i<=yy;i++)
        {
            int t1=b[i];
            int t2=b[n-i+1];
            bool hh=false;
            for(j=1;j<=yy;j++)
            {
                if(book[j]==0)
                {
                    if(a[j]==t1&&a[n-j+1]==t2)
                    {
                        hh=true;
                        book[j]=1;
                        book[n-j+1]=1;
                        break;
                    }
                    if(a[j]==t2&&a[n-j+1]==t1)
                    {
                        hh=true;
                        book[j]=1;
                        book[n-j+1]=1;
                        break;
                    }
                }
            }
                if(hh)
                {
                    continue;
                }
                else
                {
                    flag=false;
                    break;
                }
        }
        if(flag)
            printf("yes\n");
        else
            printf("No\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/106658085