从40到0分求助QAQ...
查看原帖
从40到0分求助QAQ...
366595
zty_luogu楼主2021/8/6 21:31

一开始的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了...

2021/8/6 21:31
加载中...