2019.10.25 csp-s模拟测试87 反思总结
一次非常神奇的考试,考完试以后看着T2的0pts突然笑死我自己
太智障了这什么神奇的题意理解错误23333
T1一眼分类讨论,两眼二分,觉得分类讨论有点玄学但是出题人八成不会卡【何】,然后本着对二分的恐惧打了玄学
关于T2,我没了 豹笑 我没想到一只鸟可能被打两枪你敢信
T3?今天有T3?
T1:
正解是显而易见的二分。然而我比较懒,又经常在二分上炸掉【写得比较丑】,而且第一眼其实并不是二分。
如果k最后小于1,那么相对于原来1个单位时间的移动来说,肯定这种上下移动的步数越多越好。先dfs一次,跑出从起点到终点上下移动步数最多的最短路,然后计算出对应的k。如果这个k解出来大于1,就再跑一次使左右移动步数最多的最短路,再次解出k。这样可以保证选取这个k的同时,跑的一定是最短路。
其实总是隐约不太放心,感觉可能有锅XD然而最后A了
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int n,m,sx,sy,tx,ty;
int a[][],vis[][];
int h[]={,-,,};
int l[]={-,,,};
double s;
struct node{
int x,y,tmp,dis;
bool operator < (const node a) const {
return tmp < a.tmp;
}
};
priority_queue<pair<int,node> >q;
node dfs1(){
node u;
u.x=sx,u.y=sy,u.tmp=;
q.push(make_pair(,u));
while(!q.empty()){
while(q.size()&&vis[q.top().second.x][q.top().second.y])q.pop();
if(!q.size())break;
int d=-q.top().first;
node x=q.top().second;
q.pop();
vis[x.x][x.y]=;
if(x.x==tx&&x.y==ty){
x.dis=d;
return x;
}
for(int i=;i<;i++){
node y=x;
y.x+=h[i],y.y+=l[i];
if(y.x>&&y.x<=n&&y.y>&&y.y<=m&&!a[y.x][y.y]){
if(i==||i==)y.tmp++;
q.push(make_pair(-(d+),y));
}
}
}
}
node dfs2(){
node u;
u.x=sx,u.y=sy,u.tmp=;
while(!q.empty())q.pop();
memset(vis,,sizeof(vis));
q.push(make_pair(,u));
while(!q.empty()){
while(q.size()&&vis[q.top().second.x][q.top().second.y])q.pop();
if(!q.size())break;
int d=-q.top().first;
node x=q.top().second;
q.pop();
vis[x.x][x.y]=;
if(x.x==tx&&x.y==ty){
x.dis=d;
return x;
}
for(int i=;i<;i++){
node y=x;
y.x+=h[i],y.y+=l[i];
if(y.x>&&y.x<=n&&y.y>&&y.y<=m&&!a[y.x][y.y]){
if(i==||i==)y.tmp++;
q.push(make_pair(-(d+),y));
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%lf",&s);
node b=dfs1();
double k=(1.0*s-1.0*b.dis+1.0*b.tmp)/(1.0*b.tmp);//tmp上下,dis-tmp左右
if(k<)printf("%.3lf",k);
else{
b=dfs2();
k=(1.0*s-1.0*b.tmp)/(1.0*(b.dis-b.tmp));//tmp左右,dis-tmp上下
printf("%.3lf",k);
}
return ;
}
T2:
什么?一只鸟有可能被打两次……?是你R光速换弹还是我鲲化而为鹏……?
咳咳,不是不是,其实真的挺智障的,居然没想到一只鸟所占的区间可能会长于换弹时间…老实说,考试的时候还是不太认真XD
发现一只鸟可能被打两次以后,就要考虑重复的问题。把区间排序以后扔进队列可以解决当前时间的区间覆盖数目。
然后要从0~i-k选出一个去掉重复个数的f[j]进行转移。选取最大的f值以及对重复个数的修改都可以利用线段树完成。线段树以时间为下标,储存f[i]-(同时覆盖i与当前时间的区间个数)。维护方式是,根据前面的队列,当有新的区间的l覆盖了当前时间而入队时,使得l到r这一段区间-1,含义是这一段对于当前时间多了一个重复区间。而一段队列里的区间的r小于当前时间出队时,再把对应的l到r这一段+1,这一个区间不再重复了。
从0扫到max,max是最大的r。ans即为最大的(根据当前时间i查询的线段树中0->i-k中最大值+当前时间点的区间覆盖数量【队列size】)。
要注意各处l或r小于0的区间的处理。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int n,k,top=,ans,sum,maxx;
struct node{
int l,r;
bool operator < (const node x)const{
return l==x.l?r<x.r:l<x.l;
}
}a[];
priority_queue<pair<int,node> >q;
struct tree{
int l,r,maxx,tag;
}b[*];
void pushdown(int p){
if(b[p].tag){
b[p*].tag+=b[p].tag;
b[p*].maxx+=b[p].tag;
b[p*+].tag+=b[p].tag;
b[p*+].maxx+=b[p].tag;
b[p].tag=;
}
}
void pushup(int p){
b[p].maxx=max(b[p*].maxx,b[p*+].maxx);
}
void build(int p,int l,int r){
b[p].l=l,b[p].r=r;
b[p].maxx=b[p].tag=;
if(l==r)return;
int mid=(l+r)/;
build(p*,l,mid);
build(p*+,mid+,r);
}
void change(int p,int l,int r,int y){
if(l<=b[p].l&&b[p].r<=r){
b[p].maxx+=y;
b[p].tag+=y;
return;
}
pushdown(p);
int mid=(b[p].l+b[p].r)/;
if(l<=mid)change(p*,l,r,y);
if(r>mid)change(p*+,l,r,y);
pushup(p);
}
void update(int p,int l,int r,int y){
if(l<=b[p].l&&b[p].r<=r){
b[p].maxx=y;
b[p].tag=;
return;
}
pushdown(p);
int mid=(b[p].l+b[p].r)/;
if(l<=mid)update(p*,l,r,y);
if(r>mid)update(p*+,l,r,y);
pushup(p);
}
int ask(int p,int l,int r){
if(l<=b[p].l&&b[p].r<=r){
return b[p].maxx;
}
pushdown(p);
int mid=(b[p].l+b[p].r)/;
int val=;
if(l<=mid)val=max(val,ask(p*,l,r));
if(r>mid)val=max(val,ask(p*+,l,r));
pushup(p);
return val;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%d%d",&a[i].l,&a[i].r);
maxx=max(maxx,a[i].r);
}
sort(a+,a+n+);
build(,,maxx);
for(int i=;i<=maxx;i++){
while(a[top].l<=i&&top<=n){
if(a[top].r<){
top++;
continue;
}
q.push(make_pair(-a[top].r,a[top]));
change(,max(,a[top].l),a[top].r,-);
top++;
}
while(q.top().second.r<i&&q.size()){
change(,max(,q.top().second.l),q.top().second.r,+);
q.pop();
}
if(i>=k)sum=ask(,,i-k);
update(,i,i,sum);
ans=max(ans,sum+(int)q.size());
}
printf("%d\n",ans);
return ;
}
蠢出一定程度了…线段树写错+队列没考虑l的入队顺序不一定是r的出队顺序于是没写优先队列…改了挺长时间的
T3:
咕 咕咕咕 咕咕咕咕【飞了】
今天发现各处弥漫着稍许颓废的气息
可能是 秋天到了吧【何】
2019.10.25 csp-s模拟测试87 反思总结的更多相关文章
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- csp-s模拟测试87
csp-s模拟测试87 考场状态还可以$T1$我当时以为我秒切,$T2$确认自己思路不对后毅然决然码上,$T3$暴力挂了太可惜了. 03:01:28 03:16:07 03:11:38 140 03: ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
- 2019.8.9 NOIP模拟测试15 反思总结
日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
- 2019.10.25 csp-s模拟测试86 反思总结
继续存档 早上来补了一下昨天的题,不过肯定这两天的没法完全补起来 T1: 经典思路:关于位运算的题讨论每一位的贡献 #include<iostream> #include<cstdi ...
- 2019/10/17 CSP模拟 总结
T1 补票 Ticket 没什么好说的,不讲了 T2 删数字 Number 很后悔的是其实考场上不仅想出了正解的方程,甚至连优化都想到了,却因为码力不足只打了\(O(n^2)\)暴力,甚至还因为细节挂 ...
随机推荐
- POJ 2187 /// 凸包入门 旋转卡壳
题目大意: 求最远点对距离 求凸包上的最远点对 挑战263页 #include <cstdio> #include <string.h> #include <algori ...
- Echarts——更改仪表盘方向和颜色
做小项目需要用到仪表盘,官方给出的颜色设置如下: 而我想要如下样式的: 最后,经过一番折腾算是搞成了如下样式效果: 要达到上面效果关键在于设置Echarts的如下两处js代码: 1.大小值要颠倒,因为 ...
- java_新特性未整理
得到的.className method.isAnnotationPresent:判断是否有指定的注解,注解.class method.invoke:执行 */}
- Ubuntu环境下安装Scala以及安装IntelliJ Scala插件(Plugin)
一.Scala介绍 1.结合Spark处理大数据 这是Scala的一个主要应用,而且Spark也是那Scala写的. 2.Java的脚本语言版 可以直接写Scala的脚本,也可以在.sh直接使用Sc ...
- ASCII专用测试字符串
这段是废话: 在很多时候不同语言所写的不同终端中 经常会有字符串转码的问题 常用一下字符串测试不同终端的输出可以快速匹配和修改默认转码 正文: !""""#$% ...
- Android开发 使用SparseArray代替HashMap[转载]
源作者:Android小Y链接:https://www.jianshu.com/p/1828f14d7955来源:简书 前言 Android开发中,一个好的应用,除了要有吸引人的功能和交互之外,在性能 ...
- Stopwatch 计时器类
C#_Stopwatch 类 命名空间:System.Diagnostics Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.在典型的 Stopwatc ...
- AutoIt自动化编程(2)【转】
注意:窗口标题和窗口文本参数总是对大小写敏感的. 1.等待窗口系列命令/函数 AHK和AU3都提供了用法类似的一组窗口等待命令/函数:WinWait/WinWaitActive/WinWaitClos ...
- tip:删除数组中的undefined
this.checkedImg = this.checkedImg.filter(Boolean)
- 在 Node.js 中引入模块:你所需要知道的一切都在这里
本文作者:Jacob Beltran 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58eaf471a58c240ae35bb ...