打卡信奥刷题(3464)用C++实现信奥题 P10512 序列合并

打卡信奥刷题(3464)用C++实现信奥题 P10512 序列合并
P10512 序列合并题目描述给定一个长度为nnn的非负整数序列{an}\{a_n\}{an​}你可以进行kkk次操作每次操作你选择两个相邻的数把它们合并成它们的按位或。形式化地一次操作中你选择一个下标iii1≤in1 \le i n1≤in然后把原序列变成{a1,a2,⋯ ,aior⁡ai1,ai2,⋯ ,an}\{a_1,a_2,\cdots,a_i \operatorname{or} a_{i1},a_{i2},\cdots,a_n\}{a1​,a2​,⋯,ai​orai1​,ai2​,⋯,an​}。求kkk次操作后所有数按位与的最大值。输入格式第一行包含两个正整数n,kn,kn,k。第二行包含nnn个非负整数其中第iii个非负整数为aia_iai​。输出格式输出一行包含一个正整数代表答案。输入输出样例 #1输入 #15 2 2 1 2 3 1输出 #12说明/提示【样例解释】一种合法的方案第一次操作选择第一个数和第二个数合并序列变为{3,2,3,1}\{3,2,3,1\}{3,2,3,1}。第二次操作选择第三个数和第四个数合并序列变为{3,2,3}\{3,2,3\}{3,2,3}。最终所有数的按位与为222。可以证明不存在更优的方案。【数据范围】对于25%25\%25%的数据n≤20n \le 20n≤20。对于另外25%25\%25%的数据kn−2kn-2kn−2。对于所有数据保证1≤kn≤2×1051 \le kn \le 2 \times 10^51≤kn≤2×1050≤ai2300 \le a_i 2^{30}0≤ai​230。C实现#includeiostreamusingnamespacestd;intn,m,k,a[200010];intlg(intx){intcnt0;while(x)x1,cnt;returncnt-1;}boolchk(intx){intsum0,cnt0;for(inti1;in;i){sum|a[i];if((sumx)x)sum0,cnt;}returncntk;}intmain(){cinnk;kn-k;for(inti1;in;i){cina[i];mmax(m,lg(a[i]));}intnow0;for(intim;i0;i--){now(1i);if(!chk(now))now-(1i);}coutnowendl;return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容