首页 > 其他分享 >逐月晴月杯

逐月晴月杯

时间:2024-10-24 20:23:16浏览次数:4  
标签:fir cnt last int 晴月杯 MAXN return 逐月

A. 无限旅馆

题目描述

有一个序列 \(A=[1]\),有三种操作:

  • 令 \(A\rightarrow [x,A_1,A_2,\dots,A_N]\)。
  • 令 \(A\rightarrow [x,A_1,x,A_2,\dots,x,A_N]\)。
  • 求 \(A_x\) 的1值或确定序列长度小于 \(x\)。

思路

由于 2 操作至多进行 \(\log\) 次,所以我们可以这样求解:

  • 每次不断往前跳,如果是连续的 1 就一起跳过去。

空间复杂度 \(O(N\log N)\),时间复杂度 \(O(N\log N)\)。

代码

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 100001;

struct Node {
  int op, x;
}s[MAXN];

int q, len, f[MAXN], fa[18][MAXN], cnt[MAXN], fir[MAXN];

int Get(int i, int p) {
  if(!i) {
    return 1;
  }else if(s[i].op == 2) {
    return (p % 2 ? s[i].x : Get(f[i], p / 2));
  }else if(p > cnt[i]) {
    return Get(fir[i], p - cnt[i]);
  }else {
    for(int j = 17; j >= 0; --j) {
      if(((p - 1) >> j) & 1) {
        i = fa[j][i];
      }
    }
    return s[i].x;
  }
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> q;
  len = 1;
  for(int i = 1, last = 0; i <= q; ++i) {
    cin >> s[i].op >> s[i].x;
    f[i] = last;
    if(s[i].op == 1) {
      len = min(int(1e9) + 1, len + 1);
      cnt[i] = 1;
      fir[i] = last;
      if(s[last].op == 1) {
        fa[0][i] = last;
        fir[i] = fir[last];
        cnt[i] += cnt[last];
        for(int j = 1; j <= 17; ++j) {
          fa[j][i] = fa[j - 1][fa[j - 1][i]];
        }
      }
      last = i;
    }else if(s[i].op == 2) {
      len = min(int(1e9) + 1, 2 * len);
      last = i;
    }else if(s[i].op == 3) {
      cout << (s[i].x > len ? -1 : Get(last, s[i].x)) << "\n";
    }
  }
  return 0;
}

D. 镜面迷宫

题目描述

有一个由斜着/横/竖的镜面组成的 \(N\times M\) 的迷宫,有 \(Q\) 次询问,每次询问从 \((x,y)\) 向上/下/左/右发射激光会在多少个不同的镜子上反射。

思路

可以发现,我们对迷宫建图,一定会组成一个由链/环组成的图。依次处理即可。

时空复杂度均为 \(O(NM)\)。

代码

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1005, dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};

int n, m, q, nxt[4 * MAXN * MAXN], cnt[4 * MAXN * MAXN], in[4 * MAXN * MAXN], ans[4 * MAXN * MAXN];
bool vis[4 * MAXN * MAXN], flag[4 * MAXN * MAXN];
char c[MAXN][MAXN];

int id(int x, int y, int d) {
  return d * n * m + (x - 1) * m + y;
}

bool add(int x, bool f) {
  x -= (x > 3 * n * m ? 3 : (x > 2 * n * m ? 2 : (x > n * m ? 1 : 0))) * n * m;
  flag[x] = flag[x + n * m] = flag[x + 2 * n * m] = flag[x + 3 * n * m] = f;
  return 1;
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for(int i = 1; i <= n; ++i) {
    for(int j = 1; j <= m; ++j) {
      cin >> c[i][j];
    }
  }
  for(int i = 1; i <= n; ++i) {
    for(int j = 1; j <= m; ++j) {
      for(int d : {0, 1, 2, 3}) {
        int x = i + dx[d], y = j + dy[d], nd;
        if(x >= 1 && x <= n && y >= 1 && y <= m) {
          if(c[x][y] == '-') {
            nd = (!d ? 1 : (d == 1 ? 0 : d));
          }else if(c[x][y] == '|') {
            nd = (d == 2 ? 3 : (d == 3 ? 2 : d));
          }else if(c[x][y] == '/') {
            nd = (!d ? 3 : (d == 1 ? 2 : (d == 2 ? 1 : 0)));
          }else if(c[x][y] == '\\') {
            nd = (!d ? 2 : (d == 1 ? 3 : (d == 2 ? 0 : 1)));
          }
          nxt[id(x, y, nd)] = id(i, j, d);
          in[id(i, j, d)]++;
          cnt[id(x, y, nd)] = (d != nd);
        }
      }
    }
  }
  for(int i = 1; i <= 4 * n * m; ++i) {
    if(!in[i]) {
      int u = i, res = 0;
      for(; u; ans[u] = res, vis[u] = 1, res += (cnt[u] && !flag[u]), (cnt[u] && add(u, 1)), u = nxt[u]) {
      }
      u = i;
      for(; u; add(u, 0), u = nxt[u]) {
      }
    }
  }
  for(int i = 1; i <= 4 * n * m; ++i) {
    if(!vis[i]) {
      int u = i, res = 0;
      for(; !vis[u]; res += (cnt[u] && !flag[u]), (cnt[u] && add(u, 1)), vis[u] = 1, u = nxt[u]) {
      }
      u = i;
      do {
        ans[u] = res;
        add(u, 0);
        u = nxt[u];
      }while(u != i);
    }
  }
  cin >> q;
  for(int i = 1, x, y, d; i <= q; ++i) {
    string s;
    cin >> x >> y >> s;
    d = (s == "above" ? 0 : (s == "below" ? 1 : (s == "left" ? 2 : 3)));
    cout << ans[id(x, y, d)] << "\n";
  }
  return 0;
}

标签:fir,cnt,last,int,晴月杯,MAXN,return,逐月
From: https://www.cnblogs.com/yaosicheng124/p/18500392

相关文章

  • 逐月新星杯
    B.拓扑图计数题目描述给定一个排列\(p\),求有多少个DAG的最小字典序拓扑序为\(p\)。思路我们对于每个点\(p_i\),考虑前面的点连到\(p_i\)的方案数。如果\(i\)前面没有有大于\(p_i\)的就随便选。而如果有,令其为\(j\),那么\(j\)之前的还是照样随便选,但\(j\)之后至......
  • 逐月破星杯
    C.区间排序题目描述给定一个数组\(A\),你要按照如下方式对\(A\)排序:将\(A\)分割成互不相交的子段,且每个元素恰好属于一个子段。准备一个空数组\(B\),按顺序把这些子段完整地插入到\(B\)中的任意位置。求至少要分成几个子段。思路很明显我们会贪心的尽可能长的取子......
  • 逐月信息学——2024初秋集训——提高组 #22
    A.牛牛的方程式题目描述给定一个三元一次方程\(ax+by+cz=d\),求该方程是否存在整数解。思路由于若干个\(a,b,c\)只能凑出\(\gcd(a,b,c)\)的倍数,所以只需判断\(d\)是否为\(\gcd(a,b,c)\)的倍数即可。特别的,若\(a,b,c\)均为\(0\),则显然只有\(d=0\)时存在整数解。......
  • GEE案例:利用MODIS数据计算长时序逐月的NDVI数据和下载
    简介详细流程如下:1.打开GoogleEarthEngine(GEE)平台的网站https://earthengine.google.com/。2.点击右上角的"SignIn"按钮,使用您的Google账号登录。3.在GEE界面中,点击左上角的"CodeEditor"按钮,进入代码编辑器页面。4.在代码编辑器页面的左上方,点击"A......
  • 逐月信息学 2024 提高组 #4
    \(\color{black}\texttt{A.转盘锁}\)题目描述给定一个四位转盘锁,每个转盘上都有\(0\)到\(9\)的数字。数字\(i\)的下一个数字是\((i+1)\bmod10\),上一个数字是\((i-1)\bmod10\)。每次你可以将一段连续的区间全部往上翻或往下翻一个数字。现在给定一个初始时的转盘,求最......
  • 逐月信息学 2024 提高组 #3
    \(\color{black}\texttt{A.反转Dag图}\)题目描述给定一个有向图,每次操作可以花费\(w_i\)的代价来反转边\(i\),最终总代价为每次操作代价的最大值。求最少需要多少代价才能使这张图变为一个DAG。思路首先看这个问题的简化版:把反转操作变为删除操作。可以用二分解决:二分出......
  • 逐月信息学 2024 提高组 #2
    \(\color{black}\texttt{A.序列}\)题目描述给定\(N\)个数,每个数均可写成\(pq(p,q\in\mathbb{P},p<q)\)的形式,问最长能找到多长的子序列使得任意相邻两项\(x_i=p_1q_1,x_{i+1}=p_2q_2(p_1,q_1,p_2,q_2\in\mathbb{P},p_1<q_1,p_2<q_2)\)满足\(q_1=p_2\)?思路按照\(p\)......
  • 逐月信息学 2024 提高组 #6
    \(\color{black}\texttt{A.数字涡旋}\)题目描述有一张无线大的表格,里面填着所有正整数,表格如下:\[\begin{matrix}1&2&9&\dots\\4&3&8\\5&6&7\\\vdots&&&\ddots\end{matrix}\]求数字\(N\)出现在表格的几行几列。思路推式子体。代码#include<bits/st......
  • 逐月信息学 2024 提高组 #5
    \(\color{black}\texttt{A.党同伐异}\)题目描述有\(N\)个候选人,每个候选人都有一个不同的政治倾向\(c_i\),进行\(N-1\)次选举。每轮选举中,所有未被淘汰的候选人给另一个没被淘汰的候选人。每一个候选人会将票投给\(c_i\)与自己差的绝对值最大的候选人。如果有多个这样的......
  • 逐月生存指南
    学生篇小心同学!!!小心同学!!!小心同学!!!(重要的事情说三遍)xhr典型的笑里藏刀,演技高手。案例:每当xhr给别人东西事,只要表情不对,就一定不能接。(注意表情不对的范围很广)每当他说一道题不会时,就说明他有\(99.99999999999999\cdots\cdots\%\)的概率AK。(xhr你可不可以放放……)wsy似......