首页 > 其他分享 >板刷2023.10.04

板刷2023.10.04

时间:2023-10-06 12:57:39浏览次数:38  
标签:04 板刷 sum 2023.10 cin int mp1 alpha ll

CF1878 F.Vasilije Loves Number Theory

image-20231006121613935

题解:约数个数 + 取模性质

  • 对\(n\)质因子分解得到,\(n =p_1^{\alpha_1}p_2^{\alpha_2}...p_k^{\alpha_k}\)
  • 那么显然\(d(n) = (\alpha_1 + 1)\times (\alpha_2 + 1) ... (\alpha_k + 1)\)
  • 根据题意可以得到:\(n \% d(n) = 0\)的时候一定存在一个正整数\(a\)使得题目要求成立
  • 那么现在的问题在于怎么判断\(n \% d(n) = 0\),因为\(n\)可能很大,所以我们不妨利用取模的性质:$a \times b % p = a % p \times b % p $
  • 所以我们只需要用\(map\)记录\(n\)中质因子及其幂次,然后快速幂即可得到\(n\)对\(d(n)\)取模后的值
int n, q;
map<int, int> mp, mp1;

ll qpow(ll a, ll b, ll p)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
            res = (__int128)res * a % p;
        a = (__int128)a * a % p;
        b >>= 1;
    }
    return res;
}
void solve()
{
    cin >> n >> q;
    mp.clear(), mp1.clear();
    for (int i = 2; i <= n / i; ++i)
    {
        while (n % i == 0)
        {
            mp[i]++;
            n /= i;
        }
    }
    if (n > 1)
        mp[n]++;
    mp1 = mp;
    while (q--)
    {
        int op, x;
        cin >> op;
        if (op == 1)
        {
            cin >> x;
            for (int i = 2; i <= x / i; ++i)
            {
                while (x % i == 0)
                {
                    mp1[i]++;
                    x /= i;
                }
            }
            if (x > 1)
                mp1[x]++;
            int sum = 1;
            for (auto [a, b] : mp1)
                sum *= (b + 1);
            int r = 1;
            for (auto [a, b] : mp1)
                r = r * qpow(a, b, sum) % sum;
            if (r % sum == 0)
                cout << "YES" << endl;
            else
                cout << "NO" << endl;
        }
        else
            mp1 = mp;
    }
    cout << endl;
}

CF1851 G. Vlad and the Mountains

image-20231006122635599

题解:离线 + 并查集

  • 我们观察性质:如果我们从\(i\)移动到\(j\),代价为\(h[j] - h[i]\),然后我们再从\(j\)移动到\(k\),代价为\(h[k] - h[j]\),所以易得从\(i\)移动到\(k\),代价为\(h[k] - h[i]\)
  • 所以,容易证明从任意一个点\(i\)移动到任意另一个点\(j\),代价为\(h[j] - h[i]\)
  • 那么题目就转化为:从\(a\)点移动到\(b\)点,且经过的点的点权必须\(\leq h_a + e\)
  • 这是一个经典的问题
  • 显然我们可以将询问离线后进行排序,然后利用并查集判断即可
int n, m, q, fa[N], a[N];
array<int, 2> h[N];
vector<int> g[N];

int find(int x)
{
    return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y)
{
    int fx = find(x), fy = find(y);
    if (fx != fy)
        fa[fx] = fy;
}

void solve()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        fa[i] = i, g[i].clear();
    for (int i = 1; i <= n; ++i)
    {
        cin >> h[i][0];
        h[i][1] = i;
        a[i] = h[i][0];
    }
    for (int i = 1; i <= m; ++i)
    {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    cin >> q;
    vector<array<int, 4>> qry;
    for (int i = 1; i <= q; ++i)
    {
        int u, v, e;
        cin >> u >> v >> e;
        qry.push_back({h[u][0] + e, u, v, i});
    }
    sort(h + 1, h + n + 1);
    queue<array<int, 2>> que;
    for (int i = 1; i <= n; ++i)
        que.push(h[i]);
    sort(all(qry));
    vector<int> ans(q + 10);
    for (auto [x, u, v, qid] : qry)
    {
        // cout << x << " " << u << " " << v << " " << qid << endl;
        while (que.size() && que.front()[0] <= x)
        {
            int u = que.front()[1];
            que.pop();
            for (auto v : g[u])
            {
                if (a[v] <= x)
                    merge(u, v);
            }
        }
        if (find(u) == find(v))
            ans[qid] = 1;
        else
            ans[qid] = 0;
    }
    for (int i = 1; i <= q; ++i)
    {
        if (ans[i])
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    cout << endl;
}

CF1841 D. Pairs of Segments

image-20231006123428481

\(2 \leq n \leq 2000\)

题解:最大不相交区间数

  • 显然我们可以\(O(n^2)\)将所有的相交的线段合并成一个线段
  • 然后就是一个经典的问题:在一些区间中,求最大不相交区间个数
  • 显然按照右端点排序后遍历一遍即可
int n;
array<int, 2> seg1[N], seg[M];

void solve()
{
    cin >> n;
    for (int i = 1; i <= n; ++i)
    {
        int l, r;
        cin >> l >> r;
        seg1[i] = {l, r};
    }
    int idx = 0;
    for (int i = 1; i <= n; ++i)
        for (int j = i + 1; j <= n; ++j)
        {
            auto [l1, r1] = seg1[i];
            auto [l2, r2] = seg1[j];
            if (r2 >= l1 && l2 <= r1)
                seg[++idx] = {max(r1, r2), min(l1, l2)};
        }
    sort(seg + 1, seg + idx + 1);
    int now = 0, sum = 0;
    for (int i = 1; i <= idx; ++i)
    {
        auto [r, l] = seg[i];
        if (i == 1)
            now = r, sum++;
        else if (l > now)
            now = r, sum++;
    }
    cout << n - 2 * sum << endl;
}

标签:04,板刷,sum,2023.10,cin,int,mp1,alpha,ll
From: https://www.cnblogs.com/Zeoy-kkk/p/17744447.html

相关文章

  • 2023.10.5
    A记\(\displaystylef(i)=\oplus_{d|i}d\),求\(\displaystyle\oplus_{i=1}^{n}f(i)\).\(n\le10^{14}\).考虑一个数是否出现计数次,对\(\lfloor\frac{n}{x}\rfloor\)整除分块,查询区间异或和即可。点击查看代码#include<bits/stdc++.h>#definelllonglongusingnames......
  • 2023.10.5——每日总结
    学习所花时间(包括上课):0h代码量(行):0行博客量(篇):1篇今天,上午学习+休息,下午学习+休息;我了解到的知识点:1.Maven;2.SpringBoot;明日计划:学习+休息......
  • 04_猫狗队列
    猫狗队列【题目】宠物、狗和猫的类如下:publicclassPet{ privateStringtype;publicPet(Stringtype){this.type=type;}publicStringgetPetType(){returnthis.type;}}publicclassDogextendsPet{publ......
  • 20231004
    23/10/04NOIP模拟赛总结时间安排7:40-8:00看题,感觉都没有思路,有点慌。8:20-9:00思考T1,先把暴力打了,打表找规律找了20分钟。9:00-9:30写T2暴力,感觉前两题都是DP,但不会设状态,原因在反思总结中有提到。9:30-10:20想到了T3的\(n^2\)做法,但是没想明白细节,弃疗。10:20-11:0......
  • 231004校内赛
    T1水管题解很简单的一道题,别想复杂了只要一边\(dfs\)即可先将当前点的所有水量给出去,如果缺水就给出去负数那么等到最后一个节点如果不是刚好合适,那么就把剩余水量回溯回来,无论正负再如此给下一个连边的点如果最后一个点刚好合适那么给下一个点的就是\(0\)实现很简单......
  • GJOI 2023.10.5 T2 假期计划Ⅱ
    GJOI2023.10.5T2假期计划Ⅱ题意:给出一个有\(n\)个点的有向图,每点到另一点都有一条有向边,边有权值。现有\(n^2\)次操作,每次会删去一些边,问每次删去后从\(1\)号点到\(n\)号点经过恰好\(k\)条边的最短路,若无法到达输出\(-1\)。\(n\le300,k\le8\)输入:34104......
  • 2023.9-2023.10 做题记录
    好菜啊,被爆杀了/kk1.CF1572ABook模拟赛上看错题了!#$%!#&%^&#*2.CF348DTurtles类似Catalan数的推导3.CF1271DPortals贪心题。4.CF1545BAquaMoonandChess数数题。注意两个连续的1的移动即可。5.AT_agc007_b[AGC007B]ConstructSequences简单题。注意值......
  • Ubuntu 20.04 搭建 Timemachine
    创建一个目录,作为TimeMachine保存数据的目录。$sudomkdir/usr/local/timemachine$sudochownnobody:nogroup/usr/local/timemachine$sudochmod777/usr/local/timemachine安装netatalk服务和avahi-daemon服务。$sudoaptinstallnetatalkavahi-daemon编辑net......
  • 04-05 8.30下 子网划分
    网速100M  位/s(秒) 12.5M  字节/s(秒)1000M 位/s(秒) 125M  字节/s(秒)存储单位1字节 byte=8位bit  8倍2G大片,100M网速,下载需要2.73分钟 2048/12.5/60=2.73min1KB  =1024字节1MB  =1024KB1GB  =1024MB1TB  =1024GB1PB  =1024T......
  • 2023_10_04
    做笔记方法/学习方法有文档的不要记,除非有不懂的地方,可以做批注。或者按功能记。记环境配置、实际遇到的问题及解决方案、常用的功能组合方案但是记得,学习文档时,理解了,必须敲一遍代码,虽然不记笔记,但要实践pinia持久化插件pinia-plugin-persistedstate代码规范校验与格式化插......