首页 > 其他分享 >Codeforces Round 993 (Div. 4)(补题)

Codeforces Round 993 (Div. 4)(补题)

时间:2024-12-23 15:19:19浏览次数:3  
标签:10 int Codeforces 整数 leq 补题 ans using Div

Codeforces Round 993 (Div. 4)

只选择对我有价值的题目记录

E. Insane Problem

题目描述

给定五个整数 \(k\),\(l_1\),\(r_1\),\(l_2\) 和 \(r_2\),Wave 希望你帮助她计算满足以下所有条件的有序对 \((x, y)\) 的数量:

  1. \(l_1 \leq x \leq r_1\)。
  2. \(l_2 \leq y \leq r_2\)。
  3. 存在一个非负整数 \(n\),使得 \(\frac{y}{x} = k^n\)。

输入

  1. 第一行包含一个整数 \(t\)(\(1 \leq t \leq 10^4\)),这里的 \(t\) 表示测试用例的数量。
  2. 对于每个测试用例,其唯一的一行包含五个整数 \(k\),\(l_1\),\(r_1\),\(l_2\) 和 \(r_2\)(\(2 \leq k \leq 10^9\),\(1 \leq l_1 \leq r_1 \leq 10^9\),\(1 \leq l_2 \leq r_2 \leq 10^9\))。

输出

对于每个测试用例,在新的一行输出匹配的有序对 \((x, y)\) 的数量。

示例

Input(输入) Output(输出)
5
2 2 6 2 12
2 1 1000000000 1 1000000000
3 5 7 15 63
1000000000 1 5 6 1000000000
15 17 78 2596 20914861
12
1999999987
6
1
197

注意事项

  • 在第三个测试用例中,匹配的有序对如下:
    • \((5, 15)\)
    • \((5, 45)\)
    • \((6, 18)\)
    • \((6, 54)\)
    • \((7, 21)\)
    • \((7, 63)\)
  • 在第四个测试用例中,唯一有效的有序对是 \((1, 1000000000)\)。

思路:

枚举加计数问题,通常只需要枚举其中一个,然后另一个是可以通过计算得到的。由于xy的范围告诉我们了,所以\(k^n\)的范围我们也能知晓,上界为\(r=r_2 / l_1\)下取整,下界为\(l = (l_2 + r_1 - 1) / r_1\)向上取整。现在我们只需要调整一下方程为\(\frac{y}{k^n} = x\),每枚举一个可行的\(k^n\)后,我们用y的最小值和最大值即可求出在这个可行的\(k^n\)下x的范围,通过计算即可得到个数。至于为啥要将方程调整成除法形式而不是更好计算的形式,自己思考一下就能明白,用乘法的话得到的y值不是一个接一个的,中间有很多空隙,导致不能直接通过计算得到个数,用除法可以解决这样的问题。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

void solve(){
    int k,l1,r1,l2,r2;
    cin>>k>>l1>>r1>>l2>>r2;
    int l = (l2+r1-1)/r1;//下界
    int r = r2/l1; //上界
    int base = 1;
    int ans = 0;
    // cout<<l<<" "<<r<<endl;
    while(base<l) base*=k; //先找到范围内最小的k^n
    while(base<=r){
        int ll = (l2+base-1) / base;
        int rr = r2 / base;
        ll = max(l1,ll);
        rr = min(r1,rr);
        if(ll<=rr) ans += rr-ll+1;
        base*=k;
    }
    cout<<ans<<endl;
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

评述

这道题比较有参考价值,自己太笨了,第一时间竟然无从下手

----------------------------------------

F. Easy Demon Problem

题目描述

对于任意网格,Robot 将其美感定义为网格中元素的总和。

Robot 给出了一个长度为 \(n\) 的数组 \(a\) 和一个长度为 \(m\) 的数组 \(b\) 。你构造了一个 \(n\) 乘 \(m\) 的网格 \(M\) ,使得所有 \(1 \leq i \leq n\) 和 \(1 \leq j \leq m\) 都是 \(M_{i,j}=a_i\cdot b_j\) 。

然后,Robot 会给出 \(q\) 个查询,每个查询都包含一个整数 \(x\) 。对于每个查询,请判断是否可以***精确地执行一次下面的操作,从而使 \(M\) 具有 \(x\) 的美感:

  1. 选择整数 \(r\) 和 \(c\) ,使得 \(1 \leq r \leq n\) 和 \(1 \leq c \leq m\) 都是整数。
  2. 设 \(M_{i,j}\) 为 \(0\) ,所有有序对 \((i,j)\) 都是 \(i=r\) , \(j=c\) ,或都是 \(i=r\) 。

请注意,查询是不持久的,也就是说,在查询过程中,您不会将任何元素设置为 \(0\) --您只需要输出是否可以找到 \(r\) 和 \(c\) ,如果执行了上述操作,网格的美观度将为 \(x\) 。此外,请注意,即使原始网格的美观度已经是 \(x\) ,您也必须对每个查询执行上述操作。

输入

第一行包含三个整数 \(n\) 、 \(m\) 和 \(q\) ( \(1 \leq n,m \leq 2\cdot 10^5, 1 \leq q \leq 5\cdot 10^4\) )--分别是 \(a\) 的长度、 \(b\) 的长度和查询次数。

第二行包含 \(n\) 个整数 \(a_1, a_2, \ldots, a_n\) ( \(0 \leq |a_i| \leq n\) )。

第三行包含 \(m\) 个整数 \(b_1, b_2, \ldots, b_m\) ( \(0 \leq |b_i| \leq m\) )。

下面的 \(q\) 行中各包含一个整数 \(x\) ( \(1 \leq |x| \leq 2\cdot 10^5\) ),即通过将一行和一列中的所有元素都设置为 \(0\) 所获得的网格美感。

输出

对于每个测试用例,如果有办法执行上述操作,从而使美景为 \(x\) ,则输出 "YES"(不带引号),否则输出 "NO"(不带引号)。

您可以在任何情况下输出 "YES "和 "NO"(例如,字符串 "yES"、"yes "和 "Yes "将被视为肯定回答)。

样例1

3 3 6
-2 3 -3
-2 2 -1
-1
1
-2
2
-3
3

输出

NO
YES
NO
NO
YES
NO

思路

在这里插入图片描述

评述

一道不错的题就是题目有点难读,其中提前预处理出所有情况再来处理询问的方式可以很有效的降低时间复杂度,也是这种题的经典做法。

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3fLL

const int N = 2e5 + 5;

bool visA[2 * N + 5];
bool visB[2 * N + 5];

bool ans[2 * N + 5];
void solve()
{
    int n, m, q;
    cin >> n >> m >> q;
    std::vector<ll> a(n);
    ll sumA = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        sumA += a[i];
    }
    std::vector<ll> b(m);
    ll sumB = 0;
    for (int i = 0; i < m; i++)
    {
        cin >> b[i];
        sumB += b[i];
    }
    for (int i = 0; i < n; i++)
    {
        ll d = sumA - a[i];
        if (abs(d) < N)
            visA[d + N] = 1;
    }
    for (int i = 0; i < m; i++)
    {
        ll d = sumB - b[i];
        if (abs(d) < N)
            visB[d + N] = 1;
    }
    for (int i = 1; i < N; i++)
    {
        for (int j = 1; j * i < N; j++)
        {
            ans[N + i * j] |= visA[N + i] && visB[N + j];
            ans[N + i * j] |= visA[N - i] && visB[N - j];
            ans[N - i * j] |= visA[N + i] && visB[N - j];
            ans[N - i * j] |= visA[N - i] && visB[N + j];
        }
    }
    while (q--)
    {
        int x;
        cin >> x;
        x += N;
        if (ans[x])
            cout << "YES\n";
        else
            cout << "NO\n";
    }
}

int main()
{
    ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
    // freopen("test.in", "r", stdin);
    // freopen("test.out", "w", stdout);
    int _ = 1;
    // std::cin >> _;
    while (_--)
    {
        solve();
    }
    return 0;
}

标签:10,int,Codeforces,整数,leq,补题,ans,using,Div
From: https://www.cnblogs.com/califeee/p/18624120

相关文章

  • CF补题 993-Div.4
    CF补题993-Div.4-20241221Dashboard-CodeforcesRound993(Div.4)-CodeforcesA:题目大意:给出一个\(n\),求有多少有序正整数数对\((a,b)\),使得\(a=n-b\)#include<iostream>#definestreampreset()ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);usingnames......
  • Codeforces Round 994 (Div. 2) (D-F)
    answerpage还有好多没补,但是既然赛时写出了e就应该去补f,不进则退这场没开排行榜埋头苦写第一次赛时出e了,也是第一次400名,可喜可贺//(虽然d不会)DE#include<bits/stdc++.h>usingnamespacestd;constintN=2e2+10;#definelowbit(x)(x&(-x))//#defineendl'\n'......
  • Codeforces Global Round 28
    1.A.KevinandCombinationLock知识点:模拟题目意思:现有一个正整数x,我们能否通过两个操作让x为0,可以就输出YES,不行就输出NO。操作一:如果x中存在33,并且x不等于33的情况下可以删除x中的33。比如13323->123。操作二:如果x>=33,可以让x=x-33。思路:操作一去除某个位置......
  • Codeforces Global Round 28 Editorial(A-F)
    连掉了五场分,但是该打还是要打。反正也不会更差了。problemset官方中解A我A就不会了,但是随便猜了一个结论过了。复制一下题解:考虑移除连续33实际减少的数是多少,就会发现减少的也是33倍数,所以原本就要整除才行B呃一开始构造错了。。把最小数间隔k排然后别的数随便塞C\(O(......
  • Codeforces Global Round 28 # D
    D.KevinandCompetitionMemories一、题意概述有n个选手和m个问题,给出每个选手的rating---a(n+1),和题目对应的rating---b(m+1),根据rating大小判断选手能否做出这一题。现在将所有题目分成[  ]组,求每组Kevin的排名,求其和,算出和的最小值;输出m个最小值,k分别等于1,2,···......
  • Codeforces Global Round 28 / cf contest 2048 题解
    比赛链接A.KevinandCombinationLock观察操作难度(个人感觉)★☆☆☆☆注意到两个操作都不改变\(\%33\)的值,因此要求原数\(\%33==0\),显然这是充分的。B.KevinandPermutation观察操作难度(个人感觉)★☆☆☆☆一个点的"势力范围"是以\([p,p+k)\)为右端点的......
  • Codeforces Global Round 28 : C. Kevin and Binary Strings O(n)解法
    题目地址https://codeforces.com/contest/2048/problem/C题意:给定一个字符串,字符串第一个是1,其他的都是0或1。问如何从该字符串中取两段,使得两段异或最大,两段可以重叠字符串的长度设为size因为字符串第一个是1,所以必定有一段是1sizeO(n)解法:第一段连续的0的长度设为cnt,第......
  • 「ABC245D」 Polynomial division
    题意给定多项式\(A\)和\(C\),求\(C\)除以\(A\)的结果\(B\)。分析先考虑用\(a_i\)和\(b_j\)表示\(c_{i+j}\),多项式乘法的朴素方法是把两式的每一位都乘起来,最后相加。具体形式为\[\begin{array}{c}c_{n+m}=a_{n}b_{m}\\c_{n+m-1}=a_{n}b_{m-1}+a_{n-1}b_{m}\\c......
  • PKUWC2024 D1T2 补题记录
    加深了一点点对同余最短路的理解。link考虑若对所有数\(+1\),那么\(f'_{1\dotsn}\)都会\(+(n-1)\),这启示我们可以根据最小值划分进行区间dp。设\(dp_{l,r,V}\)表示考虑数字\(f_{l\dotsr}\),区间\(f'_{l\dotsr}\)中已经整体减\(V\)还是否能全部减成\(0\)。每......
  • 【内向基环树】codeforces 2044 G1. Medium Demon Problem (easy version)
    前言基环树,又名环套树,是具有\(n\)个节点和\(n\)条边的图,比树多出现一个环。基环树也根据边的有向和无向分为了有向基环树和无向基环树。有向基环树又可以分为内向基环树和外向基环树。对于有向基环树,若基环树的每个节点的出度均为\(1\),则称为内向基环树;若基环树的每个节点的......