首页 > 其他分享 >GYM 104128 G

GYM 104128 G

时间:2023-09-15 15:01:20浏览次数:483  
标签:PII cnt int GYM pos now over 104128

G. Inscryption

根据题意,需要把输入的\(0\)全部转换为\(1\)或\(-1\),使得\(p\over q\)最大。

当\(a[i]=1\)时,\({p \over q}={p'+1 \over q'+1}\)

当\(a[i]=-1\)时,\({p \over q}={p' \over q'-1}\)

通过计算,可知当\(q>2*p+1\)时,\(a[i]=1\)时的收益大于\(a[i]=-1\)时的收益,所以在本题中,将\(0\)转换为\(-1\)的收益一定大于转换为\(1\)的收益。

一开始没有想到局部中的-1数量可能过大,使用当前的\(q\)值减去后缀和的方法判断可行性,会Wa3。

正确做法是直接遍历并贪心,先把全部\(0\)计算为\(-1\),并记录转换的次数\(cnt\),当出现q==0的情况时。把前面转换为-1的其中一个\(0\)变成\(1\),即把\(cnt-1\),再把当前的\(q+2\),\(p+1\),\(cnt=0\),那么就无法计算,输出\(-1\)。

代码

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;

const int N = 1e6 + 10;
int t;
int n;
int a[N];

struct node
{
    int pos, val;
    PII now;

    node(int _pos, int _val, PII _now) : pos(_pos), val(_val), now(_now) {}
};

signed main()
{
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> t;
    while (t--)
    {
        cin >> n;
        vector<int> turn;
        bool judge = 0;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
        }
        PII now = {1, 1};
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            if (a[i] == 1)
            {
                now.first++;
                now.second++;
            }
            else if (a[i] == -1)
            {
                now.second--;
            }
            else
            {
                now.second--;
                cnt++;
            }
            if (now.second == 0)
            {
                if (cnt)
                {
                    cnt--;
                    now.second += 2;
                    now.first++;
                }
                else
                {
                    judge = 1;
                    break;
                }
            }
        }

        if (judge)
        {
            cout << "-1" << endl;
        }
        else
        {
            int tmp = gcd(now.first, now.second);
            now.first /= tmp;
            now.second /= tmp;
            cout << now.first << " " << now.second << endl;
        }
    }

    return 0;
}

标签:PII,cnt,int,GYM,pos,now,over,104128
From: https://www.cnblogs.com/tongluosao/p/17705020.html

相关文章

  • gym104531 I Bracket
    题意题面做法结论:对于字符串\(s\),其为合法括号序列的充要条件为(1)\(|s|\)为偶数,(2)构造序列\(a_i\),若\(s_i\)='('or'?',则\(a_i=+1\);若\(s_i\)=')',则\(a_i=-1\),\({a_i}\)的前缀和均\(\ge0\)(3)构造序列\(b_i\),若\(s_i=\)')'or'?'......
  • 题解 Gym 104531D【Coffee】
    2022SYSUSchoolContest题目不想翻译了,自己看能看懂。problamThegirlsofHTTlikedrinkingtea.Butoneday,theywantedachangeanddecidedtotrycoffeeinthenext\(n\)days.NowMugi,whoalwaysprovidesfoodanddrinksforHTT,willgototheshopto......
  • 2022 Hubei Provincial Collegiate Programming Contest G. Brick(gym103729)
    大意给出底层高度,用1*2的砖块将总形状铺成等高矩形,使得高度最小(不能放在外面)题解奇妙做法当高度同奇偶时显然x可以的话x+2也可以,直接加一层竖的,所以首先分奇偶二分高度有解的必要条件1是,把矩形黑白方格染色之后未填的黑=白(一个1*2刚好覆盖1黑1白)然后从左往右放砖块,可以感受......
  • GYM 104128 M
    M.DraintheWaterTank这道题需要用到向量间的叉积运算。首先输入所有点,储存在数组\(a\)中,并将其全部转化为向量,储存在数组\(b\)中。为了排尽水箱里的所有水,需要找到每一个属于水箱内容物局部最低块中的一个点。所以可以将判断分为两步判断是否为局部最低点:当\(b[i].y<0......
  • Gym102994M Travel Dream
    题意:\(n\)个点的图,找一个有\(k\)个点的的简单环,使其边权和最大。随机黑白染色,拆成两条颜色不同的不相交链,做\(300\)次即可。链的情况是好做的,做完后,预处理\(f_{x,y}\)表示\(x\)到\(y\)的最大距离,枚举两条端点颜色不同的边可以直接合并。链点数\(\leq4\)都是可以直......
  • 安装强化学习包gym报错问题及解决方法
    安装命令pipinstallgymnasium[all]如遇如下报错error:command'swig.exe'failed:Nosuchfileordirectory[endofoutput]note:Thiserrororiginatesfromasubprocess,andislikelynotaproblemwithpip.ERROR:Failedbuildingwheelfo......
  • Gym102354I From Modular to Rational
    问两个相乘不会炸\(\rmlong\long\)的质数,用CRT合并,得到\(\frac{p}{q}\equivr\\pmodM\)。其中\(M\)是大于\(10^{18}\)的数。由于这个\(M\)太大了,不存在\(\frac{p}{q}\equiv\frac{a}{b}\pmodM\)且\(p,q,a,b\leq10^9\),所以我们只需找到一个\(\frac{p}{......
  • CFgym103260K-Rectangle Painting
    前言断续地调了一天一夜,终于做出来了!题目链接-RectanglePainting大概就是:给\(n\)个集合\(S_i\),两种操作,1{[l,r],x}lr向\(S_l\)到\(S_r\)插入\(x\)2lr询问\(\max\limits_{i=l}^r\{\text{mex}(S_i)\}\)。但是强制在线!\(1\len,l,r\le2\times10^5,1\le......
  • Gym103687D The Profiteer:回滚莫队信息双指针可以做到线性对数
    标题写得好所谓的回滚莫队信息意思是,设信息保存在两个大小分别为\(a,b\)的结构上,将这两个信息进行合并得到大小为\(a+b\)的信息需要的时间为\(\Omega(\min\{a,b\}\cdotf(n))\);而给定一个大小为\(1\)的信息,可以在\(\mathrmO(f(n))\)时间内将它加入到任何一个结构中......
  • Gym-103438C Werewolves
    Gym-103438CWerewolves题面有\(n(1\len\le3000)\)个节点的树,每个节点的颜色为\(c_i\)。请计算这个树存在多少不同的连通子图,满足这个连通子图中,存在某种颜色,其出现次数严格大于连通子图中节点数量的一半。简化题意first对于任意一个联通子图,如果该联通子图对答......