【CF1179 A,B,C】Valeriy and Deque / Tolik and His Uncle / Serge and Dining Room

还好题很温柔,温柔得我差点没做完
在这里插入图片描述

文章目录

  • A:Valeriy and Deque
  • 题意
  • 题解
  • 代码实现
  • B:Tolik and His Uncle
  • 题目
  • 题解
  • 代码实现
  • C:Serge and Dining Room
  • 题目
  • 题解
  • 代码实现

A:Valeriy and Deque

题意

给定一个双端队列,然后给定一个operation,每一个operation可以实现以下步骤:
1.取出队列的前两个元素,分别是A,B。
2.如果A>B,那么A加入到这个队列的front,B加入到back,否则A加入back,B加入front。然后给你q个询问,每一个询问是问你从原始数组开始执行第x次operation时,A和B分别是多少?
(2≤n≤10^5, 0≤q≤3⋅10^5) (0≤ai≤10^9)( 1≤mj≤10^18)

输入输出样例
输入
5 3
1 2 3 4 5
1
2
10
输出
1 2
2 3
5 2
输入
2 0
0 0
输出

说明/提示
Consider all 10 steps for the first test in detail:2. [1, 2, 3, 4, 5] — on the first operation, A and B are 1 and 2 , respectively.So, 2 we write to the beginning of the deque, and 1 — to the end.
We get the following status of the deque: [2, 3, 4, 5, 1] . 3. [2, 3, 4, 5, 1] ⇒A=2,B=3 . 4.[3,4,5,1,2] 5. [4, 5, 1, 2, 3] 6. [5, 1, 2, 3, 4] 7. [5, 2, 3, 4, 1] 8. [5,3,4,1,2] 9. [5, 4, 1, 2, 3] 10. [5, 1, 2, 3, 4] 11. [5, 2, 3, 4, 1]⇒A=5,B=2 .

题解

这个q这么大,我们就不可能每一次都去重新模拟,肯定超时
那我们就来思考A,B之间的操作

显而易见当我们循环模拟到了a数组的最大值的时候
由于没有任何数大于它,那么它就会开始霸占整个队列的front

而在这个时候,就开始了一个n-1的循环节,
每一次队列的第二个都会乖乖的跑到队列的最后等待被翻牌
在这里插入图片描述
这个时候我们就没有必要一次又一次的重复这个n-1的固定循环,
可以用一个取模来进行操作,
而从头开始模拟时未处理到Max的时候,单独处理一下就可以了

最坏的情况就是Max在最后面n,一个for便OK,
我们的查询用O(1)完成
所以时间复杂度就是O(q)

代码实现

#include <cstdio>
#include <queue>
using namespace std;
#define LL long long
#define MAXN 100005
struct node {int head, tail;
}change[MAXN];
int circle[MAXN];
deque < int > deq;
int n, q, Max, idx;
long long m;
int main() {scanf ( "%d %d", &n, &q );for ( int i = 1;i <= n;i ++ ) {int x;scanf ( "%d", &x );deq.push_back ( x );if ( x > Max ) {Max = x;idx = i;}}for ( int i = 1;i <= idx;i ++ ) {int A = deq.front();deq.pop_front();int B = deq.front();deq.pop_front();change[i].head = A;change[i].tail = B;if ( A > B ) {deq.push_front( A );deq.push_back ( B );}else {deq.push_front( B );deq.push_back ( A );}}for ( int i = 0;i < n - 1;i ++ ) {circle[i] = deq.back ();int A = deq.front();deq.pop_front();int B = deq.front();deq.pop_front();deq.push_front( A );deq.push_back ( B );}for ( int i = 1;i <= q;i ++ ) {scanf ( "%lld", &m );if ( m <= idx )printf ( "%d %d\n", change[m].head, change[m].tail );elseprintf ( "%d %d\n", Max, circle[( m - idx ) % ( n - 1 )] );}return 0;
}

B:Tolik and His Uncle

题目

你有一个n行m列的棋盘,其中第i行第j列的格子标号为(i,j)。你需要从(1,1)开始遍历这个棋盘。每一次,如果你在(x,y),你可以选择一个向量(dx,dy),并且移动到(x+dx,y+dy)这个格子上。
你不能离开这个棋盘,同时每一个向量只能使用一次。你的任务是合理安排自己的行走路线,使得每一个格子都只被经过一次。输出这个方案。
n, m ( 1≤n⋅m≤10^6)

输入输出样例
输入
2 3
输出
1 1
1 3
1 2
2 2
2 3
2 1
输入
1 1
输出
1 1
说明/提示

The vectors from the first example in the order of making jumps are (0, 2), (0, -1), (1, 0), (0, 1), (0, -2) .

题解

向量不一样的意思是dx,dy不能同时一样,
如:我用过1,1,就不能再用,但是可以用1,2或者3,1

我们先来思考只有一行的情况
那么肯定可以(1,1)=>(1,m)=>(1,2)=>(1,m-1)…每一次dy都在减小而且还分了正负
我们再来思考只有一列的情况,类比行
肯定也可以(1,1)=>(n,1)=>(2,1)=>(n-1,1)…每一次dx都在减小而且也分了正负

那么二维又有行又有列,怎么办呢?
在这里插入图片描述
我们就行列一起跳呗!先循环行,列跳完后,行再往中间移动
(1,1)=>(n,m)=>(1,2)=>(n,m-1)…=>(1,m)=>(n,1)=>(2,1)=>(n-1,m)…

最后特别判断n为奇数,m为奇数的情况即可

代码实现

这道题就是找到了方法直接暴力就可以了
代码可以长得五花八门
我就对自己的代码很不满意,有点丑!
但是是自己打的,能怎么办呢?跪着也要宠下去麻痹自己其实写得还不错 !
在这里插入图片描述

#include <cstdio>
int n, m, cnt;
void dfs ( int x, int y ) {cnt ++;if ( y > m ) return;printf ( "%d %d\n", x, y );if ( cnt % 2 )dfs ( n - x + 1, m - y + 1 );elsedfs ( n - x + 1, m - y + 2 ); 
}
int main() {scanf ( "%d %d", &n, &m );for ( int i = 1;i <= ( n >> 1 );i ++ ) {cnt = 0;dfs ( i, 1 );}if ( n % 2 ) {for ( int i = 1;i <= ( m >> 1 );i ++ )printf ( "%d %d\n%d %d\n", ( n + 1 ) >> 1, i, ( n + 1 ) >> 1, m - i + 1 );if ( m % 2 ) printf ( "%d %d\n", ( n + 1 ) >> 1, ( m + 1 ) >> 1 );}return 0;
}

C:Serge and Dining Room

题目

给你n个物品(每个物品一个)的价格和m个现在依次排在队里的人手上的钱,每个人都会尽可能把钱用完去买一样东西,即买当前物品中能买的价值最高的,不能买就不买走人,问m个人排完之后剩下的价值最高的物品价格是多少。
有q次操作,输入操作方案
1.如果是1,输入i,x,把ai变成x,i≤n
2.如果是2,输入i,x,把bi变成x 1≤i≤m
( 1≤n,m≤300000 )(1≤ai, bi≤10^6) (1≤q≤300000 ) ( 1≤x≤10^6)

题解

如果在更改某个值后发现,ai<aj但是ai选的菜bi>aj选的菜bj,那么肯定要交换
换过去换过来,你会发现下标早已经打乱,所以我们就不需要考虑用下标来做
用什么呢?

题意一句话找到一个最大的x,
使得满足钱大于等于x的人的数量money要小于价格大于等于x的数量pirce
(好好理解!!)

我们可以让所有ai≥物品价格x的+1,而所有bi≥人手里钱数量y的-1,
因为我们把ai和bi用相同的东西一起处理的,所以区分一下+/-1,

为什么这么做呢?想想:
当我们加入ai的时候,所有小于等于ai的aj的money都应该+1
当我们加入bi的时候,所有小于等于bi的bj的price都应该+1
而上面说过,ai和bi使用同一个东西操作,那么bi+1就意味着ai-1,
所以我们才物品价格+1,钱数-1

而我们再操作ai的时候不知道整个数组有多少aj是≤ai的,也不知道bi的情况
而我们的操作却要把所有满足的都进行+/-1操作,那么怎么做呢?

这时就想到了线段直接来进行对于值维护修改,直接把1~x的所有值+/-1
如果i点+1就意味着后面有一道菜的价格大于等于ai,
-1则意味着后面有一个人的钱数大于等于ai
所以才有代码下面从1~ai修改
还不用超时,多好!再用lazy打标,优化一波!

代码实现

#include <cstdio>
#include <iostream>
using namespace std;
#define MAXN 300005
#define MAX 1000000
int n, m, q;
int opt, idx, ip;
int a[MAXN], b[MAXN];
int tree[MAX << 2];
int lazy[MAX << 2];
int maxval[MAX << 2];void push_down ( int num ) {if ( lazy[num] ) {lazy[num << 1] += lazy[num];lazy[num << 1 | 1] += lazy[num];maxval[num << 1] += lazy[num];maxval[num << 1 | 1] += lazy[num];lazy[num] = 0;}
}void update ( int l, int r, int L, int R, int num, int val ) {if ( L <= l && r <= R ) {lazy[num] += val;maxval[num] += val;return;}push_down ( num );int mid = ( l + r ) >> 1;if ( L <= mid ) update ( l, mid, L, R, num << 1, val );if ( mid < R ) update ( mid + 1, r, L, R, num << 1 | 1, val );maxval[num] = max ( maxval[num << 1], maxval[num << 1 | 1] );
}int query ( int l, int r, int num ) {if ( l == r ) return l;push_down ( num );int mid = ( l + r ) >> 1;if ( maxval[num << 1 | 1] > 0 ) return query ( mid + 1, r, num << 1 | 1 );return query ( l, mid, num << 1 );
}int main() {scanf ( "%d %d", &n, &m );for ( int i = 1;i <= n;i ++ ) {scanf ( "%d", &a[i] );update ( 1, MAX, 1, a[i], 1, 1 );}for ( int i = 1;i <= m;i ++ ) {scanf ( "%d", &b[i] );update ( 1, MAX, 1, b[i], 1, -1 );}scanf ( "%d", &q );for ( int i = 1;i <= q;i ++ ) {scanf ( "%d %d %d", &opt, &idx, &ip );if ( opt == 1 ) {update ( 1, MAX, 1, a[idx], 1, -1 );update ( 1, MAX, 1, ip, 1, +1 );a[idx] = ip;}else {update ( 1, MAX, 1, b[idx], 1, +1 );update ( 1, MAX, 1, ip, 1, -1 );b[idx] = ip;}if ( maxval[1] > 0 ) printf ( "%d\n", query ( 1, MAX, 1 ) );else printf ( "-1\n" );}return 0;
} 

好了,今天的题比较容易理解,仙女最近被几道ex至极的题给卡住了,
博客有点男鞋,不要急,慢慢来!有任何问题都可以留言!
不要太想小哥哥我~~
在这里插入图片描述

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

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

相关文章

YBTOJ:比赛得分(期望)

文章目录题目描述解析代码题目描述 解析 不太难的题 显然本题在AB队员大小关系相反时其对答案的贡献互为相反数。 所以想到把B队队员sort一下后就可以二分找到大小关系相反的分界点 然后维护和与平方和两个前缀数组搞一搞即可O1求出贡献 总复杂度&#xff1a;nlognnlognnlogn …

Matlab与高等数学

曲线与曲面画图 平面 对于不同曲线的表达式&#xff0c;Matlab中有不同的绘图命令&#xff0c;主要有 plot, fplot, ezplot&#xff0c;plot3&#xff0c;polar&#xff0c; 曲面 1.2 曲面画图 曲面的一般方程是F(x,y,z)0&#xff0c;一般需要将曲面的点坐标先表示出来&…

[USACO19JAN,Platinum] Redistricting

[USACO19JAN,Platinum] Redistricting 这道题A了才知道。。并不难a&#xff01; orz 题目 内存限制&#xff1a;128 MiB 时间限制&#xff1a;1000 ms 题目描述 奶牛们的最大城市Bovinopolis正在重新划分势力范围—生活在那里的主要是两个品种的奶牛&#xff08;Holsteins和…

.NET Core + JWT令牌认证 + Vue.js 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!...

DncZeus前言关于 DncZeusDncZeus Dnc Zeus"Dnc"--.Net Core 的缩写&#xff1b;"Zeus"--中文译为宙斯&#xff0c;是古希腊神话中的众神之王&#xff0c;奥林匹斯十二主神之首&#xff0c;统治宇宙万物的至高无上的主神&#xff08;在古希腊神话中主神专…

P5081 Tweetuzki爱取球(期望)(线性求逆元)

文章目录题目描述解析代码题目描述 解析 首先有一个很重要的引理&#xff1a; 若一件事做成的概率是p&#xff0c;则其做成需要次数的期望是1/p 为什么呢&#xff1f; 我们设做成这件事的期望次数是x 就可以列出方程&#xff1a; x1p∗0(1−p)∗xx1p*0(1-p)*xx1p∗0(1−p)∗x …

【 CF1186D,E,F】Vus the Cossack and Numbers/Vus the Cossack and a Field/Vus the Cossack and a Graph

太ex了&#xff0c;哭了哭了orz 后面两道平均一道花了我一天啊&#xff01; 文章目录D&#xff1a;Vus the Cossack and Numbers题意翻译题解代码实现E&#xff1a;Vus the Cossack and a Field题意翻译题解代码实现F:Vus the Cossack and a Graph题目暴力题解代码实现官方题解…

IdentityServer4与ocelot实现认证与客户端统一入口

关于IdentityServer4与ocelot博客园里已经有很多介绍我这里就不再重复了。ocelot与IdentityServer4组合认证博客园里也有很多&#xff0c;但大多使用ocelot内置的认证&#xff0c;而且大多都是用来认证API的&#xff0c;查找了很多资料也没看到如何认证oidc&#xff0c;所以这里…

YBTOJ:彩球抽取(期望)

文章目录题目描述解析代码题目描述 解析 首先&#xff0c;可以使用dp解决本题 设fi,j,k&#xff1a;操作i轮之后编号j的小球有k个的概率 转移和统计答案就都不难了 但是还有一个问题 不难发现这个题循环下去是可以无穷无尽的 所以限定一个i的上界&#xff08;如500000&#xf…

魔改森林

题意&#xff1a; 曾经有一道叫做迷雾森林的题目&#xff0c;然而牛牛认为地图中的障碍太多&#xff0c;实在是太难了&#xff0c;所以删去了很多点&#xff0c;出了这道题。 牛牛给出了一个n行m列的网格图 初始牛牛处在最左下角的格点上(n1,1)&#xff0c;终点在右上角的格点…

基于IdentityServer4 实现.NET Core的认证授权

IdentityServer4是什么&#xff1f;IdentityServer4是基于ASP.NET Core实现的认证和授权框架&#xff0c;是对OpenID Connect和OAuth 2.0协议的实现。OpenID Connect 和 OAuth2.0是什么OpenID Connect:OpenID Connect由OpenID基金会于2014年发布的一个开放标准, 是建立在OAuth …

[COCI 2018#5]Parametriziran

这道题呢&#xff01; 算了&#xff0c;不要让这玩意儿活着祸害众生吧&#xff01;让我们来拯救苍生于苦海之中&#xff01;&#xff01; 骚话连篇ing 题目 由小写英文字母和问号组成的字符串成为参数化单词&#xff08;例如&#xff1a;??cd,bcd,??&#xff09;。如果两…

P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

传送门 文章目录解析解析 很显然&#xff0c;让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题&#xff0c;其实第一感觉是bfs 但是状态数理论上最差可以达到815&#xff0c;&#xff08;当然基本不可能跑满&#xff09;&#xff…

NumSharp v0.6 科学计算库发布,新增 LAPACK 的线性库支持

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…

[COCI] Zamjena

连这种模拟题都能。。。orz ex&#xff0c;太恶心了&#xff01; 驰骋坑底这么久了&#xff0c;我明白了 开始吧&#xff01;我发誓&#xff0c;这个超级兵&#xff0c;我就算用小书包平A都要A了它 题目 Vlatko喜欢使用整数数组&#xff0c;他在一张纸上写下了两个数组&…

P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)

洛谷传送门 文章目录题目描述解析代码题目描述 解析 做三个hash 分一下正方形边长的奇偶性 然后枚举中心点&#xff0c;二分边长即可 有点类似模拟赛那道红十字的题 我一开始觉得分奇偶好麻烦啊 为什么不直接枚举左上方的点二分呢&#xff1f;awa 很遗憾的是… 那样答案就没有…

初赛—错题集

计算机基础知识 LAN&#xff1a;局域网&#xff0c;WAN&#xff1a;广域网&#xff0c;MAN&#xff1a;城域网 汇编语言是(依赖于具体计算机)的低级程序设计语言 计算机操作的最小时间单位是(时钟周期)。 注意所需空间需要 \(\div 8\) &#xff01;&#xff01;&#xff01;…

.NET Core 和 DevOps

关键要点无论你目前使用什么样的技术栈&#xff0c;DevOps 都是值得一试的。闭源、专有软件和构建过程与 DevOps 实践不兼容。.NET Core 是开源的&#xff0c;是基于 DevOps 构思和构建的。.NET Core CLI 和 Roslyn API 让整个交付流程变得更加开放&#xff0c;且具有更强的适应…

Message Decoding密码翻译

这是一道模拟题ex 其实每一道模拟题都很“简单”&#xff0c; 这道题就是难在读英文题&#xff01;处理输入&#xff01; 真的我竟然花了几个小时就只是为了看懂样例&#xff01;&#xff01;orz 题目大意 考虑下面的01串序列&#xff1a; 0&#xff0c;00&#xff0c;01…

.NET Core开发日志——结构化日志

在.NET生态圈中&#xff0c;最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net。而其后来者&#xff0c;莫过于NLog。Nlog与log4net相比&#xff0c;有一项较显著的优势&#xff0c;它支持结构化日志。结构化日志&#xff0c;也被称为语义化日志。其作用有二&…

YBTOJ 特殊数列(哈希表)

文章目录题目描述解析代码题目描述 解析 应该是哈希表板子题了 选一个1e6左右的质数进行处理即可 其实本质就是链前 没啥特别新鲜的 为什么要写呢&#xff1f; 因为这个东西很早之前看的时候完全没有看懂。。。 代码 #include<bits/stdc.h> using namespace std; #def…