• WHU 1470 Join in tasks 水题


    http://acm.whu.edu.cn/land/problem/detail?problem_id=1470

    大概是给你一个队列,每次移动队头的数到队尾并减1,如果本身这个数为1就删去然后ans += 这个数 * (队列长度-1),求最小的ans

    只要最小的元素最先删除就能保证结果最小

    解法

    先对原数列排序 然后模拟原操作 ...但是t[i] 太大 .显然不能一个个的模拟...其实稍微推一下就能得出 每次到达能删除元素的时候 整个队列循环了t[i]-1...

    我们维护一下后缀和suffix...就能得到这个公式

    前面等差数列,后面等差数列O(1)就能求出 总共n个数,总共O(n)

    Notice : 等差数列里面/2不能随意取模,我们要对21e9+7的逆元再取模

    过程举例: 2 3 4 5 6

    第一轮 2 3 4 5 6    to  1 2 3 4 5

    第二轮: 2 3 4 5    to 1 2 3 4

    第三轮:  2 3 4      to 1 2 3

    第四轮: 2 3       to 2

    第五轮: 2 (结果懒得写了...自己可以拍一下)

     

    /********************* Template ************************/
    #include <set>
    #include <map>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <queue>
    #include <stack>
    #include <bitset>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cassert>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <fstream>
    #include <numeric>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    
    #define EPS         1e-8
    #define MAXN        100005
    #define MOD         ((int)1e9+7)
    #define PI          acos(-1.0)
    #define DINF        (1e10)
    #define LINF        ((1LL)<<50)
    #define INF         (0x3f3f3f3f)
    #define max(a,b)    ((a) > (b) ? (a) : (b))
    #define min(a,b)    ((a) < (b) ? (a) : (b))
    #define max3(a,b,c) (max(max(a,b),c))
    #define min3(a,b,c) (min(min(a,b),c))
    #define BUG         cout<<"BUG! "<<endl
    #define line        cout<<"--------------"<<endl
    #define L(t)        (t << 1)
    #define R(t)        (t << 1 | 1)
    #define Mid(a,b)    ((a + b) >> 1)
    #define lowbit(a)   (a & -a)
    #define FIN         freopen("in.txt","r",stdin)
    #define FOUT        freopen("out.txt","w",stdout)
    #pragma comment     (linker,"/STACK:102400000,102400000")
    
    typedef long long LL;
    typedef unsigned long long ULL;
    // typedef __int64 LL;
    // typedef unisigned __int64 ULL;
    // LL gcd(LL a,LL b){ return b?gcd(b,a%b):a; }
    // LL lcm(LL a,LL b){ return a*b/gcd(a,b); }
    
    /*********************   F   ************************/
    LL suf;
    LL a[MAXN];
    LL r2 = (1000000007)/2+1;
    int main()
    {
        int T;
        scanf("%d",&T);
        int cas = 1;
        for(int cas = 1; cas <= T; cas++){
            suf = 0;
            int n,num;
            scanf("%d",&n);
            num = n-1;
            for(int i = 0 ; i < n ; i++)
                scanf("%lld",&a[i]);
            sort(a,a+n);
            for(int i = 1 ; i < n ; i++){
                suf += a[i];
            }
            LL res = 0;
            LL ct = 0;
            for(int i = 0 ; i < n-1 ; i++){
                a[i] = a[i] - ct;
                res = (res + ((a[i]+1)%MOD*a[i]%MOD*r2%MOD*num%MOD))%MOD;
                int cnt = a[i] - 1;
                if(cnt > 0){
                    LL sum = (suf + (suf - (cnt-1) * num)) % MOD * cnt % MOD * r2 % MOD;
                    res = (res + (sum*num)%MOD) % MOD;
                }
                suf -= (num * cnt);
                suf = suf - ((a[i+1]-ct) - cnt);
                num--;
                ct += cnt;
            }
            printf("Case %d: ",cas);
            printf("%lld
    ",res);
        }
        return 0;
    }

     

     

     

  • 相关阅读:
    openVolumeMesh example 程序学习
    使用字符串创建java 对象
    HDU-1501-Zipper
    UVA-10285-Longest Run on a Snowboard
    HDU-2182-Frog
    HDU-2044-一只小蜜蜂
    POJ-1163-The Triangle
    HDU-1159-Common Subsequence
    HDU-2069-Coin Change
    HDU-4864-Task
  • 原文地址:https://www.cnblogs.com/Felix-F/p/3279689.html
Copyright © 2020-2023  润新知