首页 > 其他分享 >炼石计划 NOIP 模拟赛 #20

炼石计划 NOIP 模拟赛 #20

时间:2024-11-16 12:40:11浏览次数:1  
标签:ck insert 20 炼石 NOIP int mid times dis

A.

\(kx + (\sum_{i=1}^{k} a_i - 1) \times y = k(x - y) + y \times \sum_{i=1}^{k} a_i\)

\((a_1 - 1) * 1 + (a_2 - 1) * (a_1 - 1) * 1 + (a_3 - 1) * (a_2 - 1) * (a_1 - 1) * 1\)

$ \prod_{i=1}^{k} a_i > N$

两数和相等时乘积最大,因此 \(a\) 数组中任意两个数的差的绝对值小于等于1(一定是形如 \(p, p + 1\))。

设有 \(t\) 个 \(p\)。

\(p^t \times (p + 1) ^ {k-t} > N\)

\(k(x - y) + y \times (t \times p + (k - t) \times (p + 1)) = k(x-y) + y \times (k \times p + k - t)\)

变成了满足一式的情况下要求二式最小。

枚举 \(k\) 是 \(\log N\),可以再枚举一个 \(t\),再对 \(p\) 二分。

时间复杂度 \(\log ^4 N\)。

代码
#include<bits/stdc++.h>
#define int __int128
using namespace std;

const int N = 1e6 + 7;
const int M = 61;
const int inf = 1e20;
void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
signed main() {
    freopen("dice.in", "r", stdin);
    freopen("dice.out", "w", stdout);
    int N, x, y;
    N = read(), x = read(), y = read();
    int ans = inf;
    for(int k = 1; k <= M; k ++) {
        int l = 0, r = inf;
        for(int t = 1; t <= k; t ++) {
            int l = 0, r = inf;
            int res;
            while(l <= r) {
                int mid = l + r >> 1;
                int flag;
                int now = 1;
                int ck = 1;
                for(int i = 1; i <= t; i ++) {
                    now = now * mid;
                    if(now > N) {
                        ck = 0;
                        break;
                    }
                }
                if(!ck) flag = 1;
                if(ck) {
                    for(int i = 1; i <= k - t; i ++) {
                        now = now * (mid + 1);
                        if(now > N) {
                            ck = 0;
                            break;
                        }
                    }
                }
                
                if(!ck) flag = 1;

                if(ck && now > N) flag = 1;
                else if(ck) flag = 0;
                if(flag) {
                    res = mid;
                    r = mid - 1;
                }
                else l = mid + 1;
            }
            // cout << k * (x - y) + y * (k * res + k - t) << endl;
            ans = min(ans, (k * (x - y) + y * (k * res + k - t)));
        }
    }
    write(ans);
}

B.

好题。

设 \(L_i (j)\) 表示序列中等于 \(i\) 的第 \(j\) 个出现的位置。我们要找最小的 \(k\),使得 \(L_k(j) - L_k(j-1) > x\),记 \(f_i\) 表示 \(L_i(j) - L_i(j-1)\) 的最大值, \(G(i)\) 表示 \(\max_{j=1}^{i}f(j)\),要求的就是最小的 \(k\) 使得 \(G(k) > x\)。

对于交换 \(a_p, a_{p+1}\),找到 \(x, y\) 满足 \(L_{a[p]}(x) = p, L_{a_[p+1]}(y) = p + 1\), \(L_{a[p]}[x] ++,L_{a[p + 1]}[y] --\)。然后用线段树维护 \(G\),每次查询二分即可,时间复杂度 \(O(q\log^2n)\)

代码
#include<bits/stdc++.h>
using namespace std;

const int N = 5e5 + 10;

int a[N];

struct tree {
    int l, r;
    int mxx;
}T[N << 2];

void build(int l, int r, int rt = 1) {
    T[rt].l = l, T[rt].r = r;
    if(l == r) {
        return;
    }
    int mid = l + r >> 1;
    build(l, mid, rt << 1);
    build(mid + 1, r, rt << 1 | 1);
    T[rt].mxx = max(T[rt << 1].mxx, T[rt << 1 | 1].mxx);
}
void modify(int pos, int x, int rt = 1) {
    if(T[rt].l == T[rt].r) {
        T[rt].mxx = x;
        return;
    }
    int mid = T[rt].l + T[rt].r >> 1;
    if(pos <= mid) modify(pos, x, rt << 1);
    else modify(pos, x, rt << 1 | 1);
    T[rt].mxx = max(T[rt << 1].mxx, T[rt << 1 | 1].mxx);
}
int query(int l, int r, int rt = 1) {
    if(l <= T[rt].l && r >= T[rt].r) {
        return T[rt].mxx;
    }
    int mid = T[rt].l + T[rt].r >> 1;
    int ans = -1;
    if(l <= mid) ans = max(ans, query(l, r, rt<< 1));
    if(r > mid) ans = max(ans, query(l, r, rt << 1 | 1));
    
    return ans;
}
set<int> L[N];
multiset<int> dis[N];


void ins(int x) {
    
    auto it = L[a[x]].lower_bound(x);
    int r = *it, l = *(--it);
    L[a[x]].insert(x);
    dis[a[x]].erase(dis[a[x]].lower_bound(r - l - 1));
    dis[a[x]].insert(r - x - 1);
    dis[a[x]].insert(x - l - 1);
    modify(a[x] + 1, *dis[a[x]].rbegin());
}
void del(int x) {
    L[a[x]].erase(x);
    auto it = L[a[x]].lower_bound(x);
    int r = *it, l = *(--it);
    dis[a[x]].insert(r - l - 1);
    dis[a[x]].erase(dis[a[x]].lower_bound(r - x - 1));
    dis[a[x]].erase(dis[a[x]].lower_bound(x - l - 1));
    modify(a[x] + 1, *dis[a[x]].rbegin());
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    freopen("star.in", "r", stdin);
    freopen("star.out", "w", stdout);
    int n, q;
    cin >> n >> q;
    build(1, n + 1);
    for(int i = 0; i < n; i ++) {
        L[i].insert(0), L[i].insert(n + 1);
        dis[i].insert(n + 1);
        modify(i + 1, n + 1);
    }
    for(int i = 1; i <= n; i ++) {
        cin >> a[i];
        ins(i);
    }
    while(q --) {
        int x, y;
        cin >> x >> y;
        if(x == 1) {
            del(y);
            del(y + 1);
            swap(a[y], a[y + 1]);
            ins(y);
            ins(y + 1);
        }
        else {
            int l = 1, r = n;
            int ans = n + 1;
            while(l <= r) {
                int mid = l + r >> 1;
                if(query(1, mid) >= y) {
                    ans = mid;
                    r = mid - 1;
                }
                else l = mid + 1;
            }
            cout << ans - 1 << endl;
        }
    }
}

标签:ck,insert,20,炼石,NOIP,int,mid,times,dis
From: https://www.cnblogs.com/wyyqwq/p/18549273

相关文章

  • 2024-11-16 特殊矩阵的压缩存储
    一、数组的存储结构1.一维数组:各元素大小相同,且物理上连续存放。a[i]=起始地址+i*siezof(数组元素大小)2.二维数组:b[j][j]=起始地址+(i*N+j)*sizeof(数组元素大小)二、特殊矩阵1.普通矩阵的存储:使用二维数组来存储。2.对称矩阵的压缩存储:若n阶方阵中任意一个元素aij都有ai......
  • 华为OD机试真题-会议接待-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述某组织举行会议,来了多......
  • 【软考】系统架构设计师-2020年下半年下午案例真题及答案
    全国计算机技术与软件专业技术资格(水平)考试高级系统架构设计师2020年下半年下午试卷 案例试题一 某公司拟开发一套在线软件开发系统,支持用户通过浏览器在线进行软件开发活动。该系统的主要功能包括代码编辑、语法高亮显示、代码编译、系统调试、代码仓库管理等。......
  • 快速量产低功耗 4G 定位方案?Air201 模组来搞定!
    今天我们来了解的是Air201模组快速量产低功耗4G定位方案,希望大家有所收获。寻寻觅觅低功耗4G定位方案?一个Air201就够了!——定位准、体积小、功耗低,助力行业客户快速量产!01Air201是什么?16mm32mm4mm迷你尺寸,便于嵌入各类物联网设备:底板厚度:0.6mm;模块厚度:1.7mm;SIM......
  • AT_joisc2012_kangaroo
    \(\mathcal{O}(n^3)\)方法就不再赘述(前\(i\)个,\(j\)条链,\(k\)个不满足)。考虑\(a,b\)分开来排序,从小到大,如果相同先排\(b\)。比如说32、21排成12(b)2(a)3,\(a\)写成),\(b\)写成(,就是(())。那么现在问题变成了:一个袋鼠可以塞进另一个袋鼠就是两个括号严格在前面......
  • [Codeforces Round 987 (Div. 2)](https://codeforces.com/contest/2031)解题报告
    CodeforcesRound987(Div.2)太好了是阳间场,我们有救了感觉脑子生锈了qwq,F题做不出来A分析知如果有\(i<j\)且\(a_i>a_j\)的情况出现则\(i\)和\(j\)一定至少改一个。所以答案即为\(n-cnt\),\(cnt\)为众数个数。B发现一个数离自己原本的位置距离不会超过\(1\),有......
  • [网鼎杯 2018]Fakebook 1
    [网鼎杯2018]Fakebook1打开实例发现为博客列表,有登录跳转和类似注册或者添加博客的join跳转查看源码无果打开登陆页,尝试万能密码没有用,尝试从join入手,用admin去随便join一个显示博客不存在期间尝试多种sql注入方法均没有效果,转去其他方向尝试dirsearch目录爆破,发现了......
  • 【Adobe Premiere pro 2025下载与安装教程】
    1、安装包 「AdobePremierePro2025」:链接:https://pan.quark.cn/s/e93beb96accb提取码:CGY22、安装教程1)       下载软件安装包,打开安装目录,双击Setup.exe安装,弹出安装对话框  2)       选择安装目录,尽量不要选C盘,点击继续  3)       ......
  • 书生·共学大模型训练营第4期 L1G200任务提交
    MindSearch搜索引擎示例书生·浦语对话模型调用示例书生·万象开源视觉语言模型调用实例进阶任务:MindSearch话题挑战https://www.zhihu.com/people/zhang-shu-yang-92-96......
  • 【网络系统管理】2023年全国职业院校技能大赛:组策略--Windows样题1(步骤)--超详细
    (一)DCserver配置任务1.为ChinaSkills.cn域配置安全策略(1)限制Management(Manage01-05)只能从Client登录;(2)限制Finance(F01-10),不能关闭计算机和重启计算机;(3)所有的域计算机和域用户都能自动注册证书,证书颁发机构已经颁发过一次,就不再重复颁发,除非证书文件丢失或者失效;(4)为普通......