AtCoder Regular Contest 182(A B C)

原来第二题比第一题简单吗
A.Chmax Rush! \(\texttt{Diff 1110}\)
给定三个序列 \(S,P,V\),其中 \(S\) 的长度为 \(N\),\(P,V\) 的长度为 \(Q\),按从小到大的顺序对每个 \(i\in[1,Q]\) 执行下述操作:
在 \([1,P_{i}]\) 和 \([P_{i},N]\) 中选择一个区间,要求其中所有的值都不大于 \(V_{i}\),然后将区间内所有值替换成 \(V_{i}\)
求出能在符合要求的情况下执行全部操作的方案数
\(N,Q\le 5000\)
Hint
离线下来倒序做
Solution
考虑到可以倒序做这个题.
假设现在我们枚举到了操作 \(i\),那么,对于它前面的每一个操作 \(j\),假如 \(V_{i}\lt V_{j}\),显然这两个操作就不能有重复区间了. 那么如何才能让它们之间没有重复区间?分以下情况讨论:
\(P_{i}\lt P_{j}\),为了无交集,应该选 \([1,P_{i}],[P_{j},N]\) 两个区间
\(P_{i}\gt P_{j}\) 同理,选 \([1,P_{j}],[P_{i},N]\) 两个区间
\(P_{i}=P_{j}\),无论如何选总会在 \(P_{i}\) 相交,直接判无解
因此此题可以 \(n^{2}\) 做,鉴于单次操作可能的状态只有两个,因此记录一下谁放右边,谁放左边就行了. 最后加起来一乘就是答案.
Code
int n,q,p[5001],v[5001],s[5001],ans=1;
const int mod=998244353;
bool isleft[5001],isright[5001];
int main(){
	read(n,q);
	for(int i=1;i<=q;++i){
		read(p[i],v[i]);
		isleft[i]=isright[i]=true;
	}
	for(int i=q;i>=1;--i){
		for(int j=i-1;j>=1;--j){
			if(v[i]<v[j]){
				if(p[i]>p[j]){
					isleft[i]=false;
					isright[j]=false;
				}
				else if(p[j]>p[i]){
					isright[i]=false;
					isleft[j]=false;
				}
				else{
					printf("0\n");
					return 0;
				}
			}
		}
		if(!isleft[i] and !isright[i]){
			printf("0\n");
			return 0;
		}
		ans=ans*(isright[i]+isleft[i])%mod;
	}
	printf("%d\n",ans);
}
B.|{floor(A_i/2^k)}| \(\texttt{Diff 1049}\)
给定 \(N,K\),构造一个长为 \(N\) 的序列,满足序列元素范围在 \([1,2^{K}-1]\) 之间
定义序列价值如下:对于全部的非负整数 \(k\),序列中 \(\lfloor\frac{A_{i}}{2^{k}}\rfloor\) 的不同值个数
如序列 \(\{3,5\}\),当 \(k=0\) 时不同的值个数为 \(2\)(\(\{3,5\}\)),当 \(k=1\) 时为 \(2\)(\(\{1,2\}\)),\(k=2\) 时只有一个新元素出现 \((\{0,1\})\),和为 \(5\)
请你最大化构造出来的序列的价值
\(N\le 2\times 10^5,K\le 30\)
Solution
发现这个 \(\lfloor\frac{A_{i}}{2^{k}}\rfloor\) 的操作非常像右移啊,其实就相当于 \(A_{i}\operatorname{Rsh} k\)
也就是说要构造一下任意次右移得到的结果最多的序列.
首先考虑到一个更优的 \(A_{i}\) 满足什么条件. 可以想到 \(2A_{i}\) 总是比 \(A_{i}\) 更优,不仅拥有 \(A_{i}\) 的全部情况,且总是比 \(A_{i}\) 要多一个情况: \(2A_{i}\),因此我们只需要考虑在 \([2^{K-1},2^{K})\) 范围内的数字即可.
当 \(N\gt 2^{k-1}\) 的时候,直接全部都取一遍就行了.
否则,有一结论:答案的上界为 \(1+\sum\limits^{K-1}_{x=0}\min(N,2^{x})\)
证明:考虑每一个区间 \([2^{x},2^{x+1})\),可以发现,对于每一个 \(A_{i}\),它进行操作后最多只有一个数能落在此区间内,而我们有 \(N\) 个数,因此此区间最大值即为 \(N\),同时,考虑到 \(N\) 可能比区间内的数字总和要大,因此最终每个区间的贡献为 \(\min(N,2^{x})\),再加上不在这些区间里的一个贡献 \(0\),总和就是 \(1+\sum\limits^{K-1}_{x=0}\min(N,2^{x})\)
本题的关键不在此处,而是如何去构造一个满足条件的数列.
定义 \(br(x)\) 表示 \(x\) 在 \(K-1\) 位二进制表示下的反串,即如果 \(K=7,x=5\),那么 \(x=000101_{(2)}\),\(br(x)=101000_{(2)}\)
那么按如下操作构造该序列:
\]
即可.
根据刚才的证明,可以发现,要达到这个上界,只需要让构造出来的数字满足 \(\forall i,j\rightarrow \operatorname{bit}_{k}(i)\neq \operatorname{bit}_{k}(j)\),其中 \(\operatorname{bit}_{k}(i)\) 表示 \(i\) 的二进制表示中的最高 \(k\) 位. 可以发现自然数的反串满足这个条件:对于 \(i-j=2^{k}\),总是存在 \(\operatorname{bit}_{k-1}\) 使其不同,而二进制反串有很多个,为了使最后的答案取到区间 \([2^{K-1},2^{K})\) 范围内的数,因此我们才构造出 \(K-1\) 位的反串,这样做可以使得到的数字最大为 \(2^{K-1}+2^{K-1}-1=2^{K}-1\),恰好满足条件.
Code
#include<bits/stdc++.h>
using namespace std;
int n,k,t;
int br(int x){
	int ans=0;
	for(int i=1;i<=k-1;++i){
		ans=ans*2+x%2;
		x/=2;
	}
	return ans;
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>k;
		if(n>=(1<<(k-1))){
			for(int i=1;i<=n;++i){
				cout<<max(1,(1<<k)-i)<<" ";
			}
		}
		else{
			for(int i=1;i<=n;++i){
				cout<<(1<<(k-1))+br(i)<<" ";
			}
		}
		cout<<endl;
	}
}
C.Sum of Number of Divisors of Product \(\texttt{Diff 2408}\)
给定 \(N,M\),求下述式子的值:
\[\sum^{M}_{i_{1}=1}\sum^{M}_{i_{2}=1}\cdots\sum^{M}_{i_{N}=1}f(\prod^{N}_{j=1}i_{j})
\]其中 \(f(x)\) 定义为 \(x\) 的不同正因子个数
\(N\le 10^{18},M\le 16\)
Solution
首先你需要知道 \(f(x)\) 怎么求,如果你不知道的话请移步 此文章 第 \(4.5\) 条
考虑到 \(16\) 以内的质数只有六个,即对任意一个 \(\prod\limits^{N}_{j=1}i_{j}\),都可以表述为如下形式:
\]
因此我们成功将题意转化为求 \(\prod^{6}_{i=1}(a_{i}+1)\)
然后 DP 做?但是我不知道 DP 怎么做
if anyone known, then teach me plz
AtCoder Regular Contest 182(A B C)的更多相关文章
- Atcoder Grand Contest 031B(DP,思维)
		
#include<bits/stdc++.h>using namespace std;int a[200007];int b[200007];long long dp[200007];lo ...
 - Atcoder Beginner Contest 121D(异或公式)
		
#include<bits/stdc++.h>using namespace std;int main(){ long long a,b; cin>>a>&g ...
 - Atcoder Beginner Contest 147D(按位处理)
		
把每个数字每一位上二进制数字取出,求答案时直接用N个数里这一位是0的个数乘上这一位是1的个数然后乘上二的这一位次方,注意所有可能溢出的地方都要对mod取模. #define HAVE_STRUCT_T ...
 - Atcoder Beginner Contest 140E(多重集,思维)
		
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;multiset<long long&g ...
 - Atcoder Beginner Contest 139E(模拟,思维)
		
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int n;int a[1007][1007] ...
 - Atcoder Grand Contest 037A(贪心,思维)
		
#include<bits/stdc++.h>using namespace std;string s;char ans[200007][7];char anss[200007][7];i ...
 - 数学--数论-- AtCoder Beginner Contest 151(组合数+数学推导)好题(๑•̀ㅂ•́)و✧
		
思路统计最大值出现的次数,和最小值出现的次数.虽然是每次都是MAX-MIN,我们先求MAX的和,然后再求MIN的和,做差. 这次代码写的真的很漂亮 题目地址: #include <bits/st ...
 - AtCoder Regular Contest 061
		
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
 - AtCoder Regular Contest 094 (ARC094) CDE题解
		
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
 - AtCoder Regular Contest 093
		
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
 
随机推荐
- DP进阶合集
			
(ps:本集合为Star_F总结的dp进阶知识,持续更新~. 转载本文章需要联系我,否则视为侵权!!) 前置知识:线性dp,背包,树形dp,区间dp 内容预览: 状压dp 数位dp dp优化(前缀和, ...
 - 【Binary】XShell6 无法使用的解决办法
			
感谢博主的解决方案: https://www.cnblogs.com/pinkpolk/articles/13554445.html 首先需要安装VsCode,并且安装一个[Hex Editor]的插 ...
 - 【Spring-Security】Re05 权限控制及403处理
			
一.访问控制方法及控制项: 上述配置中的URL后面都离不开的一个访问控制抉择: 1.全部允许 PermiAll 2.全部拒绝 DenyAll 3.允许匿名访问 Anonymous 也就是普通访问者 4 ...
 - 【Hibernate】Re08 加载策略配置
			
一.关联查询的问题: 使用关联查询,例如简单的一对多关系查询,查出一个部门对象和对应的N个员工对象. 如果一般情况下,我们只是需要部门对象,并不关系关联的员工对象,那么Hibernate关联查询出来的 ...
 - 用户案例 | 蜀海供应链基于 Apache DolphinScheduler 的数据表血缘探索与跨大版本升级经验
			
导读 蜀海供应链是集销售.研发.采购.生产.品保.仓储.运输.信息.金融为一体的餐饮供应链服务企业.2021年初,蜀海信息技术中心大数据技术研发团队开始测试用DolphinScheduler作为数据中 ...
 - 【题解】ABC365(A~E)
			
前四题30min切,然后T5死磕70min+几发小唐错,距离比赛结束还有16s交最后一发,AC了. 目录 A. Leap Year 题目描述 思路 代码 B. Second Best 题目描述 思路 ...
 - blender-1-基本快捷键
			
https://www.bilibili.com/video/BV14u41147YH?p=3&vd_source=e3899eab0ab1c2da60e189bdce9ed666 跟他学的 ...
 - 循环Map的几种方法
			
package cn.jdbc.test;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import ...
 - 23 暑假友谊赛 No.4(UKIEPC 2017)
			
23 暑假友谊赛 No.4(UKIEPC 2017) Problem A Alien Sunset hh,开始一眼差分,但是写寄了qwq,后来换枚举过了(Orz,但是看学长差分是能做的,我就说嘛,差分 ...
 - 第 356 场周赛 - 力扣(LeetCode)
			
第 356 场周赛 - 力扣(LeetCode) 2798. 满足目标工作时长的员工数目 - 力扣(LeetCode) 一次遍历 class Solution { public: int number ...