UVa 12657 Boxes in a Line(双向链表的应用)

况那么一定  最后是4操作,必须清醒地意识到4操作有可能不知会出现一次,便可利用一个类似标志变量,出现一次4

取一次非。

3、当出现1次4后,也就是说反转一次,那么原来1和2的操作相当于换过来了,这是一个小技巧。用3-当前操作便可。

4、还有就是最后奇数项总和的解法,也是存在一点小技巧的,可以先求出来未反转时总和sum,如果原本就是奇数,

那反转后的总和仍是sum;但如果是偶数,那就不同了,前n项和-sum便是此情况下的奇数项总和(用long long定义较

好,防止超出范围)

代码如下:

#include

#include

#include

#define maxn 100200

using namespace std;

long long Right[maxn],Lift[maxn];

void link(int X,int Y)//构建数组模拟双向链表

{

Right[X]=Y;

Lift[Y]=X;

}

int main()

{

int n,m,Case=0;

while(cin>>n>>m)

{

memset(Lift,0,sizeof(Lift));

memset(Right,0,sizeof(Right));

int ans =0;

for(int i=1;i<=n;i++)

{

link(i,i+1);

link(i-1,i);

}

while(m–)

{

int c,X,Y;

cin>>c;

if(c==4)

{

ans=!ans;//类似标志控制最后到底反转还是未反转

continue;

}

cin>>X>>Y;

if(c==3&&(Right[Y]==X)) swap(X,Y);//处理特殊情况相邻

if(c!=3&&ans) c=3-c;//反转后1和2操作互换

if(c==1&&Lift[Y]==X) continue;

if(c==2&&Right[Y]==X) continue;//这两种情况已经符合1,2的操作直接跳过即可

int XL=Lift[X],XR=Right[X],YL=Lift[Y],YR=Right[Y];

if(c==3)

{

if(Right[X]==Y)//处理特殊情况

{

link(XL,Y);

link(Y,X);

link(X,YR);

}

else

{

link(X,YR);

link(YL,X);

link(Y,XR);

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618191877)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值