P2671 [NOIP2015 普及组] 求和 题解
题意#
给定一个带有颜色和数字的序列,我们要寻找三元组
为 和 的中点且都为整数。 。
我们命这样一个三元组对答案的贡献为
思路#
显然的结论是:
若当前到了一个点
则贡献表示为:
其中,
用一个
我们设一个数组
现在前缀和转移易得如下:
sum[0][col[i]][i&1]=sum[0][col[i]][i&1]+(i*num[i])
sum[1][col[i]][i&1]=sum[1][col[i]][i&1]+num[i]
sum[2][col[i]][i&1]=sum[2][col[i]][i&1]+1
sum[3][col[i]][i&1]=sum[3][col[i]][i&1]+i
当前位置
sum[0][col[i]][i&1]+i*sum[1][col[i]][i&1]+i*x*sum[2][col[i]][i&1]+x*sum[3][col[i]][i&1]
累加计数即可
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
template<typename P>
inline void read(P &x){
P res=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
res=res*10+ch-'0';
ch=getchar();
}
x=res*f;
}
using namespace std;
int T=1;
const int mod=10007;
int n,m;
int num[100010];
int col[100010];
int sum[4][100010][2];
signed main(){
read(n),read(m);
for(int i=1;i<=n;++i) read(num[i]);
for(int i=1;i<=n;++i) read(col[i]);
int ans=0;
for(int i=1;i<=n;++i){
int cx=col[i],x=num[i];
ans=(ans%mod+sum[0][col[i]][i&1]%mod+i*sum[1][col[i]][i&1]%mod+i*x*sum[2][col[i]][i&1]%mod+x*sum[3][col[i]][i&1]%mod+mod)%mod;
sum[0][col[i]][i&1]=(sum[0][col[i]][i&1]%mod+(i*num[i])%mod+mod)%mod;
sum[1][col[i]][i&1]=(sum[1][col[i]][i&1]%mod+num[i]%mod+mod)%mod;
sum[2][col[i]][i&1]=(sum[2][col[i]][i&1]%mod+1+mod)%mod;
sum[3][col[i]][i&1]=(sum[3][col[i]][i&1]%mod+i+mod)%mod;
}
cout<<ans%mod<<endl;
return 0;
}
作者:God_Max_Me
出处:https://www.cnblogs.com/lizihan00787/p/18323224
版权:本作品采用「God_Max_Me-非商业性使用」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!