首页 > 其他分享 ># [Educational Codeforces Round 171](https://codeforces.com/contest/2026)

# [Educational Codeforces Round 171](https://codeforces.com/contest/2026)

时间:2024-10-30 16:58:16浏览次数:1  
标签:dots Educational frac 前缀 ts contest int mid codeforces

Educational Codeforces Round 171

D. Sums of Segments

定义四个前缀和:

\(s_i=a_1+a_2+\dots+a_i\)

\(u_i=s_1+s_2+\dots+s_i\)

\(t_i=s(i,i)+s(i,i+1)+\dots+s(i,n)\)

\(ts_i=t_1+t_2+\dots+t_i\)

\(s_i\)为\(a_i\)的前缀和,\(u_i\)为\(s_i\)的前缀和,\(t_i\)为分块之后第\(i\)块的和,\(ts_i\)为\(t_i\)的前缀和,也是分块之后的前缀和

\(b\)数组中第\(k\)块的个数是\(n-k+1\),前\(k\)块的总数为\(nk-\frac{k(k-1)}{2}\)

由前\(k\)块的总数可以二分,定位到\(l,r\)的块数,假定分别\(x,y\)

此时和\(sum=ts_{y}-ts_{x-1}\),还需要减去在\(x,y\)块中多加的

此时需要求位置\(l,r\)在块中的第几个

设第\(l,r\)个元素是\(s(x,z),s(y,w)\),由于位置\(xn-\frac{x(x-1)}{2}\)上的元素是\(s(x,n)\),则有

\(n-z=xn-\frac{x(x-1)}{2}-l\),可得:\(z=n-xn-\frac{x(x-1)}{2}+l\)

同理:\(w=n-yn-\frac{y(y-1)}{2}+r\)

然后删去多出来的部分

对于第\(x\)块,位置\(l\)在\(s(x,z)\),所以要去掉\(s(x,1)+s(x,2)+\dots+s(x,z-1)\),即下图中红色部分,就可以用我们前面的前缀和求取,

蓝色梯形部分为:\(u_{z-1}-u_x\)

橙色矩形部分为:\((x-z)s_{x-1}\)

所以减去的红色部分为:\(u_{z-1}-u_x-(x-z)s_{x-1}\)

同理可得对于第\(y\)块,需要减去的部分为:\(u_n-u_{w-1}-(n-w)s_{y-1}\)

代码如下:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f
const int mod = 1e9 + 7;
const int N = 3e5 + 10;
const double eps = 1e-6;
int n;
int s[N],u[N],t[N],ts[N],a[N];
int x, y, q, l, r ,z ,w;
void solve()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i ++){
        cin >> a[i];
        s[i] = s[i-1] + a[i];
        u[i] = u[i-1] + s[i]; 
    }
    for(int i = n ; i >= 1 ; i --)
        t[i] = t[i+1] + (n-i+1)*a[i];
    for(int i = 1 ; i <= n ; i ++)
        ts[i] = ts[i-1] + t[i];
    cin >> q;
    while(q--){
        cin >> l >> r;
        int sum = 0;
        int L = 1, R = n;
        while(L != R){
            int mid = (L + R) / 2;
            if(n*mid-mid*(mid-1)/2 < l) L = mid + 1;
            else R = mid;
        }
        x = L;
        L = 1 , R = n;
        while(L != R){
            int mid = (L + R) / 2;
            if(n*mid-mid*(mid-1)/2 < r) L = mid + 1;
            else R = mid;
        }
        y = L;
        // cout << x << " " << y << " ";
        sum = ts[y] - ts[x-1];
        z = n - (x*n -x*(x-1)/2 - l);
        w = n - (y*n -y*(y-1)/2 - r);
        sum -= u[z-1] - u[x-1] - (z-x)*s[x-1];
        sum -= u[n]-u[w] -s[y-1]*(n-w);
        cout << sum << endl;
    }
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int _ = 1;
    // cin >> _ ;
    while (_--)
        solve();
    return 0;
}

标签:dots,Educational,frac,前缀,ts,contest,int,mid,codeforces
From: https://www.cnblogs.com/xdeyt/p/18516173

相关文章

  • Codeforces 4 A-D
    题面ABCD难度:红橙橙黄题解A题目大意:判断一个正整数\(w\)能否表示成两个正偶数之和。解题思路:考虑分类讨论\(w\)。对于\(1\)和\(2\),显然为NO;对于\(w\ge3\),考虑将其表示为\(x+2\)。根据题意,若\(x\)为偶数,则答案显然必为YES;否则必然为NO。因为\(......
  • [CodeForces] CF628 题解
    A.TennisTournamentLink-CFLink-Luogu【题目大意】\(n\)个选手进行若干场比赛,胜者保留,败者淘汰。每场比赛为两人。每场比赛每个人需要\(b\)瓶水,裁判需要\(1\)瓶水。每个人参加这些比赛总共需要\(p\)条毛巾。注意:洛谷题面翻译有误!建议看英文版。【解题思路】每场比......
  • Atcoder DP Contest
    好像都在说这套题很好,所以来刷一遍太水的就只放代码了尚未完工,先发一下猫猫可爱捏https://www.tldraw.com/ro/1g8hQBpWTkduIlFxT3c0P?d=v-1275.1523.960.968.pageA.Frog1#include<bits/stdc++.h>usingnamespacestd;intn;inth[100001];intf[100001];intmain(){ ......
  • Educational Codeforces Round 171 (Rated for Div. 2) 10.28 ABCD题解
    EducationalCodeforcesRound171(RatedforDiv.2)10.28(ABCD)题解A.PerpendicularSegments数学(math)计算几何(geometry)题意:给定一个\(X,Y,K\)。需要求解出二维坐标系中的四个点\(A,B,C,D\),满足:\(0\leqA_x,B_x,C_x,D_x\leqX\),\(0\leqA_y,B_y,C_y,D_y\leqY\)。并......
  • Educational Codeforces Round 171 (Div. 2)
    EducationalCodeforcesRound171(Div.2)A猜结论,两条边的最小值最大时,两条边相等。所以取\(min(x,y)\)为边长的正方形,对角线就是所求。#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>usingnamespacestd;intx,y,k;voidsolve(){......
  • Codeforces Global Round 27
    CodeforcesGlobalRound27总结A将红色的位置\((r,c)\)移走,分为三块来考虑,蓝色的块移动\(m-c\),黄色的块移动\(m*(n-r)\),绿色的块移动\((m-1)*(n-r)\)。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#in......
  • 2024.10.14 Codeforces Round 978 (Div. 2)
    比赛链接Solved:4/7Upsolved:5/7Rank:447(rated343)D2.Asesino(HardVersion)题意:有n个人,除了一个卧底以外,其他人或者只会说真话,或者只会说谎,且他们知道彼此的身份。卧底只会说谎,但其他人都认为他只会说真话。现在你可以进行若干次询问,每次询问形如问第i个人第j个人是什么......
  • 2024.10.24 The 2021 ICPC Northwestern Russia Regional Contest
    比赛链接Solved:8/14Penalty:909Rank:23前五道签到题ABCHL。K.KaleidoscopicRoute题意给一张带边权的图,求一条1到n的路径,使经过的边数最少的同时边的极差最大。题解求出最短路图,然后DAG上dp:f和g分别表示从1到这个点能经过的最大边权和最小边权。然后每转移一条边(x,y,z......
  • 2024.10.4 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest
    比赛链接Solved:7/11Penalty:914Rank:1/74Rank(vp):63/1k+Dirt:22%G答案是4*纯色块数+5。考虑怎么维护这个纯色块数。这道题的修改保证了一个块纯色当且仅当其行列都纯色。因此对行列分别维护一棵线段树,维护每一层分别有多少个纯色节点,按层乘起来相加就行。K1操作的增加量......
  • 2024.10.3 2022-2023 ICPC Brazil Subregional Programming Contest
    比赛链接Solved:12/14Rank:5/1k+Rank(vp):49/2k+Penalty:1619Dirt:45%前10个题都比较简单/套路。L做法很好想。但是……因为不会写启发式合并卡了40min,警钟长鸣!intsum[N];map<int,int>col[N];intsz[N];llnow[N],ans[N];voidmrg(intx,inty){x=find(x),y=fi......