【牛客OI周赛7-普及组ABCD 非官方题解】暴力,二分,KMP,尺取(STL或Hash)

A:

链接:https://ac.nowcoder.com/acm/contest/372/A
来源:牛客网
 

某天,一只可爱的肥橘喵在路上走,突然遇到了一个怪人,那怪人自称PM6,“小肥喵,这里有一道水题,答对了我就请你吃狗肉,答错了你就请我吃猫肉!”

喵咪瑟瑟发抖:“QAQ什么题?”

PM6道:“给你坐标轴上的N个点,求出对于每个点,有多少个点的 X 坐标和 Y 坐标都大于它。”

毫不意外,蠢肥喵完全不会这道题并面临着被做成猫肉火锅的危险,求求你救救喵咪!

输入描述:

输入包括两行,第一行是正整数n,表示点数,接下来N行每行两个数表示第i个点的横坐标和纵坐标,坐标值都是整数,输入数据中存在坐标相同的点。
对于50%的数据:0<=点的坐标大小<=10000,0<=N<=100
对于100%的数据:0<=点的坐标大小<=10000,0<=N<=1000

输出描述:

输出包括N行,第i行表示有多少个点在点i的右上方。

示例1

输入

复制

3
1 2
2 3
4 4

输出

复制

2
1
0

解题报告:

   暴力没啥好说的。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
pair<int,int> p[MAX];
int main()
{int n;cin>>n;for(int i = 1; i<=n; i++) {scanf("%d%d",&p[i].first,&p[i].second);}for(int i = 1; i<=n; i++) {int ans = 0;for(int j = 1; j<=n; j++) {if(p[j].first > p[i].first && p[j].second > p[i].second) ans++;}printf("%d\n",ans);}return 0 ;

B:

题干:

链接:https://ac.nowcoder.com/acm/contest/372/B
来源:牛客网
 

某天,一只可爱的小兔砸在路上蹦蹦跳跳地走着,怪人PM6出现了,于是小兔子被盯上了。

PM6:“免子。哦不,小兔子。你长得真好…不对,真可爱。我这里有一道很容易很容易的题目,答对了我就请你吃萝卜,答错了你就请我吃兔肉,好不好呀~~?”

小兔砸:“萝卜!?好呀好呀好呀。”于是笨笨的兔纸入套了。

PM6:“我这里有一个由 N 个数组成的序列,给你 M 个询问,每个询问会给你一个数 X ,对于每个询问,你要回答出序列中与这个值最接近的元素。”

听完题后,兔子吓成一坨免子了,面临着变成红烧兔头的危险,求求你救救兔子!

输入描述:

第一行包含一个整数N,为序列长度。
第二行包含N个整数,为序列各元素。
第三行包含一个整数M,为PM6的询问个数。
接下来M行,每行一个整数X,为要询问最接近元素的给定值。
对于40%的数据:1<=N<=10000,1<=M<=1000
对于另外10%的数据:M=1
对于100%的数据:1 <=N<= 100000,1<=M<=10000,0<=序列中的每个数,X<=1e9

输出描述:

M行,每行有一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。

示例1

输入

复制

5
2 4 5 5 7
3
2
5
6

输出

复制

2
5
5

解题报告:

   二分就好了,注意特判第一个数和最后一个数,因为这两个不能用下面那个通式(因为可能pos-1==0 或者pos==n+1,此时不能放到数组中取对应数(因为都是0))(貌似很多人因为没有特判所以80分了这题。。)

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
int a[MAX];
int main()
{int n,m;cin>>n;for(int i = 1; i<=n; i++) scanf("%d",a+i);sort(a+1,a+n+1);cin>>m;while(m--) {int x;scanf("%d",&x);int pos = lower_bound(a+1,a+n+1,x) - a;if(pos == 1) {printf("%d\n",a[1]);continue;}if(pos == n+1) {printf("%d\n",a[n]);continue;}if(abs(a[pos] - x) >= abs(a[pos-1]-x)) printf("%d\n",a[pos-1]);else printf("%d\n",a[pos]);}return 0 ;}

 C:

题干:

链接:https://ac.nowcoder.com/acm/contest/372/C
来源:牛客网
 

另一天,一只可爱的围着围巾的肥企鹅在路上摇摇晃晃地走着,遇上了迎面走来的打着饱嗝的PM6。小企鹅预感不妙,这不就是最近有名的恶人PM6么!吓得立刻扭头就想跑。

PM6:“小火汁,站住!我不吃你(谁叫你是保护动物)。我这有一道简单题,如果你答对了,我就给你吃鱼肉,如果你答错了,就免费帮我充游戏币!”

企鹅:“_(:3J∠)_(默默摘掉围巾)”

PM6:“我给你一个文本串 S ,再给你两个串A、B,你要将文本串中的 A 都转换成 B ,转换后的字符不再参与转换,输出最终的文本串。”

求求你救救企鹅!

输入描述:

第一行输入一个文本串 S 。
第二行输入字符串 A 。
第三行输入字符串 B 。
|S|为S的长度,|A|为A的长度,|B|为B的长度,所有字符都是小写字母,保证 |A| <= |S| 。
对于50%的数据:1<= |A|、|B|、|S| <=1000
对于100%的数据:1<= |A|、|B|、|S| <=1000000

输出描述:

只有一行,输出转换后的文本串。

示例1

输入

复制

abababcd 
ab
cd

输出

复制

cdcdcdcd

解题报告:

    KMP就好了,记录下来每一个匹配的第一个位置,然后遍历整个字符串,遇到匹配的位置的时候就输出替换串,直到遍历完第一个字符串。

AC代码:

#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
char s[1000005];
char t[1000005];
char ac[1000005];
int Next[1000005];
int ans[1000005];
int len1,len2,cnt;
void getnext() {int j = 0,k = -1;Next[0] = -1;while(j<len2-1) {if(k == -1 || t[j] == t[k]) {j++,k++;Next[j] = k;} else k = Next[k];}
}
int kmp() {int i=0,j=0;while(i < len1) {if(j == -1 || s[i] == t[j]) {i++,j++;} else {j=Next[j];}if(j >= len2) {ans[++cnt] = i-len2;j=0;}}return cnt;}
int main() {scanf("%s",s);scanf("%s",t);scanf("%s",ac);len1 = strlen(s);len2 = strlen(t);getnext();kmp();//printf("%d\n",kmp());int cur = 1;int i = 0;//cout << "ans**" << ans[1]<<endl;while(1) {if(i >= len1) break;if(cur <= cnt) {while(i < ans[cur]) {printf("%c",s[i]);i++;}cur++;i += len2;printf("%s",ac);}else {printf("%c",s[i]),i++;}  }return 0;
}

题干:

链接:https://ac.nowcoder.com/acm/contest/372/D
来源:牛客网
 

可能很多人要吐槽为什么标题不是“救救blabla”了。

怪人PM6喜欢数糖纸,不同的糖纸有不同的颜色,一共有 N 张糖纸,第 i 张糖纸颜色为 Ci ,它们的位置都是固定的。PM6喜欢五彩缤纷的糖纸,所以他不希望有重复的颜色。他有一次机会,可以收集任意一段连续区间内的糖纸。求出PM6最多能收集多少张糖纸。

输入描述:

第一行一个正整数 N ,表示共有 N 张糖纸。
第二行共有 N 个正整数,第 i 个正整数表示第 i 张糖纸的颜色 Ci
对于20%的数据:1<=N<=100
对于40%的数据:1<=N<=1000
对于100%的数据:1<=N<=1e6,0<=Ci<=1e9

输出描述:

一个整数表示PM6最多能收集多少张糖纸。

示例1

输入

复制

5
1 2 2 3 4

输出

复制

3

说明

PM6可以收集第3到第5张的糖纸,共有三张。

解题报告:

     尺取法。

AC代码:(每次固定右边界,来移动左边界)

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define maxn 1000000
int a[maxn+5];
bool b[1000000005];
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);int l=0,ans=1;for(int i=1;i<=n;i++){while(b[a[i]])b[a[++l]]=false;b[a[i]]=true;ans=max(ans,i-l);}printf("%d\n",ans);return 0;
}

AC代码2:(固定左边界看可以到达的右边界)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e6 + 5;
const int FFF = 5e7 + 6; 
int mp[MAX];
int cnt,a[MAX];
bool vis[FFF];
int HH(int x) {return (1LL*13531*x)%(FFF-100);
}
int main()
{int n;cin>>n;for(int i = 1; i<=n; i++) scanf("%d",&a[i]),mp[i] = HH(a[i]);int l = 1,r = 1,ans = 0;while(l<=r && l <= n) {while(vis[mp[r]] == 0 && r <= n) {vis[mp[r]] = 1,r++;}ans = max(ans,r-l);vis[mp[l]] = 0;l++;}printf("%d\n",ans);return 0 ;}

这个实现方法很多,可以Hash可以直接开1e9的数组可以unordered_map,可以用二分来离散化(但是离散化完了要重新记录到一个数组中,这样使用的时候是O1的,不能每次使用都从重新计算,因为常数有点扛不住、、)

并且Hash的时候注意不能用rand(),不然可能本来相同的值可能就会被映射到不同地方去了。

这样写显然错误:(越界了)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e6 + 5;
const int FFF = 5e7 + 6; 
int mp[MAX];
int cnt,a[MAX];
bool vis[FFF];
int HH(int x) {return (1LL*13531*x)%(FFF-1);
}
int main()
{int n;cin>>n;for(int i = 1; i<=n; i++) scanf("%d",&a[i]),mp[a[i]] = HH(a[i]);int l = 1,r = 1,ans = 0;while(l<=r && l <= n) {while(vis[mp[a[r]]] == 0 && r <= n) {vis[mp[a[r]]] = 1,r++;}ans = max(ans,r-l);vis[mp[a[l]]] = 0;l++;}printf("%d\n",ans);return 0 ;}

常数很小的unordered_map(400ms)(我写的就800ms、、)

#include<cstdio>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int,int>pos;int n,x,now=0,ans=1;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&x);now=i-pos[x]>now?now+1:i-pos[x];ans=ans>now?ans:now;pos[x]=i;}printf("%d\n",ans);return 0;
}

还可以直接取模:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
#define N 1000001
#define P 1651469
int n,a[N],ans=0;
bool v[N*2];
int main() {cin>>n;for(int i=1;i<=n;i++) scanf("%d",&a[i]);int l=1,r=1;v[a[1]%P]=1;while(r<n) {if(v[a[r+1]%P]) {while(a[r+1]!=a[l])v[a[l++]%P]=0;l++;}v[a[++r]%P]=1;ans=max(ans,r-l+1);}cout<<ans<<endl;
}

写在后面:

   纪念第一场ak...虽然题目很水但毕竟是不熟悉的OI赛制。继续加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php函数汉语,PHP汉字截取函数:UTF-8、GB2312双支持

经测试代码如下&#xff1a;/*Utf-8、gb2312都支持的汉字截取函数cut_str(字符串,截取长度,开始长度,编码);编码默认为 utf-8开始长度默认为 0*/function cut_str($string,$sublen,$start 0,$code UTF-8){if($code UTF-8){$pa "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\x…

【牛客 - 327牛客寒假算法基础集训营2 I】处女座的测验(二)(积性函数性质,数论,素数唯一性分解,STL)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/327/I 来源&#xff1a;牛客网 现在处女座顺利的完成了测验&#xff0c;处女座想要知道知道自己输出的结果是否正确。他希望知道自己有自己输出的数中有多少对是不满足要求的。 更具体的&#xff0c…

linux监控命令执行,你可能不知道的 即时监控 Linux 使用者执行指令的三种方法...

原标题&#xff1a;你可能不知道的 即时监控 Linux 使用者执行指令的三种方法这里介绍如何在 Linux 系统上以管理者权限即时监控一般使用者所执行的任何指令。Linux 的 root 管理者可对系统进行任何的管理与操作&#xff0c;如果想要即时监控特定使用者在主机上所执行的指令&am…

【POJ - 2728】Desert King (最有比率生成树,分数规划)

题干&#xff1a; David the Great has just become the king of a desert country. To win the respect of his people, he decided to build channels all over his country to bring water to every village. Villages which are connected to his capital village will be…

linux非权限安装bioperl,bioperl的安装

1. 对于UNIX用户(1)下载BioPerl的源代码&#xff0c;并解压。我提供两个网址&#xff1a;(2)进入该目录&#xff0c;然后执行下列命令&#xff1a;$ perl Build.PL$ ./Build test# ./Build install (注意&#xff1a;执行./Build install时必须要有系统管理员权限)BioPerl和许多…

【牛客 - 327G】处女座与复读机(可编辑距离问题,dp)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/327/G 来源&#xff1a;牛客网 一天&#xff0c;处女座在牛客算法群里发了一句“我好强啊”&#xff0c;引起无数的复读&#xff0c;可是处女座发现复读之后变成了“处女座好强啊”。处女座经过调查…

linux远程打开windows程序,为新手讲解Linux和Windows系统的远程桌面访问知识

很多新手都是使用Linux和Windows双系统的&#xff0c;它们之间的远程桌面访问是如何连接的&#xff0c;我们就为新手讲解Linux和Windows系统的远程桌面访问知识&#xff0c;包括所使用的软件及方法。本文所使用的Linux版本是深度操作系统&#xff0c;如果要安装该版本请参考U盘…

【51nod - 1174 】区间中最大的数(RMQ问题,ST表,模板)

题干&#xff1a; 给出一个有N个数的序列&#xff0c;编号0 - N - 1。进行Q次查询&#xff0c;查询编号i至j的所有数中&#xff0c;最大的数是多少。 例如: 1 7 6 3 1。i 1, j 3&#xff0c;对应的数为7 6 3&#xff0c;最大的数为7。&#xff08;该问题也被称为RMQ问题&am…

linux用户登录实验,Linux用户和组相关命令及实验

本文简要介绍了在Linux系统下&#xff0c;如何对账户和组进行增、删、改的操作。一、 groupaddgroupadd [选项] group_name-g GID&#xff1a;指定GID&#xff1b;默认是上一个组的GID1&#xff1b;-r: 创建系统组&#xff1b;二、 groupmod命令&#xff1a;修改组属性groupmod…

【CSU - 1980 】不堪重负的树(树上区间dp)

题干&#xff1a; 小X非常喜欢树&#xff0c;然后他生成了一个大森林给自己玩。 玩着玩着&#xff0c;小X陷入了沉思。 一棵树由N个节点组成&#xff0c;编号为i的节点有一个价值Wi。假设从树根出发前往第i个节点&#xff08;可能是树根自己&#xff09;&#xff0c;一共需要…

linux windows 域,linux加入windows域之完美解决方案

《linux加入windows域之完美解决方案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《linux加入windows域之完美解决方案(10页珍藏版)》请在人人文库网上搜索。1、linux加入windows域的理想方案原文来源&#xff1a; http:/rainbird.blog.51cto.com/笔者最近几天正在…

【蓝桥杯官网试题 - 算法训练 】K好数(线性dp与优化)

题干&#xff1a; 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字&#xff0c;那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K 4&#xff0c;L 2的时候&#xff0c;所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大…

arm-linux配置dhcp自动获取ip地址,ARM-Linux配置DHCP自动获取IP地址

备注&#xff1a;内核版本&#xff1a;2.6.30.9busybox版本&#xff1a;1.15.2PC Linux和开发板Linux的工作用户&#xff1a;root1. 配置内核&#xff1a;[*] Networking support --->Networking options --->Packet socketUnix domain sockets[*] TCP/IP networking[*…

【CodeForces - 897D】Ithea Plays With Chtholly (交互题型,贪心,思维构造,题目信息)

题目大意&#xff1a; This is an interactive problem. Refer to the Interaction section below for better understanding. Ithea and Chtholly want to play a game in order to determine who can use the kitchen tonight. Initially, Ithea puts n clear sheets of pa…

红帽子linux生效环境变量,RedHat Linux 5无法使用ifconfig的解决方法

ifconfig是Linux显示网络设备的命令&#xff0c;能够设置网络设备的状态&#xff0c;但在RedHat Linux 5系统中&#xff0c;有时会遇到ifconfig命令无法使用的情况&#xff0c;下面小编就给大家介绍下RedHat Linux 5无法使用ifconfig命令的解决方法。一起去看看吧&#xff01;在…

关于交互题---Idleness limit exceeded(codeforces)

Idleness limit exceeded的中文&#xff1a;懒惰超过限制。----来自有道翻译 大概意思是在该输出的情况下没有输出数据 比如这个&#xff1a; 而且一般都会提醒你&#xff1a;&#xff08;在每条输出之后加&#xff09; After outputting each line, dont forget to flush t…

Linux如何搭建服务器eb,Linux下CRMEB环境搭建

环境准备:PHP7.0.33MySQL5.7Apache2.4PHP环境安装:sudo apt-get install php-pear php7.0-cli php7.0-common php7.0-curl \php7.0-dev php7.0-fpm php7.0-json php7.0-mbstring php7.0-mcrypt \php7.0-mysql php7.0-opcache php7.0-zip php7.0-intl php7.0-gd php7.0-xmlMySQL…

【EOJ Monthly 2019.02 - A】回收卫星(交互题型,二分)

题干&#xff1a; 单测试点时限: 1.0 秒 内存限制: 256 MB “这个世上没有无用的齿轮&#xff0c;也只有齿轮本身能决定自己的用途。” 就像太空中的卫星&#xff0c;虽然不计其数&#xff0c;但都各司其职。 但没有一个东西是能够永远无损的。为了便于回收及修理&#xf…

windows 调用linux .a lib,动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)...

动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a) 库有动态与静态两种&#xff0c;动态通常用.so为后缀&#xff0c;静态用.a为后缀。例如&#xff1a;libhello.so libhello.a 为了在同一系统中使用不同版本的库&#xff0c;可以在库文件名后加上版本号为后缀,例…

【EOJ Monthly 2019.02 - B】解题(思维,抽屉原理,暴力,模运算,优化,tricks)

题干&#xff1a; 单测试点时限: 2.0 秒 内存限制: 1024 MB “我把房门上锁&#xff0c;并非为了不让她进去&#xff0c;而是为了防止自己逃到她身边”。 她又被数学难住了。QQ 小方当然是不会对女生说”不”的。 她的数学题是这样的&#xff0c;她得到了一个十进制大整数…