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;
}