首页 > 其他分享 >YC263A [ 20240324 CQYC省选模拟赛 T1 ] 光晕 (halation)

YC263A [ 20240324 CQYC省选模拟赛 T1 ] 光晕 (halation)

时间:2024-03-26 19:36:45浏览次数:40  
标签:le YC263A 省选 sum pos T1 int include define

题意

给定一个数组 \(a\),每次进行以下操作。

  • 选择一个 \(1 \le x \le n\),将 \(a_x := (a_x - 2 ^ {c_x}) \times 2\),然后 \(c_x := c_x + 1\)

如果通过这个操作使得 \(a\) 严格递增,则 \(a\) 是好的。

你希望找到一个长度为 \(n\) 的好的数组,使得 \(\sum a_i\) 最小,且她的字典序最小。

你需要回答 \(\sum a_i\),同时每次询问 \(a_{b_i}\)。

\(n \le 10 ^ 9\)

Sol

这道题看起来非常吓人。

和是好做的。

仔细想想操作,发现一个数 \(x\) 可以操作为 \((x - k) 2 ^ k\)。

注意到我们需要使得 \(x\) 最小,考虑 \((x - k)\) 为偶数的情况。

不难发现当前选择 \((x - k) 2 ^ k\) 还不如选择 \((\frac{(x - k)}{2}) 2 ^ {k + 1}\)。

通过各种方式:如打表、瞪眼、yy,最终答案数组 (设为 \(a\)) 经过若干次操作后满足递增的数组 (设为 \(a'\)) 满足一段 \(\forall 1 \le i \le A, a'_i = i\)。

我们发现这个 \(A\) 就是 \(a'\) 中出现的最大奇数。

这个性质的证明是 trivial 的。

假如当前询问的位置为 \(x\),若 \(x \le A\) 直接输出 \(x\) 按照上述方式得到的最优解即可。

套路地,我们考虑 删去 前面所有的奇数对答案的影响。

删去所有奇数,只会剩下偶数,考虑按照上述方式优化当前所有数字 (也就是所有数除以 \(2\))。

发现这个子问题和原问题几乎一摸一样!

假设我们当前删了 \(y\) 层,得到地答案为 \(x'\),则答案明显为 \(x' \times 2 ^ y\)。

虽然层数为 \(\sqrt n\) 的级别,我们依旧无法通过本题。

可以考虑离线下来将所有询问统一处理,这样就只需要枚举一遍层数即可。

也可以考虑将当前每一层删了多少个奇数,以及当前每层可以确定的最大的右端点预处理出来。

复杂度 \(O(\sqrt n)\)。

Code


#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <vector>
#define int long long
#define pii pair <int, int>
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
    int p = 0, flg = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') flg = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        p = p * 10 + c - '0';
        c = getchar();
    }
    return p * flg;
}
void write(int x) {
    if (x < 0) {
        x = -x;
        putchar('-');
    }
    if (x > 9) {
        write(x / 10);
    }
    putchar(x % 10 + '0');
}
bool _stmer;

const int N = 2e5 + 5;

#define fi first
#define se second

int calc(int i) { return ((i / 2) * 2 + 2) * (i / 2) / 2 + (i & 1) * (i + 1) / 2; }

array <int, N> s, h, p, ans;

bool _edmer;
signed main() {
    cerr << (&_stmer - &_edmer) / 1024.0 / 1024.0 << "MB\n";
#ifndef cxqghzj
    // freopen("halation.in", "r", stdin);
    // freopen("halation.out", "w", stdout);
#endif
    int n = read(), q = read();
    int pos = 0, sum = 0;
    for (int i = 1; !pos && i <= 2e5; i++) {
        sum += (i + 1) / 2 * i;
        if (calc(i) >= n) pos = i;
    }
    sum -= (calc(pos) - n) * pos;
    int m = pos - 1;
    write(sum), puts("");
    int tot = 0, len = n - calc(m);
    for (int i = 1; i <= pos; i++) h[i] = (pos - i) / 2 + 1;
    for (int i = 1; i <= calc(pos) - n; i++) h[i * 2 - (pos & 1)]--;
    for (int i = 1; i <= pos; i++)
        s[i] = tot + h[i] * 2 - 1, tot += h[i];
    for (int i = 1; i <= pos; i++) h[i] += h[i - 1];
    while (q--) {
        int x = read();
        int tp = lower_bound(s.begin() + 1, s.begin() + pos + 1, x) - s.begin() - 1;
        x -= h[tp];
        while (!(x & 1)) tp++, x >>= 1;
        write(x + tp), puts("");
    }
    return 0;
}

标签:le,YC263A,省选,sum,pos,T1,int,include,define
From: https://www.cnblogs.com/cxqghzj/p/18097382

相关文章

  • LeetCodeHot100 数组 53. 最大子数组和 56. 合并区间 238. 除自身以外数组的乘积
    53.最大子数组和https://leetcode.cn/problems/maximum-subarray/description/?envType=study-plan-v2&envId=top-100-likedpublicintmaxSubArray(int[]nums){int[]dp=newint[nums.length];dp[0]=nums[0];for(inti=1;i<nums......
  • 2017 各省省选做题笔记
    AHOI/HNOID1T1单旋不会哦,感觉这题最难。D1T2影魔考虑计算每个位置作为\([l+1,r-1]\)中的最大值时的贡献,一定是有一端取到了左边第一个比自己大的或者右边第一个比自己大的,可以用单调栈求出所有的有效点对,是线性的,然后做一遍二维数点即可。D1T3礼物首先考虑不做修......
  • YC262A [ 20240321 CQYC省选模拟赛 T1 ] 多边形(polygon)
    题意有一个由\(0/1\)组成的字符串\(S\)。给你\(m\)次操作。假如\(S_{u}=1\)且\(S_{v}=0\),则交换\(S_{u},S_{v}\)。假如对于所有的\(S\),使得最终字符串\(S'\)的所有\(1\)相邻。请输出\(1\)的个数为\([1,n]\)的\(S\)的方案数。答案对\(2\)取模。......
  • 联合省选2024游记
    联合省选2024游记因为这是省选后114514三周后,为了庆祝我的笔记本电脑到了而写的,所以有很多东西都记不清了(因为在赶稿,总之先写到这,后面如果想起什么再补day-1下午五点放学,回家!顺便把机房前几天中午吃乡村基时外卖的两个大盒子给薅走了,给家里的两只猫猫\(CQ\)就是好,考省选也......
  • IT15527: IN SPECIFIC TIMING CONDITIONS WITH MULTIPLE DB2READLOG API CALLERS(CDC,
    IT15527:INSPECIFICTIMINGCONDITIONSWITHMULTIPLEDB2READLOGAPICALLERS(CDC,ETC),"NOROOMFORRETRIEVEDLOG"occursindb2diag.loghttps://www.ibm.com/mysupport/s/defect/aCI0z000000TOfW/dt010963?language=en_USDescription 1.  Proble......
  • 省选2024
    省选2024day1先看T1,哇,一个绝对值式子,拆绝对值然后分讨即可,猛猛冲!过了一个小时写出来就赢麻了,猛猛冲!过了一个小时小样例过了,大样例调不出来了,先看看其他题,好,正解不会,暴力好写,继续猛猛冲!过了一个小时猛猛冲!猛猛冲!猛猛冲!最后30分钟冲不动了,去写T2暴力了。写了一会......
  • LeetCodeHot100 栈 155. 最小栈 394. 字符串解码
    155.最小栈https://leetcode.cn/problems/min-stack/description/?envType=study-plan-v2&envId=top-100-likedclassMinStack{Deque<Integer>deque;PriorityQueue<Integer>priorityQueue;publicMinStack(){de......
  • 力扣HOT100 - 49. 字母异位词分组
    解题思路:排序注意:返回时不能用List,因为List是抽象类,return的必须是List的具体实现,如ArrayListclassSolution{publicList<List<String>>groupAnagrams(String[]strs){Map<String,List<String>>map=newHashMap<>();for(Stringstr......
  • 【STM32+HAL库】---- 驱动DHT11温湿度传感器
    硬件开发板:STM32F407VET6软件平台:cubemax+keil+VScode1DHT11工作原理1.1简介DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿......
  • LeetCodeHot100 二分查找 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查
    35.搜索插入位置https://leetcode.cn/problems/search-insert-position/description/?envType=study-plan-v2&envId=top-100-likedpublicintsearchInsert(int[]nums,inttarget){intleft=0;intright=nums.length-1;while(left<......