[Codeforces Round #841]
[Codeforces Round #841]
Codeforces Round #841 (Div. 2) and Divide by Zero 2022
A. Joey Takes Money
Problem:
给一个正整数序列 \(a_1,a_2,…,a_n (n≥2)\) ,能进行任意次操作,操作是:找到 \(x\) 和 \(y\) 使得 \(x⋅y=a_i⋅a_j\) ,分别用 \(x\) 和 \(y\) 替换 \(a_i\) 和 \(a_j\) ,求操作过后最大的序列和
Solution:
贪心,对于两个正整数:
\(a*b + 1-(a+b) = (a-1)(b-1) \ge 0\) 恒成立
所以将两数相乘并取 \(a*b\) 和 \(1\) 一定会使贡献增加
而两个乘的数越大,越能使贡献增加
所以贪心策略是把最大的数和其他所有的数乘,最后别忘了加上\(n-1\) 个 \(1\)
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
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;
}
int a[60];
signed main()
{
int t = read();
while(t--)
{
int n = read();
for(int i = 1;i <= n;i++) a[i] = read();
sort(a+1,a+n+1);
int ans = a[n];
for(int i = n - 1;i >= 1;i--)
{
ans*=a[i];
}
ans+=n-1;
cout<<ans*2022<<endl;
}
return 0;
}
B. Kill Demodogs
Problem:
给一个 \(n \times n\) 的方格 ,第 \(i\) 行第 \(j\) 列的数值是 \(x⋅y\)
从 \((1,1)\) 走到 \((n,n)\) ,只能向下或向右走,求操作过后最大的序列和
Solution:
首先,可以看出这个方格是一个对称矩阵
其次,通过目测可以看出一直贴着主对角线走贡献最大
答案就是$ ∑i^2 + ∑i(i-1)$
$ ∑i^2 = n(n+1)(2n+1)/6$
\(∑i(i-1) = ∑i^2 -∑i = n(n+1)(2n+1)/6 -n(n+1)/2\)
把二者加起来,\(O(1)\) 输出
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9+7;
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()
{
int t = read();
while(t--)
{
int n = read();
int ans = ((337*n%mod)*(n+1)%mod)*(4*n%mod-1+mod)%mod;
cout<<ans%mod<<endl;
}
return 0;
}
C. Even Subarrays
Problem:
给一个正整数序列 \(a_1,a_2,…,a_n (1≤a_i≤n)\) 找到 \((i,j)\) 使得 $ a_i⊕a_{i+1}+⋯⊕a_j$ 有偶数个因数
完全平方数有奇数个因数,特别的,0被认为有奇数个因数
多组数据,\(1≤t≤10^4\) , \(2≤n≤2⋅10^5\)
Solution:
首先要熟悉异或前缀和的概念,求出前缀和后
$ a_i⊕a_{i+1}+⋯⊕a_j$ 即为 $ sum_{i-1} ⊕sum_j$
枚举序列,对于当前数 \(i\) ,考虑从前面的前缀和中找到位置\(x (x < i)\) 使得 $ sum_{x} ⊕sum_i = k$ ,k不为完全平方数
那么其实就是找前面有没有异或前缀和为 \(sum_{y}⊕k\) ,考虑开一个桶记录数量
考虑时间复杂度,枚举 $ k$ 为 \(O(n^2)\) ,可以枚举完全平方数,最后用总子序列数减去,时间复杂度 \(O(n\sqrt{n})\)
注意细节:前缀和为0的数量初始值为1,序列中两个数异或后理论最大值是\(2n\),枚举 \(k\) 时要考虑到
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9+7;
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;
}
int a[200010];
int sum[200010];
int cnt[1000010];
signed main()
{
int t = read();
while(t--)
{
int n = read();
for(int i = 1;i <= n;i++) a[i] = read();
int ans = 0;
cnt[0] = 1;//注意
for(int j = 1;j <= n;j++)
{
sum[j] = sum[j-1]^a[j];
for(int i = 0;i*i<=2*n;i++)//2*n注意
{
ans += cnt[sum[j]^(i*i)];
}
cnt[sum[j]]++;
}
cout<<(n+1)*n/2-ans<<endl;
for(int i = 1;i <= n;i++) cnt[sum[i]] = 0,sum[i] = 0,a[i] = 0;
}
return 0;
}
D. Valiant's New Map
Problem:
给一个 \(n \times m\) 的方格,每个方格上有数\(a_{i,j}\)
找到一个数 \(l\) 使得 方格中存在一个 \(l \times l\) 的正方形,其中所有的数都大于等于\(l\),求\(l\)最大值
多组数据,\(1≤t≤1000\) , \(1≤n⋅m≤10^6\)
Solution:
比较裸的二分题:
主要有两个细节
一是给的范围是 \(1≤n⋅m≤10^6\) 存数要二维转一维
二是怎么较好的判断,这里的方法是运用二维前缀和,把\(a_{i,j} \ge l\)的赋值为1,否则为0,直接判断正方形中数据和是否为 \(l \times l\)
Code:
#include <bits/stdc++.h>
using namespace std;
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;
}
int dp[1000010],a[1000010];
int n,m;
int tr(int x,int y)
{
return (x-1)*m+y;
}
bool check(int k)
{
for(int i = 1;i <= n*m;i++) dp[i] = a[i] >= k?1:0;
for(int i = 1;i <= n*m;i++)
{
int x = (i-1)/m + 1,y = (i-1)%m + 1;
dp[i] = dp[i] + dp[tr(x-1,y)] + dp[tr(x,y-1)] - dp[tr(x-1,y-1)];
}
for(int i = tr(k,k);i <= n*m;i++)
{
int x = (i-1)/m + 1,y = (i-1)%m + 1;
if(x < k||y < k) continue;
int ans = dp[i] - dp[tr(x-k,y)] - dp[tr(x,y-k)] + dp[tr(x-k,y-k)];
if(ans == k*k) return true;
else continue;
}
return false;
}
int main()
{
int T = read();
while(T--)
{
n = read(),m = read();
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
a[tr(i,j)] = read();
}
}
int l = 1,r = min(n,m);
int ans = l;
while(l <= r)
{
int mid = l + r>>1;
if(check(mid))
{
ans = mid;
l = mid+1;
}
else r = mid-1;
}
cout<<ans<<endl;
}
return 0;
}
E\F 没来得及看233
[Codeforces Round #841]的更多相关文章
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- Codeforces Round #370 - #379 (Div. 2)
题意: 思路: Codeforces Round #370(Solved: 4 out of 5) A - Memory and Crow 题意:有一个序列,然后对每一个进行ai = bi - bi ...
- Codeforces Round #371 (Div. 1)
A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...
- Codeforces Round #284 (Div. 2)A B C 模拟 数学
A. Watching a movie time limit per test 1 second memory limit per test 256 megabytes input standard ...
随机推荐
- GC plan_phase二叉树挂接的一个算法
楔子 在看GC垃圾回收plan_phase的时候,发现了一段特殊的代码,仔细研究下得知,获取当前数字bit位里面为1的个数. 通过这个bit位为1的个数(count),来确定挂接当前二叉树子节点的一个 ...
- OnionArch - 采用DDD+CQRS+.Net 7.0实现的洋葱架构
博主最近失业在家,找工作之余,看了一些关于洋葱(整洁)架构的资料和项目,有感而发,自己动手写了个洋葱架构解决方案,起名叫OnionArch.基于最新的.Net 7.0 RC1, 数据库采用Postgr ...
- Docker容器技术基础
Docker基础 目录 Docker基础 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 doc ...
- Vue学习之--------绑定样式、条件渲染、v-show和v-if的区别(2022/7/12)
文章目录 1.绑定样式 1.1 基础知识 1.2 代码实例 1.3 测试效果 2.条件渲染 2.1 基本知识 2.2 代码实例 2.3 测试效果 1.绑定样式 没啥好说的.我觉得还没直接引入外部写好的 ...
- JUC(3)
文章目录 1.集合类不安全 2.在高并发情况下arraylist()并不安全 3.高并发下set并不安全 3.测试map(高并发情况下出现问题) 1.集合类不安全 2.在高并发情况下arraylist ...
- Codeforces Round #829 (Div. 2) A-E
比赛链接 A 题解 知识点:枚举. 只要一个Q后面有一个A对应即可,从后往前遍历,记录A的数量,遇到Q则数量减一,如果某次Q计数为0则NO. 时间复杂度 \(O(n)\) 空间复杂度 \(O(1)\) ...
- C#-多线程的使用Tread
首先是概念,什么是线程? 线程是操作系统分配CPU时间的基本单元,在一个进程中可以有多个线程同时执行代码. 谈一谈什么是进程? 简单的说,一个正在运行的应用程序可以视为一个进程,进程间相互独立,资源不 ...
- Spring源码知识
bean的生命周期: 实例化:在堆空间中申请内存,使用反射来实现:(createBeanInstance) 自定义属性赋值(setter).容器对象属性赋值(invokeAwareMethods) 前 ...
- 二、Celery执行一步任务
二.Celery执行异步任务 2.1.基本使用 创建项目celerypro 创建异步任务执行文件celery_task: import celery import time backend='redi ...
- nginx 客户端返回499的错误码
我们服务器客户端一直有返回错误码499的日志,以前觉得比例不高,就没有仔细查过,最近有领导问这个问题,为什么耗时只有0.0几秒,为啥还499了?最近几天就把这个问题跟踪定位了一下,这里做个记录 网络架 ...