zoukankan      html  css  js  c++  java
  • 思维题--CF1119D

    思维题--CF1119D

    D. Frets On Fire

    time limit per test

    1.5 seconds

    memory limit per test

    256 megabytes

    input

    standard input

    output

    standard output

    Miyako came to the flea kingdom with a ukulele. She became good friends with local flea residents and played beautiful music for them every day.

    In return, the fleas made a bigger ukulele for her: it has nn strings, and each string has (1018+1)(1018+1) frets numerated from 00 to 10181018. The fleas use the array s1,s2,…,sns1,s2,…,sn to describe the ukulele's tuning, that is, the pitch of the jj-th fret on the ii-th string is the integer si+jsi+j.

    Miyako is about to leave the kingdom, but the fleas hope that Miyako will answer some last questions for them.

    Each question is in the form of: "How many different pitches are there, if we consider frets between ll and rr (inclusive) on all strings?"

    Miyako is about to visit the cricket kingdom and has no time to answer all the questions. Please help her with this task!

    Formally, you are given a matrix with nn rows and (1018+1)(1018+1) columns, where the cell in the ii-th row and jj-th column (0≤j≤10180≤j≤1018) contains the integer si+jsi+j. You are to answer qq queries, in the kk-th query you have to answer the number of distinct integers in the matrix from the lklk-th to the rkrk-th columns, inclusive.

    Input

    The first line contains an integer nn (1≤n≤1000001≤n≤100000) — the number of strings.

    The second line contains nn integers s1,s2,…,sns1,s2,…,sn (0≤si≤10180≤si≤1018) — the tuning of the ukulele.

    The third line contains an integer qq (1≤q≤1000001≤q≤100000) — the number of questions.

    The kk-th among the following qq lines contains two integers lklk,rkrk (0≤lk≤rk≤10180≤lk≤rk≤1018) — a question from the fleas.

    Output

    Output one number for each question, separated by spaces — the number of different pitches.

    Examples

    input

    Copy

    6
    3 1 4 1 5 9
    3
    7 7
    0 2
    8 17
    

    output

    Copy

    5 10 18
    

    input

    Copy

    2
    1 500000000000000000
    2
    1000000000000000000 1000000000000000000
    0 1000000000000000000
    

    output

    Copy

    2 1500000000000000000
    

    1557539205126

    题意

    有n个数,m次询问。看样例,a_i为第一列,后面递增,组成矩阵,问从第l列到第r列有多少个不同的数

    思路

    每一行询问的区间为[a_i + l, a_i + r],有些区间会重叠在一起,有些区间不会,所以先计算出所有相邻的两个数的差,排序,按r-l+1二分查,把这些差分为两部分:后面为不重叠的,前面为重叠的。不重叠部分都*(r-l+1),重叠部分算出差的前缀和+(r-l+1)。代码实现上t多减了一个1,即把重叠部分的(r-l+1)跟不重叠部分一起算了。

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <cmath>
    #include <sstream>
    #include <algorithm>
    #include <set>
    #include <map>
    #include <vector>
    #include <queue>
    #include <iomanip>
    #include <stack>
    
    using namespace std;
    
    typedef long long LL;
    const int INF = 0x3f3f3f3f;
    const int N = 1e6 + 5;
    const int MOD = 1e9 + 9;
    
    #define lson l, m, rt << 1
    #define rson m + 1, r, rt << 1 | 1
    #define F(i, l, r) for(int i = l;i <= (r);++i)
    #define RF(i, l, r) for(int i = l;i >= (r);--i)
    
    LL m, n, a[N], b[N], c[N];
    int main()
    {
        //freopen("in.txt", "r", stdin);
        cin >> n;
        F(i, 1, n) cin >> a[i];
        sort(a + 1, a + n + 1);
        F(i, 1, n - 1) b[i] = a[i + 1] - a[i];
        sort(b + 1, b + n);
        F(i, 1, n - 1) c[i] = c[i - 1] + b[i];//前缀和
        cin >> m;
        while(m--)
        {
            LL l, r;
            cin >> l >> r;
            LL t = lower_bound(b + 1, b + n, r - l + 1) - b - 1;
            cout << (r - l + 1) * (n - t) + c[t] << " ";
        }
        return 0;
    }
    
    
  • 相关阅读:
    页面通过Ajax异步生成的添加按钮增加事件
    本地浏览器访问虚拟机上tomcat失败
    Android 6.0 动态申请 音频+拍照+相册 权限
    TouTiao开源项目 分析笔记6
    TouTiao开源项目 分析笔记5
    TouTiao开源项目 分析笔记4==>一个简单APP 整体常用框架
    TouTiao开源项目 分析笔记3
    TouTiao开源项目 分析笔记2
    Wind Of Change
    TouTiao开源项目 分析笔记1
  • 原文地址:https://www.cnblogs.com/shuizhidao/p/10848015.html
Copyright © 2011-2022 走看看