记录编号 |
335508 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2015PJ]求和 |
最终得分 |
100 |
用户昵称 |
NewBee |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.895 s |
提交时间 |
2016-11-02 13:50:12 |
内存使用 |
6.01 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Cu fclose(stdin);fclose(stdout);return 0;
#define Begin freopen("2015sum.in","r",stdin);freopen("2015sum.out","w",stdout);chul();Cu;
using namespace std;
//南有乔木,不可休思。
const int maxn=100010;
typedef long long ll;
ll p=10007;
int tim,head[maxn],rlen[maxn],rehead[maxn];
ll ans=0,totx[maxn],mult[maxn],totnx[maxn],totn[maxn],nx[maxn];
struct op{
int to,next;
}r[maxn];
void mem(){
tim=ans=0;
memset(head,0,sizeof(head));
memset(totx,0,sizeof(totx));
memset(mult,0,sizeof(mult));
memset(totnx,0,sizeof(totnx));
memset(totn,0,sizeof(totn));
memset(nx,0,sizeof(nx));
memset(rlen,0,sizeof(rlen));
}
void insert(int fr,int to){
tim++;
r[tim].to=to;
r[tim].next=head[fr];
head[fr]=tim;
}
void reinsert(int fr,int to){
tim++;
r[tim].to=to;
r[tim].next=rehead[fr];
rehead[fr]=tim;
}
void chul(){
mem();
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&nx[i]);
nx[i]%=p;
}
int x;
for(int i=1;i<=n;i++){
scanf("%d",&x);
if(i%2){
rlen[i]=head[x];
insert(x,i);
}
else{
rlen[i]=rehead[x];
reinsert(x,i);
}
}
int lst;
for(int i=1;i<=n;i++){
lst=rlen[i];
lst=r[lst].to;
ans+=mult[lst];
ans+=totx[lst]*nx[i];
ans+=totnx[lst]*(i%p);
ans+=totn[lst]*(i%p)*(nx[i]);
ans%=p;
mult[i]=((mult[lst]+((i%p)*nx[i]))%p);
totx[i]=(totx[lst]+(i%p))%p;
totnx[i]=(totnx[lst]+nx[i])%p;
totn[i]=totn[lst]+1;
}
printf("%lld\n",ans%p);
}
int main(){
Begin;
}