9.16 a.m.小结
T1:问题 A: 楼兰图腾
题目描述
在完成了分配任务之后,西部314来到了楼兰古城的西部。相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(‘V’),一个部落崇拜铁锹(‘∧’),他们分别用V和∧的形状来代表各自部落的图腾。
西部314在楼兰古城的下面发现了一幅巨大的壁画,壁画上被标记出了N个点,经测量发现这N个点的水平位置和竖直位置是两两不同的。西部314认为这幅壁画所包含的信息与这N个点的相对位置有关,因此不妨设坐标分别为(1,y1),(2,y2),…,(n,yn),其中y1~yn是1到n的一个排列。
西部314打算研究这幅壁画中包含着多少个图腾,其中V图腾的定义如下(注意:图腾的形式只和这三个纵坐标的相对大小排列顺序有关)1<=i<j<k<=n且yi>yj,yj<yk;
而崇拜∧的部落的图腾被定义为1<=i<j<k<=n且yi<yj,yj>yk;
西部314想知道,这n个点中两个部落图腾的数目。因此,你需要编写一个程序来求出V的个数和∧的个数。
输入
第一行一个数n
第二行是n个数,分别代表y1,y2……yn
输出
两个数
中间用空格隔开
依次为V的个数和∧的个数
样例输入
5
1 5 3 2 4
样例输出
3 4
提示
数据范围与约定
10%的数据 n<=600
40%的数据 n<=5000
100%的数据 n<=200000,答案不超过int64
题解
首先注意数据范围,int64和long long一样,表示带符号位一共有2的64次方个数。由于这道题V和^的数量只与3个点的相对大小有关,题目并未要求连续。因此考虑用前缀和,树状数组动态维护前缀和。对于V,我们需要知道前面比它大的有多少个,后面比它大的有多少个,就用query(n)-query(i)就可以得到(考虑普通前缀和转为连续区间和),自然对于^也是一样的做法。因此只需要注意是求query(i)还是求query(n)-query(i),然后分别从1到n和从n到1累计答案就可以了。注意平级不算答案。
参考代码
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;
int n;LL a[200010],ans1=0,ans2=0;
LL pt1[200010],pt2[200010],c[200010];
void add(int t)
{for(;t<=n;t+=t&-t) c[t]++;
}
int query(int t)
{LL ret=0;for(;t;t-=t&-t) ret+=c[t];return ret;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);for(int i=1;i<=n;i++){pt1[i]+=query(a[i]-1);pt2[i]+=query(n)-query(a[i]);add(a[i]);}memset(c,0,sizeof(c));for(int i=n;i>=1;i--){ans1+=pt1[i]*query(a[i]-1);ans2+=pt2[i]*(query(n)-query(a[i]));add(a[i]);}printf("%lld %lld",ans2,ans1);return 0;
}
T2:问题 B: 队伍调整
题目描述
有n个人(每个人有一个唯一的编号,用1~n之间的整数表示)在一个水龙头前排队准备接水,现在第x个人有特殊情况离开了队伍,求第x个人离开队伍后的排队情况。
输入
第一行1个正整数n,表示有n个人,2<n≤ 100。
第二行包含n个正整数,之间用一个空格隔开,表示排在队伍中的第1个到第n个人的编号。
第三行包含1个正整数x,表示第x个人离开队伍,1≤x≤n。
输出
一行包含n-1个正整数,之间用一个空格隔开,表示第x个人离开队伍后的排队情况。
样例输入
7
7 2 3 4 5 6 1
3
样例输出
7 2 4 5 6 1
题解
这道题……用数组存一下排队序,在从头扫一遍,遇到第x个人就continue不就完了?事实上当我看到水龙头我还吓了半拍……
参考代码
#include<cstdio>
using namespace std;
int n,a[2000],x;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);scanf("%d",&x);for(int i=1;i<=n;i++){if(i!=x) printf("%d ",a[i]);}return 0;
}
T3:问题 C: 铺地毯
题目描述
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看作是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n张地毯,编号从1~n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和4个顶点上的点也算被地毯覆盖。
输入
第1行一个正整数n,表示总共有n张地毯。
接下来的n行中,第i+1行表示编号i的地毯信息,包含4个正整数a、b、g、k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角坐标(a,b)以及地毯在x轴和y轴方向的长度。
第n+2行包含两个正整数x和y,表示所求的地面的点的坐标(x,y)。
输出
输出一行一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖,则输出-1。
样例输入
3
1 0 2 3
0 2 3 3
2 1 3 3
2 2
样例输出
3
提示
【样例解释】
如图5.8- 1,1号地毯用实线表示,2号地毯用虚线表示,号用双实线表示,覆盖点(2,2)的最上面一张地毯是3号地毯。
【数据规模】
对于30%的数据满足:n<2。
对于50%的数据满足:0≤a,b,g,k≤100。
对于100%的数据满足:0≤n≤10000,0≤a,b,g,k≤100000。
题解
对于这道题,你觉得简单就简单,觉得难就难。有些人一遍A,有些人(比如我)WA10次。
!!一定要读完题!!题中给的是左下角的坐标和x、y轴方向的扩展长度。因此:拿个结构体保存所有地毯的信息,然后从头开始判断地毯是否覆盖该点,最后也是最重要的一点,输出的不是有多少地毯覆盖,而是最上面的地毯编号(整个人都不好了~)。
参考代码
#include<cstdio>
using namespace std;
struct node
{int x1,x2,y1,y2;
}a[200000];
int n,ans;
int x,y;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);scanf("%d%d",&x,&y);ans=-1;for(int i=1;i<=n;i++){if((x>=a[i].x1)&&(x<=a[i].x1+a[i].x2)&&(y>=a[i].y1)&&(y<=a[i].y2+a[i].y1))ans=i;}printf("%d",ans);return 0;
}
T4:问题 D: 赛车
题目描述
有n辆赛车,从各不相同的位置出发,以各种速度开始往右行驶,不断有超车现象发生,如下图所示。
給定n辆赛车的出发位置Xi与速度Vi,请输出超车事件的总数,以及依序列出最早发生的超车事件。
若有两个超车事件同時发生,请先输出超车位置数值较小的。
为了怕危险,测试数据里面不会有两个超车事件同时同地发生。
输入
第一行有一个正整数N (0< N <=250,000)
第二行开始有N行,每列包含两个整数Xi和Vi代表第i辆车的初始位置与速度。(0<=Xi<=1,000,000,0<Vi<=100)
输出
第一行请输出超车事件总数除以1,000,000的余数。
第二行开始请依序输出超车事件。若全体的超车事件超过10,000个,那么只要输出前10,000个超车事件即可。
每一个超车事件可以用两个数字表示i, j,代表i超越j。
样例输入
4 0 2 2 1 3 8 6 3
样例输出
2 3 4 1 2
题解
由于这道题我怎么改都只有75分,所以只分享一下思路。首先是第一小问,求超车数。对于这个我们可以维护一个树状数组,存的是速度。如果有车路程在前面,速度却不及,那么就会被超。因为数据很大,因此注意在树状数组里面也要取模。对于第二问,维护一个优先队列,以时间为关键字。现在来看如何保证能不重不漏。首先按照路程排序,如果两个车位置相邻并且后面那车的速度大于前面的(意味着能超车),那么对于后面那个车而言,前面那个车可能就是它第一个超的车。因此先把所有相邻的满足条件的入队。然后必然第一个超车在队中。现在来看如何更新。如果有2车相遇,那么在宏观上路程的排名会发生变化,然后变化后的后面那个车可能被前面的车再次超,因此把这个过程入队;同理,超了车的车也可能再次超它前面的第一辆车(前提是后面车的速度大于前面车的速度,否则没必要),因此在统计答案的同时加以更新,再记一个数tot,当达到10000或者队列为空时退出即可。
9.16 a.m.小结相关推荐
- Linux命令行与shell脚本编程大全:第2版
<Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...
- Android开发权威指南(第2版)新书发布
<Android 开发权威指南(第二版)>是畅销书<Android开发权威指南>的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45 章精彩内容供 ...
- python django web典型模块开发实战下载_Django实战 Python Web典型模块与项目开发
本书结合样例,介绍 Django 的基础知识.主要模块的开发以及权限管理等高级内容,并且通过图书管理系统.博客系统.车费管理系统 3 个项目的开发实战,使读者既能掌握 Django 的重要开发技术,又 ...
- 霸榜18年,作者连续20年获得微软MVP,这本SQL书凭什么成为畅销经典
说到 SQL ,大多数人都不陌生,不管你是 Java .C++ 还是 .NET 开发人员,工作中你都要编写 SQL 查询.由于数据库是现代 Java 或者 Web 应用程序中不可或缺的组成部分,拥有良 ...
- 《深入理解Oracle 12c数据库管理(第二版)》PDF
一:下载获取位置: 二:本书图样: 三:本书目录: 图书目录: 第1章 安装Oracle 1.1 了解OFA 1.1.1 Oracle清单目录 1.1.2 Oracle基础目录 1.1.3 Oracl ...
- 赠书:一本书揭开 Spring Boot 技术内幕
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 新书速递 经过几年的发展,Spring Boot几乎已成 ...
- mysql猎豹_猎豹网校MySQL数据库
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 猎豹网校MySQL数据库 链接:http://pan.baidu.com/s/1i3wyPjn 密码:qxhm 教程目录 第1章 了解SQL 1.1 数据 ...
- python快速入门第3版 数据_Python 快速入门 第3版
第 一部分 开始篇 第 1章 关于Python 3 1.1 用Python的理由 3 1.2 Python的长处 3 1.2.1 Python易于使用 4 1.2.2 Python富有表现力 4 1. ...
- python爬虫教程pdf-《Python爬虫开发与项目实战》pdf完整版
[实例简介] [实例截图] [核心代码] 目录 前言 基础篇 第1章 回顾Python编程2 1.1 安装Python2 1.1.1 Windows上安装Python2 1.1.2 Ubuntu上的P ...
最新文章
- oracle10g- emctl start dbconsole 启动问题
- Linux学习之系统编程篇:死锁的情形及其解决
- spring配置详解-复杂类型注入
- hiveserver或者hive启动出现Expected authority at index 7问题解决
- 征服 Ajax 应用程序的安全威胁
- 微信小程序,电子商城中快速实现收货地址(包含前端和后台实现)
- Thinkpad E40黑苹果驱动
- 手机java应用安装失败_解决OPPO手机在Android studio 环境下安装失败问题
- windows修改mysql密码
- java实现验证码时效,JAVA实现验证码
- (1)大数据和应用场景介绍
- 运营商精准大数据——主动出击 精准获客_客户_实时数据
- 上海亚商投顾:创业板指高开高走 ChatGPT概念卷土重来
- 自动化测试面试题及答案大全(5)
- 关于LINUX系统netterm终端登陆乱码问题。
- 抖音APP缓存提取token
- 子盒子在父盒子中水平垂直居中
- 电脑与云服务器传输文件,电脑与云服务器传输文件
- 菜鸟教程python3 mysql_Python3 MySQL 数据库连接 | 菜鸟教程
- GCC后端及汇编发布(8)
热门文章
- 图形学(4)多边形的扫描转换(上)
- 前端开发的 学php吗,web前端开发难学吗
- 如何成为一名合格的Apache项目Committer,参与Apache开源贡献的正确姿势
- 烽火华为4.2 亿元联合中标武汉地铁云....
- (图)Eee PC 904 HD闪亮登场!
- 计算机绩点3.2算什么水平,绩点3.3代表什么水平
- SpringBoot Zxing _ Java 生成二维码(可内嵌图片)
- 服务器w7系统,w7系统的云服务器
- 电路中的 电源 与 接地 的理解
- 在计算机找不到资源管理器,XP资源管理器里找不到文件夹选项的解决方法