Codeforces Round 993 (Div. 4)(补题)
Codeforces Round 993 (Div. 4)
只选择对我有价值的题目记录
E. Insane Problem
题目描述
给定五个整数
。 。- 存在一个非负整数
,使得 。
输入
- 第一行包含一个整数
( ),这里的 表示测试用例的数量。 - 对于每个测试用例,其唯一的一行包含五个整数
, , , 和 ( , , )。
输出
对于每个测试用例,在新的一行输出匹配的有序对
示例
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 |
注意事项
- 在第三个测试用例中,匹配的有序对如下:
- 在第四个测试用例中,唯一有效的有序对是
。
思路:
枚举加计数问题,通常只需要枚举其中一个,然后另一个是可以通过计算得到的。由于
x
和y
的范围告诉我们了,所以的范围我们也能知晓,上界为 下取整,下界为 向上取整。现在我们只需要调整一下方程为 ,每枚举一个可行的 后,我们用y的最小值和最大值即可求出在这个可行的 下 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 给出了一个长度为
然后,Robot 会给出
- 选择整数
和 ,使得 和 都是整数。 - 设
为 ,所有有序对 都是 , ,或都是 。
请注意,查询是不持久的,也就是说,在查询过程中,您不会将任何元素设置为
输入
第一行包含三个整数
第二行包含
第三行包含
下面的
输出
对于每个测试用例,如果有办法执行上述操作,从而使美景为
您可以在任何情况下输出 "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; }
本文作者:califeee
本文链接:https://www.cnblogs.com/califeee/p/18624120
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步