Codeforces Round #374 (Div. 2) D. Maxim and Array

题解:

模拟题

虽然是个大模拟题,但是很考验思维的活跃度。

刚开始做的时候知道怎么做。但是自己的想法情况很多。分类枚举总是把自己混淆

这题教会我的是,要仔细思考分类的方式

这个题。根据枚举负数的个数奇偶来判断

为奇数:那么绝对值最小的数,如果是正,+x,是负,-x;

为偶数:那么使得绝对值最小的数。改变符号,如果正-x,负+x.

代码:

#include<bits/stdc++.h>
#define maxn 200010
#define mod 1000000007
#define ll long long
#define pb push_back
#define fs first
#define se second
using namespace std;
const int INF=1e9+7;

ll a[maxn];
pair<ll,int> p[maxn];

priority_queue<pair<ll,int>, vector<pair<ll,int> >, greater<pair<ll,int> > > q;

int ok=1;

int main()
{
    int n,k,x;
    scanf("%d%d%d",&n,&k,&x);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        if(a[i]<0) ok^=1;
        p[i].se=i;
        p[i].fs=abs(a[i]);
        q.push(p[i]);
    }
    while(k)
    {
        pair<ll,int> now=q.top();
        q.pop();
        if(ok)
        {
            if(a[now.se]>=0)
            {
                a[now.se]-=x;
                if(a[now.se]<0) ok^=1;
            }
            else
            {
                a[now.se]+=x;
                if(a[now.se]>=0) ok^=1;
            }
            now.fs=abs(a[now.se]);
            q.push(now);
        }
        else
        {
            if(a[now.se]>=0) a[now.se]+=x;
            else             a[now.se]-=x;
            now.fs=abs(a[now.se]);
            q.push(now);
        }
        k--;
    }
    for(int i=1;i<=n;i++) printf("%lld ",a[i]);
}
时间: 2024-11-05 03:29:36

Codeforces Round #374 (Div. 2) D. Maxim and Array的相关文章

Codeforces Round #258 (Div. 2) B. Sort the Array(简单题)

题目链接:http://codeforces.com/contest/451/problem/B ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943/ma

Codeforces Round #374 (Div. 2)解题报告

Problem B: Passwords 题意:给出n个字符串密码,在给出一个正确密码,输密码必须先输入简单的密码,连续输错k次密码会罚时5秒,输一次密码耗时1秒,求可能的最短和最长的耗时.(注意:给出的n个密码可能包含多个正确密码) 思路:略 code: #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <c

Codeforces Round #374 (div.2)遗憾题合集

C.Journey 读错题目了...不是无向图,结果建错图了(喵第4样例是变成无向就会有环的那种图) 并且这题因为要求路径点尽可能多 其实可以规约为限定路径长的拓扑排序,不一定要用最短路做 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm>

Codeforces Round #374(div 2)

A B:0.0 C:题意:n个点m条边的DAG图(n,m<=5000),保证没有环且都连通,每个边有边权,求一条1->n的路径,使得经过的点最多,但边权和<=T(T<=10^9) 分析:DAG图一般都能DP解决  f[i][j]表示到了第i个点,已经经过了j个点花费的最少边权,last[i][j]就记录对应的决策  阶段的分割就按照拓扑来,不过要注意刚开始不能只把1放进去,要把1和所有入度为0的点都放进去 最后扫一遍答案 值得一说的是按照题目给的边权范围,f数组是应该开long l

Codeforces Round #374 (Div. 2) C. Journey

题解: dfs+dp dp[i][j]表示经过i个点后到达j点的最小花费 在dfs每个点的过程中加个for循环i 注意用 long long MLE 代码: #include<bits/stdc++.h> #define maxn 5010 #define mod 1000000007 #define ll long long #define pb push_back using namespace std; const int INF=1e9+7; struct Edge { int v,n

【Codeforces】Codeforces Round #374 (Div. 2) -- C. Journey (DP)

C. Journey time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard output Recently Irina arrived to one of the most famous cities of Berland — the Berlatov city. There are n showplaces in the city, numbered

Codeforces Round #374 (Div. 2)-C. Journey DP

C. Journey 题意: 在一个DAG(有向无环图)中,问从1 到 n 点,在时间限制K下,最多能游玩几个地点,把游玩的顺序顺便输出. 思路: 感觉dp,一维不够就加一维,我一开始有想到dp,但是只是一维的去推,推着感觉不正确.这次用dp[i][j],表示到j点已游玩i个地点的最少时间. DAG中一般要想到求拓扑序.即保证dp从左到右. 这题这个人直接两重循环求dp,不知道为啥也是对的 ,确实是有道理,因为dp[ i - 1]这一行的所有情况对于 i 行都是确定的,且i行一定是在i-1行存在

Codeforces Round #510 (Div. 2) D. Petya and Array (权值线段树)

题目地址:http://codeforces.com/contest/1042/problem/D 题意:给你n个数,问有多少个区间的和的值小于t 分析:区间和问题,常常用到前缀和来进行预处理,所以先预处理出前缀和数组sum sum[i]代表前i个数的和,那么sum[i]的贡献就是,  当i<k<=n时,存在多少个k,使sum[k]<t+sum[i] 也就是求在[i+1,n]中,小于t+sum[i]的数有多少. 所以我们可以类比于询问一个数是区间第几大的方法,使用权值线段树来解决,这里因

Codeforces Round #569 (Div. 2) B. Nick and Array

原文链接:https://codeforces.com/contest/1180/problem/B 题意:给你n个数,你要进行一次或者多次操作(操作的方式a[i]=-a[i]-1),让它们的乘积最大,当然也可以不进行操作,答案有多组.思路:根据(操作的方式a[i]=-a[i]-1),我们发现,正数进行操作后,绝对值变大了,那么想让全部数乘积最大,就让这组数全变成负数(是不是好奇,如果存在0的问题,0进行操作可以变为(-1)),然后判断个数n的奇偶,偶数就直接输出,奇数的话把最小(除去-1)的变