[NOIP2015]求和 (nowcoder.com)
1.超时了啊啊啊:(50/100)
#include
using namespace std;
const int N=5e6+5;
const int inf=0x3f3f3f3f;
#define int long long
int a[N],b[N];
void solve()
{
int n,m,sum=0;
cin>>n>>m;
for(int i=0;i>a[i];
}
for(int i=0;i>b[i];
}
for(int i=0;i
2.还超时:(90/100)
#include
using namespace std;
const int N=1e6+5;
const int inf=0x3f3f3f3f;
#define int long long
int a[N];
vectorve1[N],ve2[N];
void solve()
{
int n,m,sum=0;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
int b;
cin>>b;
if(i&1)ve1[b].push_back(i);
else ve2[b].push_back(i);
}
for(int i=1;i<=m;i++)
{
if(ve1[i].size()>1)
{
for(int j=0;j1)
{
for(int j=0;j
3。终于!!(100/100)
#include
using namespace std;
#define int long long
const int N = 4e5 + 4;
const int mod = 10007;
const int inf = 0x3f3f3f3f;
struct Node {
int poistion, size, color;
} node[N];
vectorve[N][2];
void solve() {
int n, m, sum = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> node[i].size;
node[i].poistion = i;
}
for (int i = 1; i <= n; i++) {
cin >> node[i].color;
int a = node[i].color;
ve[a][i & 1].push_back(node[i]); //按奇偶分类放在vector里面
}
for (int i = 1; i <= m; i++) {
for (int j = 0; j < 2; j++) {
int sum1 = 0, sum2 = 0, sum3 = 0;
if (ve[i][j].size() < 2)
continue;//某种颜色在奇数或偶数时只有一个
//奇数或偶数时某种颜色由于出现>=2次,所以一定存在满足条件的3点
/*
假设有一个条带:位置1,3,5的颜色一样,则有(1,3),(3,5),(1,5)
题目意思要求(位置1+位置2)*(大小1+大小2)
所以:(位置1+位置3)*(大小1+大小3)+(位置3+位置5)*(大小3+大小5)+(位置1+位置5)*(大小1+大小5)
乘开:位置1*大小1+位置2*大小2+位置3*大小3+(位置1+位置2+位置3)*(大小1+大小2+大小3)
*/
for (auto &it : ve[i][j]) {
sum1 += it.poistion; //奇数或偶数时某种颜色所在位置和
sum2 += it.size; //奇数或偶数时某种颜色大小和
sum3 = (sum3 + it.poistion * it.size) % mod; //奇数或偶数时某种颜色对应的位置乘以大小和
}
sum = (sum + (sum1 % mod) * (sum2 % mod) + ((ve[i][j].size() - 2) * sum3)) % mod;
}
}
cout << sum;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
solve();
return 0;
}
//不明白,我一个菜鸡为什么要碰这道题,啊啊啊啊啊啊啊啊啊啊啊,终于对了>-<