首页 > 其他分享 >CSP模拟24

CSP模拟24

时间:2023-08-18 20:12:18浏览次数:55  
标签:24 int 位置 long dfs 寄存器 CSP 模拟 size

yspm 专场 2。

原神派蒙、药水泡面、医生拍门、浴室泡沫

A. 原神派蒙

思路

结论:如果序列原先就合法,答案为 \(0\);否则,最多使用两个寄存器。

我们对 \(i \rightarrow a_i\) 建边得到若干个环,我们单独考虑一个环如何操作。

对于一个长度为 \(4\) 的数列,再包含两个寄存器,设两个寄存器的值分别为 \(x,y\)。

显然 \(4,1,3\) 组成了一个环,我们对其进行一些操作,使得他们回到他们想要到达的位置,即箭头指向的位置。

我们记 \(\operatorname{pos}_i\) 表示值 \(i\) 所在的位置,把 \(4\) 看作环的起点,那么把这个环拆成一条链就是 \(4,3,1\),下文称之为链。

首先我们将值 \(4\) 与值 \(5\) 交换位置,在此基础上再将值 \(3\) 与刚刚换到第五个位置的值 \(4\) 交换位置,除了链的最后一个元素外,剩下的元素按照上面的方式依次与第一个寄存器进行交换。

这样,我们链的第 \(1 \sim n-2\) 个元素都达到了自己的目标位置(他们指向的位置就是目标位置)。只剩下原本链的最后一个元素和倒数第二个元素没有达到目标位置。

我们寄存器原本的值 \(x\) 放在了链的第一个位置,链的倒数第二个元素放在了第一个寄存器的位置。链的最后一个元素仍在其原位置。

考虑如何处理剩下这两个元素。我们设链的倒数第二个值为 \(a\),最后一个值为 \(b\)。

我们考虑把值 \(b\) 与值 \(y\) 交换,现在 \(y\) 在链的末尾,\(b\) 在第二个寄存器;

再考虑把刚刚换到链的末尾的值 \(y\) 与第一个寄存器的值进行交换,即将值 \(y\) 与值 \(a\) 交换,现在 \(a\) 在链的末尾(达到了目标位置),\(y\) 在第一个寄存器;

再考虑将第二个寄存器的值与链首的值进行交换,即把 \(b\) 与 \(x\) 进行交换,\(b\) 达到了其目标位置。

到这里,前面的内存单元就已经合法了。我们再考虑一下两个寄存器顺序是否合法就可以了。

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 100500;

int n,m;

int a[N];

vector< pair<int,int> > ans;
deque<int> st;

bool vis[N];

void dfs(int x) {
    vis[x] = 1;
    st.push_back(x);

    if(!vis[a[x]])
        dfs(a[x]);
    
    return ;
}


int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for(int i = 1;i <= n; i++) 
        cin >> a[i];
    
    a[n + 1] = n + 1;
    a[n + 2] = n + 2;
    
    for(int i = 1;i <= n; i++) {
        if(!vis[i] && i != a[i]) {
            st.clear();
            
            dfs(i);

            m = 2;

            for(auto const &it : st) {
                if(it == st.back())
                    break;

                ans.emplace_back(it,n + 1);
                swap(a[it],a[n + 1]);
            }
            
            ans.emplace_back(st.back(),n + 2);
            swap(a[st.back()],a[n + 2]);

            ans.emplace_back(st.back(),n + 1);
            swap(a[st.back()],a[n + 1]);

            ans.emplace_back(st.front(),n + 2);
            swap(a[st.front()],a[n + 2]);
        }
    }

    if(a[n + 1] != n + 1) 
        ans.emplace_back(n + 1,n + 2);
    
    cout << m << " " << ans.size() << "\n";
    for(auto const &it : ans) 
        cout << it.first << " " << it.second << "\n";
    
    return 0;
}

B. 药水泡面

基本与CF280C相同。

选中了一个点,这个点就被删除了,即一个点只能被选一次。一棵树被删除等同于每个点都被选中,所以可以这么转化。

想要选中这个要被删除的点,不能让它由于它子树中的点被删除,在此条件下,该结点要被删除,所以为 \(\dfrac{1}{\operatorname{size}_x}\)。

所以最终答案为

\[\sum_{i=1}^n\dfrac{1}{\operatorname{size}_i} \]

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 2005000;
const int Mod = 998244353;

int n;

struct Edge{
    int next,to;
}e[N << 1];

int cnt,h[N];

void Add(int u,int v) {
    cnt ++;
    e[cnt].next = h[u];
    h[u] = cnt;
    e[cnt].to = v;

    return ;
}

long long Pow(long long a ,long long b) {
    long long res = 1 ;
    long long base = a % Mod;
    while(b) {
   	    if(b & 1)
   		    res = (res * base) % Mod;
   	    base = (base * base) % Mod;
   	    b >>= 1;
   }
   return res;
}

long long Inv(long long x) {
    return Pow(x % Mod,Mod - 2) % Mod;
}

int size[N];

void dfs(int x,int fa) {
    size[x] = 1;

    for(int i = h[x];i;i = e[i].next) {
        int to = e[i].to;

        if(to == fa)
            continue;
        
        dfs(to,x);

        size[x] += size[to];
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin >> n;

    for(int i = 1,u,v;i < n; i++) {
        cin >> u >> v;
        Add(u,v);
        Add(v,u);
    }

    dfs(1,0);

    long long ans = 0;
    for(int i = 1;i <= n; i++) 
        ans = (ans + 1ll * Inv(size[i]) % Mod) % Mod;

    cout << ans << "\n";
    return 0;
}

C. 医生拍门

D. 浴室泡沫

标签:24,int,位置,long,dfs,寄存器,CSP,模拟,size
From: https://www.cnblogs.com/baijian0212/p/csp-24.html

相关文章

  • 8.18 模拟赛小结
    前言不平衡的一集T1动态数点题意很清楚我们先思考怎么暴力搞如果一个数是\(k\)那么它一定是这个区间的最大公约数可以直接搞个ST表加二分每次枚举左端点由于gcd和二分都有\(\log\)总时间复杂度\(O(n\log^2n)\)然后就挂了30pts(((考虑优化成\(O(n\log......
  • 振弦采集仪模拟信号转数字信号的工作原理
    三河凡科科技学习飞讯振弦采集仪模拟信号转数字信号的工作原理振弦采集仪是一种非常重要的测试仪器,其主要作用是将物理系统中的震动信号转换成数字信号,并且进行进一步的信号处理和分析。本文将详细介绍振弦采集仪模拟信号转数字信号的工作原理。 1.模拟信号采集振弦采集仪......
  • 模拟实现vector
    首先要知道vector是什么vector是什么 1.vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质......
  • 2023北京/杭州/深圳CSPM-3国标项目管理中级认证招生
    CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要求,培养我国项目管理领域复合型人才。  【证书含金量】 ·竞聘优先......
  • 振弦采集仪模拟信号转数字信号的工作原理
    振弦采集仪模拟信号转数字信号的工作原理振弦采集仪是一种非常重要的测试仪器,其主要作用是将物理系统中的震动信号转换成数字信号,并且进行进一步的信号处理和分析。本文将详细介绍振弦采集仪模拟信号转数字信号的工作原理。1.模拟信号采集振弦采集仪通过传感器来采集物理系统中......
  • 工程测量仪器振弦采集仪模拟信号转数字信号的工作原理
    工程测量仪器振弦采集仪是一种常见的测量仪器,在建筑、道路、桥梁等工程施工中,可以用于对地基、土层、岩层等材料的力学特性进行测试和分析。在进行测量过程中,振弦采集仪需要将测量信号转换为数字信号,并进行数据采集和处理。本文将详细介绍振弦采集仪模拟信号转数字信号的工作原理。......
  • 8.18 模拟赛小记 & 学习
    谔谔谔谔。菜翻天。今天模拟赛题目传送门。A.跳蚤市场(mid)话说我才看到这个英文名字叫mid。然后就是手写lower_bound和upper_bound优化前缀和。B.组合问题(anm)这个错排之前上课讲过于是一眼了。可惜没看longlong祖宗十八代都被炸死了。C.旅行(day)图论题。D.购物(t......
  • sol. ABC246Ex
    动态DP模板题[ABC246Ex]01?Queries题目大意:给定一个长度为\(N\)且只包含?,1,0的字符串\(a\)。\(Q\)次操作,每次操作会修改字符串中的一个字符,并求出此时整个字符串中本质不同的子序列个数。众所周知,动态DP依然是DP的一种。先考虑没有修改操作,那么本题变为一个普......
  • 模拟记-P2186 小 Z 的栈函数
    哈哈哈哈哈哈哈#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintMAXN=2005;inta[MAXN],tot,n,t;strings[MAXN];stack<int>q;inlineboolne(intx){ returnabs(x)>1000000000;}inlinevoiderror(){cout<<"ERRO......
  • P2484 [SDOI2011] 打地鼠
    题目描述2020.4.29数据更新。打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中。玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高。游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞......