zoukankan      html  css  js  c++  java
  • [NOIP2015PJ] 洛谷 P2671 求和

    思路分析

    直接暴力肯定是不行的,我们需要把各种相同的颜色分离出来计算。

    但是只分离出来没有用,因为三元组要求中间有一个y。可以看出,x和z的奇偶性相同时,存在y使三元组成立。

    所以我们用两个数组存储相同颜色的奇、偶情况,每次计算就变成计算这个序列的值。

    则原式=(num[1]+num[2])*(a[num[1]]+a[num[2])+(num[1]+num[3])*(a[num[1]]+a[num[3])+(num[1]+num[4])*(a[num[1]]+a[num[4])+

        ...+(num[2]+num[3])*(a[num[2]]+a[num[3])+(num[2]+num[4])*(a[num[2]]+a[num[4])+

        ...+(num[n-1]+num[n])*(a[num[n-1]]+a[num[n])

    其中,num[1]*a[num[1]]这个值被计算了n-1次,num[1]乘其他a[num[2]],a[num[3]],a[num[4]]……都为一次。

       num[2]*a[num[2]]这个值被计算了n-2次,num[1]乘其他a[num[1]],a[num[3]],a[num[4]]……都为一次。

    以此类推。

    代码

    #include<iostream>
    #include<vector>
    #include<cmath>
    
    using namespace std;
    
    long long n,m,a[100001],ans=0;
    //数据比较大,用longlong
    vector<long long> even[100001],odd[100001];
    //使用变长数组存储
    
    int ad(int pt)
    {
        
        long long count=0,ep=even[pt].size(),op=odd[pt].size(),s=0;
        for(int i=1;i<=ep;i++)
        {
            s=(s+a[even[pt][i-1]])%10007;//所有值的总和
        }
        for(int i=1;i<=ep;i++)
        {
            count+=(s%10007+(ep-2)*(a[even[pt][i-1]]%10007))%10007*even[pt][i-1]%10007;
            count%=10007;
    //一定要边/边%!
        }
        
        s=0;
        for(int i=1;i<=op;i++)
        {
            s=(s+a[odd[pt][i-1]])%10007;
        }
        for(int i=1;i<=op;i++)
        {
            count+=(s%10007+(op-2)*(a[odd[pt][i-1]]%10007))%10007*odd[pt][i-1]%10007;
            count%=10007;
        }
    
        return count;
    }
    
    int main()
    {
        long long cl;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(int i=1;i<=n;i++)
        {
            cin>>cl;
            if(i&1)
                odd[cl].push_back(i);
            else
                even[cl].push_back(i);
        }
        for(int i=1;i<=m;i++)
        {
            ans+=ad(i);
            ans%=10007;
        }
        cout<<ans;
    }
  • 相关阅读:
    【郑轻邀请赛 G】密室逃脱
    【郑轻邀请赛 C】DOBRI
    【郑轻邀请赛 F】 Tmk吃汤饭
    【郑轻邀请赛 I】这里是天堂!
    【郑轻邀请赛 B】base64解密
    【郑轻邀请赛 A】tmk射气球
    【郑轻邀请赛 H】 维克兹的进制转换
    解决adb command not found以及sdk环境配置
    adb shell 命令详解,android, adb logcat
    Unexpected exception 'Cannot run program ... error=2, No such file or directory' ... adb'
  • 原文地址:https://www.cnblogs.com/ehznehc/p/9900348.html
Copyright © 2011-2022 走看看