Portal:https://atcoder.jp/contests/abc347/tasks

ABC347只过了\(A,B\),再创新低,。。。遂来补题

C - Ideal Holidays

题意简述

输入\(n,a,b,d_1,d_2,…,d_n\),表示在Atcoder国每周分为\(a\)天休息日和\(b\)天工作日,现在有\(n\)个事件,第\(i\)个事件落在第\(d_i\)日。我忘了今天是这一周的第几天,需要你输出这\(n\)个事件是否有可能全部落在休息日。

分析

一开始是对\(n\)个日期取模\(a+b\)然后再求极差\(k\),如果\(k<a\)就Yes,否则No……

然后就\(WA\)了一个点。见下:

2 5 1
5 6

\(2\)个事件:\(\{5,6\}\),\(5\)天休息日,\(1\)天工作日。本应输出Yes,但是输出了No。这是因为对\(5\)和\(6\)取模\(6\)分别得\(5\)和\(0\),所以只判断极差是不行的。应该把所有\(d[i]\)取模后的结果存在\(d\)中,从小到大排序,然后把两个日期之间的天数(包括\(d[1]+a+b-d[n]\))求最大值。因为\(d[i]\)取值范围是\([0,a+b)\),所以如果两个天数之间差距\(\geq b\)(工作日的天数),就说明这些日期都能安排在休息日。

Code

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,a,b,d[200010];
int main(){
cin>>n>>a>>b;
for(int i=1;i<=n;i++){
cin>>d[i];
d[i]%=(a+b);
}
sort(d+1,d+1+n);
int maxx=INT_MIN;
for(int i=2;i<=n;i++){
maxx=max(maxx,d[i]-d[i-1]-1);
}
maxx=max(maxx,d[1]+a+b-d[n]-1);
if(maxx>=b) cout<<"Yes\n";
else cout<<"No\n";
}

D - Popcount and XOR

题意简述

给你非负整数\(a,b,C\),构造出非负整数\(X,Y\)满足下列条件:

  • \(0 \leq X < 2^{60}\)
  • \(0 \leq Y < 2^{60}\)
  • \(\operatorname{popcount}(X) = a\)
  • \(\operatorname{popcount}(Y) = b\)
  • \(X \oplus Y = C\)

\(popcount(X)\)表示\(X\)二进制表示中\(1\)的个数。

\(\oplus\)表示按位异或。

分析

这个题难度其实并不高,但因为赛时跟C鏖战太久并且吃了\(4\)次罚时还没\(A\),所以思路乱了。第二天一想就出来了。

设\(k\)为\(C\)中\(1\)的个数,\(x,y\)分别为\(X,Y\)中,放在\(C\)值为\(1\)的位置上的\(1\)的个数。则有下列关于\(x,y\)的方程组:

\(\begin{cases}
a-x=b-y\\
x+y=k
\end{cases}\)

则有\(\begin{cases}
x=\frac{a-b+k}{2}\\
y=k-x
\end{cases}\)

那么我们总结了部分输出No的情况:

  • \((a-b+k)\ mod\ 2\neq 0\)(注意负数\(mod\ 2\)可能等于\(-1\));
  • \(x<0,y<0,x\geq a或y\geq b\)。

根据目前的结果,我们可以进行构造了,\(0\leq i<60\),\(cnt0\)和\(cnt1\)分别表示到目前\(s[i]=0和1\)的个数。详见代码。

需要注意的是还有一种输出No的情况,也就是构造完,\(a\)个\(1\)或者\(b\)个\(1\)没有用完。比如\(a=60,b=60,c=2^{60}-1\),不会被前面的步骤筛查出来,但是发现\(X\)和\(Y\)中一共只能用\(60\)个\(1\),\(a\)和\(b\)没有用完。所以需要定义\(cnt\)来记录填了多少\(1\),每构造完一个就判断如果\(cnt<a\)(如果构造的是\(Y\)就判断\(cnt<b\))就输出No

Code

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,c;
signed main(){
cin>>a>>b>>c;
bitset<70> s(c),A,B;
int k=s.count();
int dx=a-b+k;
if(dx%2!=0){
cout<<"-1\n";
return 0;
}
int x=dx/2,y=k-x;
if(x<0||y<0||x>a||y>b){
cout<<"-1\n";
return 0;
}
int cnt=0;
for(int i=0,cnt0=0,cnt1=0;i<60;i++){
if(s[i]==0){
if(cnt0<a-x) A[i]=1,cnt++;
cnt0++;
}else{
if(cnt1<x) A[i]=1,cnt++;
cnt1++;
}
}
if(cnt<a){
cout<<"-1\n";
return 0;
}
cnt=0;
for(int i=0,cnt0=0,cnt1=0;i<60;i++){
if(s[i]==0){
if(cnt0<b-y) B[i]=1,cnt++;
cnt0++;
}else{
if(cnt1>=x) B[i]=1,cnt++;
cnt1++;
}
}
if(cnt<b){
cout<<"-1\n";
return 0;
}
cout<<A.to_ullong()<<" "<<B.to_ullong()<<"\n";
return 0;
}

E - Set Add Query

题意简述

给定\(n,q\),接下来给出\(q\)个数\(x[1],x[2],…,x[q]\)。

定义\(A\)数组初始全为\(0\),集合\(S\)为空,对于\(i=1,2,…,n\),依次进行下列操作:

  • 如果\(x[i]\in S\),则把\(x[i]\)从\(S\)中删除。
  • 如果\(x[i]\not\in S\),则把\(x[i]\)加入\(S\)。
  • 接下来,对于\(j=1,2,…n\),如果\(j\in S\),则\(A[j]+=|S|\)。

    (\(|S|\)表示集合\(S\)的大小)

更详细的解释见原题样例。

分析

赛后看的这道题,感觉比C和D简单。

拿下面的样例举例:

5 7
1 2 3 2 5 4 2

如上图,下面的彩色条表示的是某一个数字在哪些步骤时待在\(S\)里。例如\(1\)全程都在\(S\)中,\(2\)中间断了一下,是因为又出现了一个\(2\),所以\(2\)从\(S\)中被删除了。那么我们可以用\(q\)次循环完成这个过程,把每一个区间用\((l,r)\)的形式存在pair数组中。具体见代码。

处理pair数组的同时,我们应该把每次操作后\(S\)的大小存下来。用差分+前缀和即可维护出来,存在\(sum\)数组中。接下来输出\(n\)个值,我们就把\(sum\)中\(i\)对应的区间求和输出即可。但是如果循环求和会超时,所以我们需要再求一次前缀和(总体步骤就是差分+前缀和+前缀和)。

https://atcoder.jp/contests/abc347/submissions/51969480的思路与这个相似,但是代码更精简,思路就是用\(k\)表示从\(1\)到\(i\)的长度之和,也是前缀和的方法,但是先减后增,遇到第奇数个数字\(num\)就减去当前的\(k\),遇到第偶数个\(num\)就加上当前的\(k\)。

Code

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,x[200010],last[200010],cnt;
bitset<200010> vis;
pair<int,int> p[200010];
int sum[200010],ans[200010];
signed main(){
cin>>n>>q;
for(int i=1;i<=q;i++){
cin>>x[i];
if(vis[x[i]]){
vis[x[i]]=0;
p[last[x[i]]].second=i-1;
}else{
vis[x[i]]=1;
p[++cnt].first=i;
last[x[i]]=cnt;
}
}
for(int i=1;i<=cnt;i++){
if(p[i].second==0) p[i].second=q;
sum[p[i].first]++;
sum[p[i].second+1]--;
}
for(int i=1;i<=q;i++) sum[i]+=sum[i-1];
for(int i=1;i<=q;i++) sum[i]+=sum[i-1];
for(int i=1;i<=cnt;i++){
ans[x[p[i].first]]+=sum[p[i].second]-sum[p[i].first-1];
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
return 0;
}

不行太菜了,必须多练了

[题解]ABC347 C~E的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. P7185 [CRCI2008-2009] CIJEVI

    hack&&虐题解爽! 私题里有 \(3\) 组 hack. 还得是中模拟. 从 M 或者 Z 遍历整个管道,若遇到断点.断点有两种情况,若与 M 或者 Z 不直接接触,枚举附近的一个 ...

  2. Springboot笔记<13>单元测试

    单元测试 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库,使用@SpringBootTest注解会以springboot的环境启动 JUnit5常用注解 @Tes ...

  3. gitlabci之gitlab runner部署配置

    gitlab runner部署 部署方案可以采用gitlab runner operator部署,也可以直接使用gitlab helm charts部署. runner配置说明 对于k8s gitla ...

  4. Spring Boot 启动优化实践

    作者:vivo 互联网服务器团队- Liu Di 本文系统性分析并优化了一个Spring Boot项目启动耗时高达 280 秒的问题.通过识别瓶颈.优化分库分表加载逻辑.异步初始化耗时任务等手段,最终 ...

  5. 数栈产品预告丨您的指标管理平台——EasyIndex即将上线

    ​  一.写在前面 2016年,数栈开始正式投入研发,发展至今,已经拥有了:实时开发.离线开发.算法开发这些开发平台:数据资产.数据质量这些资产平台:以及数据服务.智能标签这些服务平台,这些不同类型的 ...

  6. java--Spring框架核心

     * Struts与Hibernate可以做什么事? Struts, Mvc中控制层解决方案 可以进行请求数据自动封装.类型转换.文件上传.效验- Hibernate, 持久层的解决方案: 可以做到 ...

  7. element-plus 表格跨页全选

    <template> <div class="app"> <div> <el-checkbox v-model="crossPa ...

  8. 树莓派 noteboot

    树莓派 各种结构的区别 1.视频集群中的第一讲 安装操作系统 http://blog.csdn.net/github_38111866/article/details/76038665 远程连接遇到的 ...

  9. java Filehandler

    简介 最近的好像都没有手敲,只是看了一下.这个是文件管理的 code /* * @Author: your name * @Date: 2020-11-08 15:30:36 * @LastEditT ...

  10. Hive自定义函数(UDF)开发和应用流程.18981521

    目录 引言 一.Hive自定义函数的类型 二.准备环境和工具 三.实际案例开发编译 四.前方有坑请注意 五.总结 引言      Hive作为大数据领域的核心计算引擎,凭借其强大的SQL支持和丰富的内 ...