一行盒子

盒序调整算法解析

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;
}


在 HTML 中设置盒子独占一行有多种方法,以下为你详细介绍: ### 使用块级元素 HTML 中的块级元素会自动独占一行。常见的块级元素有 `div`、`p`、`h1` - `h6` 等。使用块级元素可以很方便地让盒子独占一行,示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> .box { width: 100px; height: 100px; background-color: lightblue; } </style> </head> <body> <div class="box">盒子1</div> <div class="box">盒子2</div> </body> </html> ``` 在上述代码中,`div` 元素是块级元素,每个 `div` 都会独占一行显示[^1]。 ### 使用浮动元素结合清除浮动 如果盒子原本是浮动元素,可以通过清除浮动来实现独占一行。示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> .box { width: 100px; height: 100px; background-color: lightgreen; float: left; } .clear { clear: both; } </style> </head> <body> <div class="box">盒子1</div> <div class="clear"></div> <div class="box">盒子2</div> </body> </html> ``` 这里通过一个空的 `div` 元素设置 `clear: both` 来清除浮动,使第二个盒子独占一行显示[^1]。 ### 使用弹性布局(Flexbox) 利用 Flexbox 的 `flex-direction` 属性设置为 `column` 可以让子元素垂直排列,每个子元素独占一行。示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> .flex-container { display: flex; flex-direction: column; } .box { width: 100px; height: 100px; background-color: lightcoral; } </style> </head> <body> <div class="flex-container"> <div class="box">盒子1</div> <div class="box">盒子2</div> </div> </body> </html> ``` 设置 `flex-direction: column` 后,子元素会垂直排列,每个子元素独占一行[^1]。 ### 使用网格布局(Grid) 使用网格布局的 `grid-template-columns` 属性设置为单列布局,也能让盒子独占一行。示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> .grid-container { display: grid; grid-template-columns: 1fr; } .box { width: 100px; height: 100px; background-color: lightyellow; } </style> </head> <body> <div class="grid-container"> <div class="box">盒子1</div> <div class="box">盒子2</div> </div> </body> </html> ``` 这里 `grid-template-columns: 1fr` 表示只创建一列,每个子元素会独占一行显示[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值