首页 > 其他分享 >Codeforces Round 885 (Div. 2) F. Vika and Wiki(数学,倍增)

Codeforces Round 885 (Div. 2) F. Vika and Wiki(数学,倍增)

时间:2023-08-27 19:55:55浏览次数:41  
标签:Wiki std cnt 885 int Codeforces cin ++ 倍增

题目链接:https://codeforces.com/problemset/problem/1848/F

 

大致题意:

长度为n(n是2的幂次),每轮让a【i】 = a【i】^a【i%n + 1】,(^为异或)问需要操作多少次后可以使得每个数为0;

 

解题思路:

我们来观察:

第一次相当于:a【i】 = a【i】^ a【i+1】,a【i+1】 = a【i+1】^ a【i+2】

第二次相当于:a【i】 = a【i】^ a【i+2】,a【i+2】 = a【i+2】^a【i+4】

第四次相当于:a【i】 = a【i】 ^a【i+4】,a【i+4】 = a【i+4】 ^a【i+8】

...................

 

于是我们可以观察到,进行x(x是2的幂次)操作后,相当于a【i】 = a【i】 ^a【i+x】;

所以当进行n次后,结果一定是都为0,故一定是有解的;

那么我们可以通过倍增去解决这个问题了;

 

时间复杂度:O(nlogn)

 

代码如下:

 

#include<bits/stdc++.h>

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0); std::cout.tie(0);

    int n; std::cin >> n;
    std::vector<int> a(n, 0), b(n, 0);
    for (int i = 0; i < n; ++i)std::cin >> a[i];

    int cnt = 0;
    for (int i = 0; i < n; ++i)cnt += (a[i] == 0);

    if (cnt == n) { std::cout << "0\n"; return 0; }

    int ans = 1;

    int k = log2(n);

    for (int i = k - 1; i >= 0; --i)
    {
        for (int j = 0; j < n; ++j)
            b[j] = (a[j] ^ a[(j + (1ll << i)) % n]);

        cnt = 0;
        for (int j = 0; j < n; ++j)cnt += (b[j] == 0);

        if (cnt < n)ans += (1ll << i), a = b;
    }

    std::cout << ans << "\n";

    return 0;
}

通过异或的结合律,然后推出上面那个结论后,此题当然就迎刃而解啦:)

标签:Wiki,std,cnt,885,int,Codeforces,cin,++,倍增
From: https://www.cnblogs.com/ACMER-XiCen/p/17659090.html

相关文章

  • Educational Codeforces Round 152 (Rated for Div. 2)E. Max to the Right of Min(数
    题目链接:https://codeforces.com/problemset/problem/1849/E 大致题意: 长度为n的序列,求有多少个区间满足区间最大值在区间最小值的右边? 解题思路: (此题有使用线段树等其他做法,本处使用的是单调栈做法) 我们先求出每个a【i】的左边的比他小的LMIN,左边比他大的LMAX,右......
  • Codeforces Round 889 (Div. 1)C. Expected Destruction(期望,动态规划)
    题目链接:https://codeforces.com/problemset/problem/1854/C 大致题意: 有一个集合S,和一个上界m; 现在每秒钟可以进行一次如下操作: 1:等概率的选取S中的一个元素x;2:将x从S中移走;3:如果x+1不大于m并且x+1不在S中,那么添加x+1在S里面 问期望多少秒钟后可以使得S为空集(答......
  • Codeforces Round 889 (Div. 1) B. Earn or Unlock(dp,bitset)
    题目链接:https://codeforces.com/problemset/problem/1854/B 题目大致题意: 有n张卡牌从上到下堆叠,每张卡片有锁或不锁俩种状态,一开始第一张是不锁的;对最上面的卡牌,如果他是不锁的状态,那么可以进行俩种操作:1:从上到下,将v张被锁的卡牌解锁;2:获取v点能量现在求能获得的最大的......
  • Codeforces Round 890 (Div. 2) supported by Constructor Institute D. More Wrong(交
    题目链接:https://codeforces.com/contest/1856/problem/D 大致题意:这是一道交互题,有1~n的排列p,对于每次询问,你可以花费(R-L)2的代价去得到区间【L,R】之内的逆序对的个数,你需要在5n2的代价内得到n的位置。 初步思路: 首先我们来思路,在什么时候,我们可以确定那个位置是n。假......
  • Codeforces Round 894 (Div. 3)
    A.\(n\)个长为\(m\)的字符串,判断存在\(i,j,k,l\)有\(1\leqi<j<k<l\leqm\),满足这四列的字符串分别有\(v,i,k,a\)。小细节的题。时间复杂度\(O(n^2)\)。view#include<bits/stdc++.h>#defineREP(i,A,N)for(inti=(int)A;i<=(int)N;i+......
  • 【CFVP】Codeforces Round 851 (Div. 2)
    前言本场VP深感自己的弱小与史队的强大。又一次被史队全方位暴打。来做一个简要的总结。正文A.OneandTwoA题日常的愚蠢。考虑到原序列只含有质因子2。我们将质因子2平分给左右两边即可。当2的个数为奇数时即判断为无解。代码:#include<bits/stdc++.h>usingnamespace......
  • Codeforces Round 894 (Div. 3) ABCDEFG AK
    CodeforcesRound894(Div.3)第一次div3ak,虽然是vp的,后三题质量不错A-GiftCarpet穷举四个不同列即可,时间复杂度\(O(M^4)\)inta[100][100];voidsolve(){memset(a,0,sizeofa);intn,m;cin>>n>>m;for(inti=1;i<=n;i++)......
  • CodeForces 825G Tree Queries
    洛谷传送门CF传送门模拟赛赛时做法。看到查询路径点权最小值,想到建重构树,满足重构树上\(\operatorname{LCA}(x,y)\)为原树上\(x\toy\)路径的点权最小值。建树方法可以参考CF1797FLiHuaandPath。于是问题变成了,维护一个点集,支持加点,查询给定点\(x\)到点集中所有......
  • Codeforces Round 894 (Div. 3)
    CodeforcesRound894(Div.3)因为最近开学了,所以晚上可能就没有什么时间打这个了,不过以后一定会在第二天把题给补掉A题传送门A题意:就是在一个n*m的的字符矩阵中从左往右依次取出4列,使得每列包含vika这四个字符中按顺序出现一个。必须保证是按顺序出现。A思路:这是一个简......
  • Codeforces Round 894 (Div. 3) A-F题解
    A.GiftCarpet题意最近,特马和维卡庆祝了家庭日。他们的朋友Arina送给他们一块地毯,这块地毯可以用拉丁文小写字母的\(n\cdotm\)表来表示。维卡还没看过礼物,但特马知道她喜欢什么样的地毯。如果维卡能在地毯上读出自己的名字,她一定会喜欢的。她从左到右逐列阅读,并从当前列中......