首页 > 其他分享 >[考试记录] 2024.11.12 noip模拟赛11

[考试记录] 2024.11.12 noip模拟赛11

时间:2024-11-12 19:07:47浏览次数:1  
标签:11 ch noip int pos 队列 12 ans id

T1

使用 \(bfs\) 记录走到 \(tx,ty\) 的路径的横边和竖边的数量,然后取 \(\max\)。这里取 \(\max\) 的原因是,找到的路径必须是最短路,当 \(k\) 取的小的时候竖边就会变多,所以这条路径就不一定是最短路了。

#include<bits/stdc++.h>
using namespace std;
#define p pair<int, int>
int n, m, sx, sy, tx, ty;
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
bitset<105> mp[105], vis[105];
double s;
struct node{ int x, y, w, h; };
queue<node> q;
vector<p> vec;
int main(){
	freopen("msg.in", "r", stdin); freopen("msg.out", "w", stdout);
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin>>n>>m>>sx>>sy>>tx>>ty;
	for(int i=1, x; i<=n; ++i) for(int j=1; j<=m; ++j)
		cin>>x, mp[i][j] = x;
	cin>>s;
	q.emplace(node{sx, sy, 0, 0});
	while(!q.empty()){
		auto t = q.front(); q.pop();
		int ux = t.x, uy = t.y;
		vis[ux][uy] = 1;
		for(int i=0; i<4; ++i){
			int vx = ux + dir[i][0], vy = uy + dir[i][1];
			if(vx < 1 || vy < 1 || vx > n || vy > m || mp[vx][vy] || vis[vx][vy]) continue;
			int tmpw = t.w, tmph = t.h;
			dir[i][0] ? ++tmph : ++tmpw;
			if(vx == tx && vy == ty){
				vec.emplace_back(p{tmpw, tmph});
				continue;
			} vis[vx][vy] = 1;
			q.emplace(node{vx, vy, tmpw, tmph});
		}
	} double ans = 0.0;
	for(auto it : vec){
		int w = it.first, h = it.second;
		if(w * 1.0 > s) continue;
		ans = max(ans, 1.0 * (s - 1.0 * w) / h);
	} return cout<<fixed<<setprecision(3)<<ans, 0;
}

T3 摸鱼军训

考虑每一次冒泡都会把一个大数提到序列最后面,那么相应地就会有较小的数向前移动。那么就可以大致描述某一个数的移动过程:先向前走一段,再向后走一段。显然有每个数向前走的距离为这个数前面比它大的数的数量,称为 \(lm_i\),如果查询的 \(k\) 要小于等于 \(lm_i\),那么答案即为 \(pos_i-k\)。

对于向后走的一段,考虑使用一个队列来更直观的维护这个东西。每一次冒泡之前都将向前走走完的数加到队列中去,这个队列一定是单调递增的。对于如下队列:(中间加点是为了凸显在原数列中的位置)

\[4 \dots5\dots6\dots7 \]

那么下一次冒泡,序列变化如下:

\[\begin{split} 4 \dots5\dots6\dots7\\\ \dots4\dots5\dots67\\ \dots4\dots567 \end{split} \]

可以发现的是每一次冒泡,队列里的每一个数,都会移动到它的下一个数的屁股后面。又因为队列里的数的顺序是按照向前移动完的时间加进去的,那么比 \(x\) 大的数一定会先加入队列中。那么对于第一次移动,\(x\)会移动到 第一个大于它的数 \(y\) 的屁股后面,也就是 \(pos_y-1\),第二次移动时,\(y\) 会移动到 \(z\) 的屁股后面,所以 \(pos_y=pos_z-1\),然后 \(x\) 移动到 \(y\) 的后面 \(pos_x=pos_y-1=pos_z-2\)。规律显然。对于第 \(k\) 次移动,在队列里第 \(k\) 个的数的位置为 \(pos_k\),那么答案即为 \(pos_k-k\)。又因为在队列里比他靠前的数只能是比它大的数,那么就在原序列里找从左往右数第 \(k\) 个大于它的数的 \(pos\) 即可。

#include<bits/stdc++.h>
using namespace std;
constexpr int B = 1<<20;
char buf[B], *p1 = buf, *p2 = buf, obuf[B], *O = obuf;
#define gt() (p1==p2 && (p2=(p1=buf)+fread(buf, 1, B, stdin), p1==p2) ? EOF : *p1++)
template <typename T> inline void rd(T &x){
	x = 0; int f = 0; char ch = gt();
	for(; !isdigit(ch); ch = gt()) f ^= ch == '-';
	for(; isdigit(ch); ch = gt()) x = (x<<1) + (x<<3) + (ch^48);
	x = f ? -x : x;
}
template <typename T, typename ...TT> inline void rd(T &x, TT &...xx){ rd(x), rd(xx...); }
#define pt(ch) (O-obuf==B && (fwrite(obuf, 1, B, stdout), O=obuf), *O++ = (ch))
template <typename T> inline void wt(T x){
	if(x > 9) wt(x / 10); pt(x % 10 ^ 48);
}
#define fw fwrite(obuf, 1, O - obuf, stdout)
#define p pair<int, int>
constexpr int N = 5e5 + 5;
int n, q, a[N], ans[N], pos[N], lm[N];
vector<p> Q[N];
namespace BIT{
	#define lb(x) ((x) & (-x))
	int t[N];
	inline void add(int pos, int val){
		for(; pos<=n; pos+=lb(pos)) t[pos] += val;
	}
	inline int query(int pos){
		int res = 0;
		for(; pos>0; pos-=lb(pos)) res += t[pos];
		return res;
	}
}
namespace ST{
	#define ls (id << 1)
	#define rs (id << 1 | 1)
	struct node{ int l, r, sum; }t[N<<2];
	inline void build(int id, int l, int r){
		t[id] = node{l, r, 0};
		if(l == r) return;
		int mid = (l + r) >> 1;
		build(ls, l, mid), build(rs, mid+1, r);
	}
	inline void modify(int id, int pos){
		if(t[id].l == t[id].r) return t[id].sum = 1, void();
		int mid = (t[id].l + t[id].r) >> 1;
		modify((pos <= mid) ? ls : rs, pos);
		t[id].sum = t[ls].sum + t[rs].sum;
	}
	inline int query(int id, int val){
		if(t[id].l == t[id].r) return t[id].l;
		int mid = (t[id].l + t[id].r) >> 1;
		if(t[ls].sum >= val) return query(ls, val);
		return query(rs, val-t[ls].sum);
	}
}
int main(){
	freopen("bubble.in", "r", stdin); freopen("bubble.out", "w", stdout);
	rd(n); for(int i=1; i<=n; ++i){
		rd(a[i]), BIT::add(a[i], 1);
		lm[a[i]] = i - BIT::query(a[i]);
		pos[a[i]] = i;
	}
	rd(q); for(int i=1, k, x; i<=q; ++i){
		rd(k, x);
		if(lm[x] >= k) ans[i] = pos[x] - k;
		else if(n - x < k) ans[i] = x;
		else Q[x].emplace_back(p{k, i});
	}
	ST::build(1, 1, n);
	for(int i=n; i>=1; --i){
		for(auto it : Q[i]){
			int ps = ST::query(1, it.first);
			ans[it.second] = ps - it.first;
		} ST::modify(1, pos[i]);
	}
	for(int i=1; i<=q; ++i) wt(ans[i]), pt(10);
	return fw, 0;
}

标签:11,ch,noip,int,pos,队列,12,ans,id
From: https://www.cnblogs.com/xiaolemc/p/18542463

相关文章

  • 2024/11/12日 日志 关于Servlet ---- Request(请求)& Response(响应) 的补充
    Request(请求)&Response(响应)--·Request:获取请求数据--·Response:设置响应数据Request点击查看代码--Request继承体系--ServletRequestJava提供的请求对象根接口--HttpServletRequestJava提供的对Http协议封装的请求对象接口--RequestFacade......
  • 2024.11.12 1842版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 20241112 模拟赛总结
    期望得分:100+100+0+10=210实际得分:100+80+0+10=190好困。。T1被硬控了很久。看着就像诈骗题,观察大样例发,答案就是\(a_1-a_2\),特判\(n=1\)的情况。证明的话,感觉就是后面的数,贡献成正数和负数应该是数量相同的,所以就抵消了,第一个数只能贡献成正数,第二个数只能贡献成负的。T......
  • Linux(11)——守护进程
    目录一、daemon:二、systemd:三、服务单元:1、单元类型:2、systemctl:3、依赖关系:4、屏蔽与取消屏蔽:一、daemon:        守护进程daemon是在后台运行或等待的进程,以执行不同的任。通常daemon在系统启动时运行,直到关机时才结束运行。二、systemd: ......
  • 【PAT_Python解】1125 子串与子列
    原题链接:PTA|程序设计类实验辅助教学平台Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!测试点5超时:defmin_window_substring(s,p):len1=len(s)len2=len(p)mixn=0min_length=len1+1#设置为一个较大的值......
  • debian11 使用python3 启动http文件服务器和ftp服务器脚本
    http文件服务器start_http_server.sh#!/bin/bashport=$1host=0.0.0.0functionUsage(){echo-e"Usage:${0}[port]"exit0}if[[${port}==""]];thenUsagefi#检查端口号是否被占用check_port=`netstat-ant|grepLISTEN|grep${port}......
  • Go 语言已立足主流,编程语言排行榜24 年 11 月
    Go语言概述Go语言,简称Golang,是由Google的RobertGriesemer、RobPike和KenThompson在2007年设计,并于2009年11月正式宣布推出的静态类型、编译型开源编程语言。Go语言以其提高编程效率、软件构建速度和运行时性能的设计目标,以及简洁的语法、快速的编译速度和出色的并发处理能......
  • 20241103
    待看1.https://blog.csdn.net/m0_62825058/article/details/137987431针对图形推理:三级判断模式+大量题库两者缺一不可。三级判断模式:1、专题类型,每一种类型的已有考法,已经可以覆盖大部分。(背后的思想是出题人出题形式的惯性)2、点,线、图、面、角,最小的元素,传统的那张图......
  • 2024.11.12随笔&联考总结
    前言心情不好,因为考试时T2T3全看错题了,导致T2没做出来,T3一份没得。然后下午打球眼镜架子坏了,回机房才发现被高二的盒了。但还是稍微写一下总结吧。总结感觉我今天做题状态还行,思路该想的都想到了。只不过我读题不仔细,主要去看完样例。然后题目中加粗加黑的字体没有注意,导......
  • 2024.11.12 1703版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......