小警钟
  • 板块灌水区
  • 楼主ReqCxmChtChr
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/10/3 12:19
  • 上次更新2023/10/27 09:04:32
查看原帖
小警钟
421451
ReqCxmChtChr楼主2022/10/3 12:19

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成功弑君)

2022/10/3 12:19
加载中...