站外题,求助,玄关,急急急
  • 板块题目总版
  • 楼主osu_rice222
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/14 19:35
  • 上次更新2024/8/14 21:31:38
查看原帖
站外题,求助,玄关,急急急
1246000
osu_rice222楼主2024/8/14 19:35

题目描述 一条狭长的纸带被均匀划分出了 n n 个格子,格子编号从 1 1 到 n n。每个格子上都染了一种颜色 c o l o r i color i ​ 用 [ 1 , m ] [1,m] 当中的一个整数表示,并且写了一个数字 n u m b e r i number i ​ 。

定义一种特殊的三元组: ( x , y , z ) (x,y,z),其中 x , y , z x,y,z 都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:

x y z xyz 是整数,且 x < y < z , y − x

z − y x<y<z,y−x=z−y c o l o r x

c o l o r z color x ​ =color z ​

满足上述条件的三元组的分数规定为 ( x + z ) × ( n u m b e r x + n u m b e r z ) (x+z)×(number x ​ +number z ​ )。整个纸带的分数规定为所有满足条件的三元组的分数的和。注意这个分数可能会很大,你只要输出整个纸带的分数除以 10007 10007 所得的余数即可。

输入格式 第一行是用一个空格隔开的两个正整数 n n 和 m , n m,n 表纸带上格子的个数, m m 表纸带上颜色的种类数。

第二行有 n n 用空格隔开的正整数,第 i i 数字 n u m b e r number 表纸带上编号为 i i 格子上面写的数字。

第三行有 n n 用空格隔开的正整数,第 i i 数字 c o l o r color 表纸带上编号为 i i 格子染的颜色。

输出格式 共一行,一个整数,表示所求的纸带分数除以 10007 10007 所得的余数。

输入输出样例 输入 #1复制 6 2 5 5 3 2 2 2 2 2 1 1 2 1 输出 #1复制 82 说明/提示 样例解释:所 有 满 足 条 件 的 三 元 组 为 : ( 1 , 3 , 5 ) , ( 4 , 5 , 6 ) (1,3,5),(4,5,6) 。 所 以 纸 带 的 分 数 为 ( 1 + 5 ) × ( 5 + 2 ) + ( 4 + 6 ) × ( 2 + 2 )

42 + 40

82 (1+5)×(5+2)+(4+6)×(2+2)=42+40=82。

数据范围

20 % 20%的数据, 1 ≤ n ≤ 100 1≤n≤100

40 % 40%的数据, 1 ≤ n ≤ 3000 1≤n≤3000

100 % 100%的数据, 1 ≤ n ≤ 100000 , 1 ≤ m ≤ 100000 , 1 ≤ c o l o r i ≤ m , 1 ≤ n u m b e r i ≤ 100000 1≤n≤100000,1≤m≤100000,1≤color i ​ ≤m,1≤number i ​ ≤100000

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,mod=1e5+7; 
int s[N][2],sum[N][2],c[N],x[N],n,m,ans;
int main(){
   scanf("%d%d",&n,&m);
   for(int i=1;i<=n;i++)
   	scanf("%d",&x[i]);
   for(int i=1;i<=n;i++){
   	scanf("%d",&c[i]);
       s[c[i]][i%2]++;			
       sum[c[i]][i%2]=(sum[c[i]][i%2]+x[i])%mod;   
   }
   for(int i=1;i<=n;i++)
       ans=(ans+i*(sum[c[i]][i%2]+x[i]*(s[c[i]][i%2]-2)%mod))%mod;
   cout<<ans;
   return 0;
}

2024/8/14 19:35
加载中...