一行盒子

Description

你有一行盒子,从左到右依次编号为1, 2, 3,…, n。你可以执行四种指令:

1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令)。
2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令)。
3 X Y表示交换盒子X和Y的位置。
4 表示反转整条链。

指令保证合法,即X不等于Y。例如,当n=6时在初始状态下执行1 1 4后,盒子序列为2 3 1 4 5 6。接下来执行2 3 5,盒子序列变成2 1 4 5 3 6。再执行3 1 6,得到2 6 4 5 3 1。最终执行4,得到1 3 5 4 6 2。

Input

输入包含不超过10组数据,每组数据第一行为盒子个数n和指令条数m(1<=n,m<=100,000),以下m行每行包含一条指令。

Output

每组数据输出一行,即所有奇数位置的盒子编号之和。位置从左到右编号为1~n。

Sample Input

6 4
1 1 4
2 3 5
3 1 6
4
6 3
1 1 4
2 3 5
3 1 6
100000 1
4

Sample Output

Case 1: 12
Case 2: 9
Case 3: 2500050000

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 100000 + 5;
int n, left[maxn], right[maxn];    //记住每个盒子相邻的盒子的序号;

inline void link(int L, int R)
{
  right[L] = R; left[R] = L;
}

int main()
{
  int m, kase = 0;
  while(scanf("%d%d", &n, &m) == 2)
  {
    for(int i = 1; i <= n; i++) {
      left[i] = i-1;
      right[i] = (i+1) % (n+1);
    }
    right[0] = 1; left[0] = n;
    int op, X, Y, inv = 0;

    while(m--) {
      scanf("%d", &op);
      if(op == 4) inv = !inv;      //当遇到‘4’指令时;先不处理;
      else {
        scanf("%d%d", &X, &Y);
        if(op == 3 && right[Y] == X) swap(X, Y);
        if(op != 3 && inv) op = 3 - op;     //若果‘4’指令个数为奇数,那么将‘1’和‘2’指令调换;
        if(op == 1 && X == left[Y]) continue;
        if(op == 2 && X == right[Y]) continue;
        //以下为更新转换后每个盒子相邻的盒子的序号;
        int LX = left[X], RX = right[X], LY = left[Y], RY = right[Y];
        if(op == 1) {
          link(LX, RX); link(LY, X); link(X, Y);
        }
        else if(op == 2) {
          link(LX, RX); link(Y, X); link(X, RY);
        }
        else if(op == 3) {
          if(right[X] == Y) { link(LX, Y); link(Y, X); link(X, RY); }
          else { link(LX, Y); link(Y, RX); link(LY, X); link(X, RY); }
        }
      }
    }

    int b = 0;
    long long ans = 0;
    for(int i = 1; i <= n; i++) {
      b = right[b];
      if(i % 2 == 1) ans += b;
    }
    if(inv && n % 2 == 0) ans = (long long)n*(n+1)/2 - ans;
    printf("Case %d: %lld\n", ++kase, ans);
  }
  return 0;
}


### 使用 Flexbox 实现一行放置多个元素 为了实现一行放置多个元素的效果,可以通过设置 `display: flex` 将父容器定义为弹性盒子(Flexbox),并利用其强大的布局功能完成需求。以下是具体方法: #### 设置父容器为 Flex 容器 通过将父级元素的 `display` 属性设为 `flex`,可以让所有的子元素在同一行内排列。 ```css .container { display: flex; /* 启用 Flexbox */ } ``` #### 控制子项之间的间距和对齐方式 为了让这些子项能够平摊排列或者控制它们的间隔,可以使用以下属性: - **`justify-content`**: 用于指定主轴上的对齐方式。 - `space-between`: 子项之间平均分配空间,首尾紧贴边缘[^3]。 - `space-around`: 每个子项周围都有相等的空间。 - `center`: 所有子项集中到中间位置。 示例代码如下: ```css .container { display: flex; justify-content: space-between; /* 或者其他值 */ } ``` 如果希望每个子项占据相同的宽度,则可结合 `flex-grow` 和固定宽度一起使用。 #### 让子项自适应宽度 当需要让每一个子项都具有相同的比例时,可以用到 `flex-basis` 及 `flex-grow`: ```css .item { flex: 1; /* 等价于 flex-grow: 1, 默认 basis 自动计算 */ } ``` 这样做的效果就是无论有多少个 `.item` 都会被压缩成同样的大小,并填满整个`.container`. 完整实例演示: ```html <div class="container"> <div class="item">Item 1</div> <div class="item">Item 2</div> <div class="item">Item 3</div> </div> <style> .container { display: flex; justify-content: space-between; } .item { background-color: lightblue; padding: 10px; text-align: center; border: 1px solid blue; } /* 如果想要均分宽度 */ /* .item { flex: 1; } */ </style> ``` 上述例子展示了如何创建一个简单的多元素单行列表结构[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值