Educational Codeforces Round 34

D. Almost Difference

分两种情况:

1.当|x-y|>1时,后面每个数与当前ai相减就是对于答案的贡献,用一个后缀和就可以直接得到

2.当|x-y|<=1时,当前的ai会多减去值为ai-1的值的数量,会多加ai+1的值的数量,用map去记录每个值的数量,然后修正即可

唯一要注意的地方是2e5*2e5*1e9会爆ll,记得用long double

#include<bits/stdc++.h>
#define ll long long
#define lnode node*2,start,mid
#define rnode node*2+1,mid+1,end
#define rep(i,a,b) for(ll i=a;i<=(b);i+=1)
#define input freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
#define To_string(num,str) {stringstream ss;ss<<num;ss>>str;}
#define To_num(str,num) {stringstream ss;ss<<str;ss>>num;}
const double pi=acos(-1.0);
const int maxn=(5e2+10);
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
using namespace std;
map<ll,ll> ys;
ll a[200010];
int main()
{   cin.tie(0);
    ios::sync_with_stdio(false);
    ll n;
    long double ans=0,sum=0;
    cin>>n;
    for(ll i=1;i<=n;i++)
    {
        cin>>a[i];
        sum+=a[i];
        ys[a[i]]+=1;
    }
    for(ll i=1;i<=n;i++)
    {
        ans+=sum-(long double)(n-i+1)*(long double)a[i];
        ans+=ys[a[i]-1]-ys[a[i]+1];
        sum-=a[i];
        ys[a[i]]-=1;
    }
    cout<<fixed<<setprecision(0)<<ans;


    return 0;
}

E. Swapping Characters

一个朴素的想法是,把每个字符串枚举n^2个位置作交换,放入map中最后统计是否有一个字符串出现了k次,那么该串即为所求,但是复杂度差点意思。

后来发现,可以对于第一个字符串作n^2次交换,然后记住交换的位置和其他字符串作比较,如果海明距离为2或0即可,为0时字符串中必须有相同的字符,要在交换前把第一个字符串和其他字符串的海明距离处理好,这样后续可以O(1)得到答案。

#include<bits/stdc++.h>
#define ll long long
#define lnode node*2,start,mid
#define rnode node*2+1,mid+1,end
#define rep(i,a,b) for(ll i=a;i<=(b);i+=1)
#define input freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
#define To_string(num,str) {stringstream ss;ss<<num;ss>>str;}
#define To_num(str,num) {stringstream ss;ss<<str;ss>>num;}
const double pi=acos(-1.0);
const int maxn=(5e2+10);
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
using namespace std;
char ch[2510][5010];
int dis[2510],temp[2510];
int ch1[27],ch2[27];
int main()
{   cin.tie(0);
    ios::sync_with_stdio(false);
    int k,n;
    cin>>k>>n;
    for(int i=1;i<=k;i++)
      cin>>ch[i];

      for(int j=0;j<n;j++)
        ch1[ch[1][j]-'a']+=1;

    int ssss=1;
    for(int i=1;i<=k;i++)
    {
        memset(ch2,0,sizeof(ch2));
        for(int j=0;j<n;j++)
          ch2[ch[i][j]-'a']+=1;
        for(int u=0;u<26;u++)
          if(ch1[u]!=ch2[u])
          {
              ssss=0;
              break;
          }
    }
    if(ssss==0)
    {
        cout<<"-1";
        return 0;
    }

    int yx=0;
    for(int i=0;i<n;i++)
      for(int j=i+1;j<n;j++)
        if(ch[1][i]==ch[1][j])
          yx=1;
    for(int i=2;i<=k;i++)
    {
        for(int j=0;j<n;j++)
          if(ch[1][j]!=ch[i][j])
            dis[i]+=1;
        //cout<<dis[i]<<endl;
    }

    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            for(int u=2;u<=k;u++)
              temp[u]=dis[u];
            int swt=1;
            for(int u=2;u<=k;u++)
            {
                if(ch[1][i]!=ch[u][j]&&ch[1][j]==ch[u][j])
                  temp[u]+=1;
                if(ch[1][j]!=ch[u][i]&&ch[1][i]==ch[u][i])
                  temp[u]+=1;

                if(ch[1][i]==ch[u][j]&&ch[1][j]!=ch[u][j])
                  temp[u]-=1;
                if(ch[1][j]==ch[u][i]&&ch[1][i]!=ch[u][i])
                  temp[u]-=1;
                //cout<<temp[u]<<endl;
                if(temp[u]==2) continue;
                if(temp[u]==0&&yx==1) continue;
                swt=0;
                break;
            }
            if(swt==1)
            {
                char tem=ch[1][i];
                ch[1][i]=ch[1][j];
                ch[1][j]=tem;
                cout<<ch[1];
                return 0;
            }
        }

    }
    cout<<"-1";
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值