2019-2020Nowcoder Girl初赛 题解
题目都不是很难,就是最后一题有点毒瘤
第一题:牛妹爱整除
这个你把一个进制数进行拆分,拆分成若干位,然后在取模,这样会发现如果是x进制的数,那么对x+1这个进制转化即满足条件。
举个例子:一个x进制数abc a*x*x+b*x+c
那么(a*x*x+b*x+c)%k 满足于 (a+b+c) 相等
则x=k+1,那么x%k==1 所以 a*(x%k)*(x%k)%k+b*(x%k)%k+c%k==(a+b+c)%k
代码很简单,有需求可以直接去牛客找
第二题:吃桃
这个是一个树的题目,直接dfs就可以解决,算是dp吧。
首先dfs找到深度,然后在找深度的同时把路径记录下来,最后输出,
为了保证小的先选可以先拍个序。
第三题:背包问题
这个是一个很裸的背包。
dp[j]表示价值为 j 的物品,可以占的最多的背包体积
第四题:泡面
不知道自己怎么就过了,之前cf有一个差不多的题目(我之前以为差不多),后来发现是两个不一样的题目。
但是比赛的时候并没有发现,然后我按照我的印象写了,居然A了,因为我写出bug了,但是这个bug好像很合适这个题目,谜之A了。。。
赛后重新写了一次。
这个就是一个模拟,用个优先队列模拟就可以了。
注意开longlong
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+;
typedef long long ll;
struct node{
ll id,val;
node(ll id=,ll val=):id(id),val(val){}
bool operator<(const node &a)const{
return a.id<id;
}
}a[maxn];
bool cmp(node a,node b){
return a.val<b.val;
}
priority_queue<node>que;
ll ans[maxn];
int main(){
ll n,p,x;
scanf("%lld%lld",&n,&p);
for(int i=;i<=n;i++) {
scanf("%lld",&x);
a[i]=node(i,x);
}
sort(a+,a++n,cmp);
ll nowtime=a[].val,now=;
while(!que.empty()) que.pop();
que.push(a[]);
while(!que.empty()){
nowtime+=p;
node u=que.top();que.pop();
ans[u.id]=nowtime;
while(now<=n&&a[now].val<=nowtime){
que.push(a[now]);
now++;
}
if(que.empty()&&now<=n){
nowtime=a[now].val;
que.push(a[now]);
now++;
}
}
for(int i=;i<=n;i++) printf("%lld ",ans[i]);
printf("\n");
return ;
}
泡面
cf和这个很像的题目
https://codeforces.com/contest/1248/problem/E
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <map>
#include <iostream>
#include <cstdlib>
#include <stack>
#define inf 0x3f3f3f3f
#define LL long long
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
struct node{
int id;
ll tim;
node(int id=,ll tim=):id(id),tim(tim){}
bool operator<(const node&a)const{
return a.id<id;
}
}a[maxn];
queue<node>que;
priority_queue<node>prique;
int mins[maxn*];
void build(int id,int l,int r){
mins[id]=inf;
if(l==r) return ;
int mid=(l+r)>>;
build(id<<,l,mid);
build(id<<|,mid+,r);
}
void push_up(int id){
mins[id]=min(mins[id<<],mins[id<<|]);
} void update(int id,int l,int r,int pos,int val){
if(l==r){
mins[id]=val;
return ;
}
int mid=(l+r)>>;
if(pos<=mid) update(id<<,l,mid,pos,val);
else update(id<<|,mid+,r,pos,val);
push_up(id);
}
bool cmp(node a,node b){
if(a.tim==b.tim) return a.id<b.id;
return a.tim<b.tim;
}
ll ans[maxn];
int main(){
int n,p;
scanf("%d%d",&n,&p);
build(,,n);
for(int i=;i<=n;i++) scanf("%lld",&a[i].tim),a[i].id=i;
sort(a+,a++n,cmp); while(!que.empty()) que.pop();
while(!prique.empty()) prique.pop(); int now=;
ll nowtime=a[now].tim;
que.push(a[now]);
update(,,n,a[now].id,a[now].id);now++; while(now<=n&&a[now].tim<=nowtime+p){
if(a[now].id<=mins[]) {
que.push(a[now]);
update(,,n,a[now].id,a[now].id);now++;
}
else prique.push(a[now]),now++;
} while(now<=n||!que.empty()||!prique.empty()){
while(!prique.empty()){
node u=prique.top();
if(u.id<=mins[]){
prique.pop();
que.push(u);
update(,,n,u.id,u.id);
}
else break;
}
while(now<=n&&a[now].tim<=nowtime+p){
if(a[now].id<=mins[]) {
que.push(a[now]);
update(,,n,a[now].id,a[now].id);now++;
}
else prique.push(a[now]),now++;
}
if(!que.empty()){
int u=que.front().id;que.pop();
ans[u]=nowtime+p;
update(,,n,u,inf);
}
nowtime+=p;
if(que.empty()&&prique.empty()&&now<=n) nowtime=a[now].tim;
}
for(int i=;i<=n;i++) printf("%lld ",ans[i]);
printf("\n");
return ;
}
E - Queue in the Train
第五题:伪直径
这个题目如果你之前碰到过求直径的题目就可以很快的反应过来,但是如果没有呢,就可能需要思考一会吧。
而且这个题目名字已经给了很大的提示了,所以还是很好写的。
答案就是直径减一
怎么求直径呢?这可以从紫书上看
就是两次dfs
就是随便找一个点然后找到最深的叶子节点,然后从这个叶子节点找到最深的另一个叶子节点就可以了。
第六题:最大最小差
这个题目好毒瘤
比赛的时候没有写出来
然后赛后,用线段树+二分写了一次,tle 3分
然后问了一个oi dalao,学习了一下双指针+st表的写法,依旧tle,但是 18分
最后加了各种优化,19分 tle
最后学会了一种超级厉害的快读,终于A了,oi的快读真强。
好像还可以用单调队列+双指针写,但是好难写,我不会。。。
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
# define getchar() (S==T&&(T=(S=BB)+fread(BB,,<<,stdin),S==T)?EOF:*S++)
char BB[ << ], *S = BB, *T = BB;
using namespace std;
const int maxn=1e6+;
typedef long long ll;
int maxsum[maxn][],minsum[maxn][],a[][maxn],v[],f[maxn],w[];
void init(int n){
for(int i=;i<maxn;i++) f[i]=(log(i*1.0)/log(2.0));
for(int i=;i<;i++) w[i]=(<<i);
}
void RMQ(int id,int n) {
for(int i=;i<=n;i++){
maxsum[i][]=a[id][i];
minsum[i][]=a[id][i];
}
for (int i = ; i < ; i++) {
for (int j = ; j <= n; j++) {
if (j + w[i] - <= n) {
maxsum[j][i] = max(maxsum[j][i - ], maxsum[j + w[i-]][i - ]);
minsum[j][i] = min(minsum[j][i - ], minsum[j + w[i-]][i - ]);
}
}
}
} int st(int x,int y){
int k=f[y-x+];
int maxnum = max(maxsum[x][k], maxsum[y - w[k] + ][k]);
int minnum = min(minsum[x][k], minsum[y - w[k] + ][k]);
int ans = maxnum - minnum;
return ans;
}
int L[maxn],R[maxn];
int read()
{
int x=;
char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
return x;
} inline void write(ll X) {
if (X < ) { putchar('-'); X = ~(X - ); }
int s[], top = ;
while (X) { s[++top] = X % ; X /= ; }
if (!top) s[++top] = ;
while (top) putchar(s[top--] + '');
putchar('\n');
} int main(){
int n,t;
n=read();
t=read();
init(n);
for(int i=;i<=t;i++) v[i]=read();
for(int i=;i<=t;i++){
for(int j=;j<=n;j++){
a[i][j]=read();
}
}
ll ans=;
memset(R,inf,sizeof(R));
for(int i=;i<=t;i++){
RMQ(i,n);
int p1=,p2=;
for(int j=;j<=n;j++){
while(p1<=j&&st(p1,j)>v[i]) p1++;
while(p2+<=j&&st(p2+,j)>=v[i]) p2++; if(st(p1,j)!=v[i]) L[j]=inf;
else L[j]=max(L[j],p1);
if(st(p2,j)!=v[i]) R[j]=;
else R[j]=min(R[j],p2);
}
}
for(int i=;i<=n;i++){
if(L[i]<=R[i]) ans+=R[i]-L[i]+;
}
// printf("%lld\n",ans);
write(ans);
return ;
}
快读好厉害
2019-2020Nowcoder Girl初赛 题解的更多相关文章
- 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解
题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...
- Comet OJ 2019 夏季欢乐赛题解
Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...
- [NOIP2018]普及组初赛题解
老师布置的作业,借博客这个平台一用 [总体感觉]对我而言比去年的难度大……特别是最后一题. 选择题 1.D 打印机属于输出设备 2.D 将全部进制转换为10进制进行对比,我的方法是每一位乘以进制的位数 ...
- 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解
https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...
- kick start 2019 round D T3题解
---恢复内容开始--- 题目大意:共有N个房子,每个房子都有各自的坐标X[i],占据每个房子需要一定花费C[i].现在需要选择K个房子作为仓库,1个房子作为商店(与题目不同,概念一样),由于仓库到房 ...
- kick start 2019 round D T2题解
题目大意:由N个房子围成一个环,G个人分别顺时针/逆时针在房子上走,一共走M分钟,每分钟结束,每个人顺/逆时针走到相邻的房子.对于每个房子都会记录最后时刻到达的人(可能是一群人).最终输出每个人会被几 ...
- 2019.11.11&12题解
Day1 考的不是很好,T1T2没区分度,T3想的太少,考试后期几乎都是在摸鱼,bitset乱搞也不敢打,只拿到了35分,跟前面的差距很大 A. 最大或 标签: 二进制+贪心 题解: 首先x,y中一定 ...
- 2019.11.12&13题解
写在前面: 虽然拿到了rk1,但是T3被卡常TLE90分,(考后再交就A了!?),lemon80,又丢失了一次良好的AK机会, 掐头去尾距离联赛仅剩2天,最近中午一直睡不好,可能是有些紧张, 希望自己 ...
- The Preliminary Contest for ICPC Asia Nanjing 2019/2019南京网络赛——题解
(施工中……已更新DF) 比赛传送门:https://www.jisuanke.com/contest/3004 D. Robots(期望dp) 题意 给一个DAG,保证入度为$0$的点只有$1$,出 ...
- 2019-2020Nowcoder Girl初赛题解
写了一天计算几何,心态崩了,水一篇题解休息休息. emmmm,如果您是一名现役OIer/CSPer,那看这篇文章也许并不能在你的生命中留下些什么(潮子语录),因为相比NOIP/CSP这个比赛其实比较简 ...
随机推荐
- 同步工具类—— CountDownLatch
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 CountDownLatch简介 CountDownLa ...
- [安卓] 21、android studio 疑难杂症
目录 1 gradle问题 1.1 gradle版本不匹配导致的错误: . 1 gradle问题 1.1 gradle版本不匹配导致的错误: 背景:在导入telink ble ota安卓源码时遇到an ...
- 数据结构和算法(Golang实现)(21)排序算法-插入排序
插入排序 插入排序,一般我们指的是简单插入排序,也可以叫直接插入排序.就是说,每次把一个数插到已经排好序的数列里面形成新的排好序的数列,以此反复. 插入排序属于插入类排序算法. 除了我以外,有些人打扑 ...
- Java课程设计之——Web前端
主要使用的技术 Javascript/JQuery html css Jsp 前期调查 能看到的网页大致可以分为两个部分,一个是搜索的首页index.html,一个是搜索结果页/s index.htm ...
- 百度AI开发平台简介
AIstudio https://aistudio.baidu.com/aistudio/index 关于AI Studio AI Studio是基于百度深度学习平台飞桨的一站式AI开发平台,提供在线 ...
- Crossing River POJ过河问题
A group of N people wishes to go across a river with only one boat, which can at most carry two pers ...
- Linux下安装python3环境搭建
Linux下python3环境搭建 Linux安装软件有哪些方式? rpm软件包 手动安装 拒绝此方式 需要手动解决依赖关系 yum自动化安装 自动处理依赖关系 非常好用 源代码编译安装,可自定义的功 ...
- 性能测试-pidstat 问题定位分析
pidstat 概述 pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu.内存.线程.设备IO等系统资源的占用情况.pidstat首次运行时显示自系统启动开始的各项统计信息, ...
- vue2.x学习笔记(二十)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12631279.html. 循环引用 递归组件 组件是可以在它们自己的模板中调用自身的,不过它们只能通过[name] ...
- [HarekazeCTF2019] web
在 buuoj 上看到的这个比赛题目,期间平台关了,就拿了 Dockerfile 本地做了,web 题目感觉还不错 encode_and_encode [100] 打开靶机,前两个页面都是 html ...