AC:
#include<bits/stdc++.h>
#define MAXN 100010
#define MOD 10007
#define int long long
using namespace std;
//x*number x+x*numberz+z*numberx+z*numberz
int n,m;
int a[MAXN],b[MAXN];
vector<int>part[MAXN][2];
vector<int>hasa[MAXN][2];
int tmp[MAXN],tmp1[MAXN],tmp2[MAXN];
int sum[MAXN],sum1[MAXN],sum2[MAXN];
signed main(){
//freopen("g.in","r+",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int j=1;j<=n;j++){
cin>>b[j];
}
for(int i=1;i<=n;i++){
part[b[i]][i%2].push_back(a[i]);
hasa[b[i]][i%2].push_back(i);
}
int ans=0;
int cnt=0;
for(int i=1;i<=m;i++){
for(int j=0;j<2;j++){
for(int k=0;k<part[i][j].size();k++){
sum[k]=tmp[k]=hasa[i][j][k]*part[i][j][k]%MOD;
sum1[k]=tmp1[k]=hasa[i][j][k];
sum2[k]=tmp2[k]=part[i][j][k];
if(k!=0){
sum[k]+=sum[k-1];
sum[k]%=MOD;
sum1[k]+=sum1[k-1];
sum1[k]%=MOD;
sum2[k]+=sum2[k-1];
sum2[k]%=MOD;
}
cnt++;
}
int nm=part[i][j].size();
for(int k=0;k<nm;k++){
ans+=(long long)tmp1[k]*tmp2[k]%MOD*(nm-k-1)%MOD+tmp1[k]*(MOD+sum2[nm-1]-sum2[k])%MOD+tmp2[k]*(MOD+sum1[nm-1]-sum1[k])%MOD+(MOD+sum[nm-1]-sum[k])%MOD;
ans%=MOD;
cnt++;
}
}
}
cout<<ans;
}
TLE:80pts
#include<bits/stdc++.h>
#define int long long
#define MAXN 100010
#define MOD 10007
using namespace std;
//x*number x+x*numberz+z*numberx+z*numberz
int n,m;
int a[MAXN],b[MAXN];
vector<int>part[MAXN][2];
vector<int>hasa[MAXN][2];
int tmp[MAXN],tmp1[MAXN],tmp2[MAXN];
int sum[MAXN],sum1[MAXN],sum2[MAXN];
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int j=1;j<=n;j++){
cin>>b[j];
}
for(int i=1;i<=n;i++){
part[b[i]][i%2].push_back(a[i]);
hasa[b[i]][i%2].push_back(i);
}
int ans=0;
for(int i=1;i<=m;i++){
memset(tmp,0,sizeof(tmp));
memset(tmp1,0,sizeof(tmp1));
memset(tmp2,0,sizeof(tmp2));
memset(sum,0,sizeof(sum));
memset(sum1,0,sizeof(sum1));
memset(sum2,0,sizeof(sum2));
for(int j=0;j<2;j++){
for(int k=0;k<part[i][j].size();k++){
sum[k]=tmp[k]=hasa[i][j][k]*part[i][j][k];
sum1[k]=tmp1[k]=hasa[i][j][k];
sum2[k]=tmp2[k]=part[i][j][k];
if(k!=0){
sum[k]+=sum[k-1];
sum1[k]+=sum1[k-1];
sum2[k]+=sum2[k-1];
}
}
int nm=part[i][j].size();
for(int k=0;k<nm;k++){
ans+=tmp1[k]*tmp2[k]*(nm-k-1)+tmp1[k]*(sum2[nm-1]-sum2[k])+tmp2[k]*(sum1[nm-1]-sum1[k])+sum[nm-1]-sum[k];
ans%=MOD;
}
}
}
cout<<ans;
}
懂?(memset成功弑君)