国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

cf 759 A Pavel and barbecue

2019-11-11 02:20:39
字體:
來源:轉載
供稿:網友

題意:

給一個序列,序列值代表對應下標下一秒硬幣要移動到的下標,再給一個相同01序列,1代表在這個位置下一秒硬幣翻轉。問需要修改幾次這兩個序列使得每一枚硬幣經過若干秒后能以正面和反面的姿態都經過過每一個點。

解題思路:

之所以需要修改是硬幣的移動位置會形成循環,而這個循環有可能不是全局的,是分成幾堆硬幣內部循環,我們需要找出這樣硬幣的堆數,如果堆數是一那么正好不用改,如果大于一就需要把這幾堆硬幣串聯再一起,需要的修改數量就是堆數。

而翻轉的序列就很好考慮了,我們只考慮一枚硬幣,這枚硬幣經過其它所以點回到原來點后,如果翻轉次數是偶數,那么回來時的狀態和出發時的狀態是一樣的,這樣就會循環下去,那么肯定是不可以正反兩面都經過每一個點的,所以要求翻轉的次數是奇數。

代碼:

#include <bits/stdc++.h>using namespace std;const int maxn=2e5;int add[maxn];bool rev[maxn];bool vis[maxn];int main(){    int n;    scanf("%d", &n);    int i;    for(i=1; i<=n; i++)scanf("%d", &add[i]);    int cir=0;    for(i=1; i<=n; i++)    {        if(vis[i])continue;        cir++;        int t=i;        do        {            vis[t]=1;            t=add[t];        }while(i!=t);    }    int odd=0;    for(i=1; i<=n; i++){scanf("%d", &rev[i]);if(rev[i])odd++;}    int ans=0;//    PRintf("%d/n", ans);    if(odd%2==0)ans++;    printf("%d/n", ans+(cir>1?cir:0));    return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九龙城区| 射阳县| 仪征市| 金秀| 临汾市| 时尚| 南召县| 神农架林区| 永年县| 阿克苏市| 旬邑县| 改则县| 翼城县| 汝阳县| 漳浦县| 维西| 新乡市| 嫩江县| 盈江县| 治县。| 南丹县| 科技| 台中市| 伊金霍洛旗| 梨树县| 隆回县| 莱西市| 安福县| 翁源县| 庆安县| 拜城县| 疏附县| 沙洋县| 黄山市| 沛县| 普定县| 财经| 武定县| 南宫市| 南皮县| 横山县|