一开始的40:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define f(III,MMM,NNN) for(int III=MMM;III<=NNN;III++)
typedef long long int ll;
const int N=1010,mod=10007;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m;
ll a[100010]={},c[100010]={};
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>c[i];
ll ans=0;
for(int i=1;i<=n-1;i++)
for(int j=i+1;j<=n;j++)//y-x=z-y →2y=z+x;
if((i+j)%2==0&&
i<(i+j)/2&&(i+j)/2<j
&&c[i]==c[j]){
ans+=(i+j)*(a[i]+a[j])%mod;
}
cout<<ans%mod;
return 0;
}
优化后:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define f(III,MMM,NNN) for(int III=MMM;III<=NNN;III++)
typedef long long int ll;
const int N=1010,mod=10007;
struct line{
ll number;
ll colour;
ll pos;
}a[100010];
bool cmp(line x,line y){
return x.colour <y.colour ;
}
ll ans=0;
void search(int b,int e){
ans%=mod;
for(int i=b;i<=e-1;i++)
for(int j=i+1;j<=e;j++)//y-x=z-y →2y=z+x;
if((a[i].pos +a[j].pos )%2==0&&
a[i].pos <(a[i].pos +a[j].pos )/2&&(a[i].pos +a[j].pos )/2<a[j].pos ){
ans+=(a[i].pos +a[j].pos )*(a[i].number +a[j].number )%mod;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i].number;
for(int i=1;i<=n;i++){
cin>>a[i].colour;
a[i].pos=i;
}
sort(a+1,a+n+1,cmp);
int b=0,e=0;
a[n+1].colour =m+1;
for(int i=1;i<=n+1;i++){
if(a[i].colour !=a[i-1].colour ){
b=e+1,e=i-1;
search(b,e);
}
}
cout<<ans%mod;
return 0;
}
优化后没有TLE了但全wa了...