Codeforces 371E Subway Innovation (前缀和预处理应用)

题目链接 Subway Innovation

首先不难想到所求的k个点一定是连续的,那么假设先选最前面的k个点,然后在O(1)内判断第2个点到第k+1个点这k个点哪个更优。

判断的时候用detla[i]来记录信息。令delta[k+1]+delta[k+2]+......+delta[k+x] = sum[x],则sum[x]最大时,x即为排完序后的要选的k个点的最大的编号。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b) for(int i(a); i <= (b); ++i)
#define LL           long long

const int N = 300010;

struct node{
    LL x, y;
    friend bool operator < (const node &a, const node &b){
        return a.x < b.x;
    }
} a[N];

LL x[N], s[N], delta[N];
LL n, k, p, ss, ans, cnt;

int main(){

    scanf("%lld", &n);
    s[0] = 0;
    rep(i, 1, n){
        scanf("%lld", &a[i].x);
        a[i].y = i;
    }

    scanf("%lld", &k);
    sort(a + 1, a + n + 1);
    rep(i, 1, n) x[i] = a[i].x;
    rep(i, 1, n) s[i] = s[i - 1] + x[i];
    int j = 0;
    rep(i, k + 1, n){
        ++j;
        delta[i] = (k - 1) * (x[i] + x[j]) - 2 * (s[i - 1] - s[j]);
    }
    cnt = ans = 0, p = k;
    rep(i, k + 1, n){
        cnt += delta[i];
        if (ans > cnt){
            ans = cnt;
            p = i;
        }
    }
    rep(i, p - k + 1, p) printf("%lld\n", a[i].y);
    return 0;

}
时间: 2024-10-12 23:38:51

Codeforces 371E Subway Innovation (前缀和预处理应用)的相关文章

HDU 5550 - Game Rooms(DP + 前缀和预处理)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=5550 题意: 一个大楼有n(2≤n≤4000)层,每层可以建一个乒乓球房或者一个游泳房,且每种房间在大楼里至少要有一个.已知每层有ti个乒乓球运动员和pi个游泳运动员(1≤ti,pi≤1e9).问怎样建房,才能使得所有运动员到相应房间的总距离最小,输出最小值. 分析: 因为每种房间在大楼里至少要有一个,所以肯定会有这样一种状态:第i层是一种房间,第i+1层是另一种房间.所以可以设d[i][x]:第i层

Codeforces Round #540 Tanya and Candies 预处理

http://codeforces.com/contest/1118/problem/B 题目大意,给你一个序列,删去一个数值之后,要求剩下序列奇数和偶数的和相同,问有多少种删法. 思路:预处理奇数和偶数和即可 (算法能力康复性训练中......) //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> #pragma comment(linker,"/STACK:102400000,102400000&q

Codeforces 578B Or Game (前缀和 + 贪心)

Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] 题目链接:B. "Or" Game You are given \(n\) numbers \(a_1,?a_2,?...,?a_n\). You can perform at most \(k\) operations. For each operation you can multiply one of the numbers by \(x\). We want to make

Codeforces Round #400 C 前缀和,思维

ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) C. Molly's Chemicals 题意:n个数,问有多少个区间的和是k的次方数,即sum([l, r])=k^x, x>=0. abs(k)<=10. tags:一开始O(n^2)统计,果然炸了.. 这题要在统计到第 i 个数时,看s[i]-k^x是否在前面出现过.因为k指数增长很快,这样就是O(n). // #400 #include<b

codeforces 691F Couple Cover(暴力预处理)

题意: 给你一个长度为n的序列,m个询问,每次学问一个数 让你回答序列中乘积不小于它的数对有多少对 思路: 预处理当前序列中不大于当前值的数对有多少,然后用总数减去他的前一个就是答案了 /* *********************************************** Author :devil ************************************************ */ #include <cstdio> #include <cstring&

hdu 5084 前缀和预处理

http://acm.hdu.edu.cn/showproblem.php?pid=5084 给出矩阵M,求M*M矩阵的r行c列的数,每个查询跟前一个查询的结果有关. 观察该矩阵得知,令ans = M*M,则 ans[x][y] = (n-1-x行的每个值)*(n-1+y列的每个值),即: ans[x][y] = t[y] * t[2*n - 2 - x] +....+ t[y + n - 1]*t[n - 1 - x] 每一对的和为定值2*n-2-x-y,然后就是求每对i+j的前缀和(所有i+

Codeforces 147B Smile House(DP预处理 + 倍增)

题目链接  Smile House 题意  给定一个$n$个点的有向图,求一个点数最少的环,使得边权之和$>0$,这里的环可以重复经过点和边.   满足  $n <= 300$ 首先答案肯定是单调的,但是观察发现只有当我们给所有的点加一个自环的时候才满足这个性质. 考虑$DP$.设$f[i][j][k]$为长度为$i$,从$j$走到$k$能经过的最大边权和. 那么$f[i][j][k] = min(f[i-1][j][l] + g[l][k])$,这样的预处理是$O(n^{4})$的,$TLE

CF F. Shovels Shop(前缀和预处理+贪心+dp)

F. Shovels Shop time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output There are nn shovels in the nearby shop. The ii -th shovel costs aiai bourles. Misha has to buy exactly kk shovels. Each sho

Codeforces Round447 D树上前缀和

已知完全二叉树和每条边的权值,q次询问,每次给出sta起点和H. w=(H-点到sta的权值),求w>0的所有w的加和. 这题用树上前缀和来写,e[i]记录子树上的点到点i的距离,sum[i][j]为e[i]的前缀和 这样每次找到满足大于h-len[i]的长度就行(二分查找) void init(){ for(ll x=n;x>=1;x--){ e[x].push_back(0); ll lc=x<<1;ll rc=x<<1|1; if(lc<=n){ for(i