P7853 「EZEC-9」进位题目背景规定popcount ( x ) \text{popcount}(x)popcount(x)表示x xx在二进制表示下所含1 11的个数。题目描述您有一个二进制数B BB以一个长为n nn的01 0101字符串形式给出和长为m mm的序列a aa。同时您还需要对B BB进行m mm次操作。其中第i ii个操作为B ← B 2 a i B \gets B 2^{a_i}B←B2ai​其价值v i v_ivi​为B BB在操作前后变化的位置数量即v i popcount ⁡ ( B x o r ( B 2 a i ) ) v_i \operatorname{popcount}(B \mathbin{\mathrm{xor}} (B 2^{a_i}))vi​popcount(Bxor(B2ai​))。您需要解决两个问题您可以任意安排操作顺序问在执行所有操作后∑ i 1 m v i \displaystyle \sum_{i1}^mv_ii1∑m​vi​最大为多少您可以任意安排操作顺序问在执行所有操作后max ⁡ i 1 m v i \displaystyle \max_{i1}^mv_ii1maxm​vi​最大为多少输入格式第一行两个整数n , m n,mn,m。第二行一个长为n nn的01 0101字符串表示二进制数B BB从低位到高位依次给出。第三行m mm个整数a 1 , a 2 , … , a m a_1,a_2,\dots,a_ma1​,a2​,…,am​。输出格式第一行一个整数表示第一问的答案。第二行一个整数表示第二问的答案。本题使用 Special Judge若您的第一问答案正确可以获得该测试点30 % 30\%30%的分数若您的第二问答案正确可以获得该测试点另外70 % 70\%70%的分数。若您只回答了两问中的一问请在另一个位置输出一个非负整数。输入输出样例 #1输入 #15 6 10110 1 0 2 2 2 2输出 #114 6输入输出样例 #2输入 #210 10 0101010110 0 1 2 3 4 5 5 4 3 2输出 #221 9输入输出样例 #3输入 #310 3 1111101111 5 5 0输出 #313 11说明/提示【样例解释 #1】对于第一问依次执行第1 , 2 , 6 , 5 , 4 , 3 1,2,6,5,4,31,2,6,5,4,3个操作可得到∑ i 1 m v i 14 \displaystyle \sum\limits_{i1}^mv_i14i1∑m​vi​14。对于第二问依次执行第6 , 5 , 4 , 3 , 1 , 2 6,5,4,3,1,26,5,4,3,1,2个操作可得到max ⁡ i 1 m v i 6 \displaystyle \max\limits_{i1}^mv_i6i1maxm​vi​6。详细过程【数据范围】本题采用捆绑测试。Subtask 120 pointsn , m ≤ 10 n,m\leq 10n,m≤10。Subtask 230 pointsn , m ≤ 1000 n,m\leq 1000n,m≤1000。Subtask 320 pointsB BB中全为0 00且a 1 0 a_10a1​0∀ i 1 , a i − 1 ≤ a i ≤ a i − 1 1 \forall i1, a_{i-1}\leq a_i\leq a_{i-1}1∀i1,ai−1​≤ai​≤ai−1​1。Subtask 420 pointsn , m ≤ 10 5 n,m\leq 10^5n,m≤105。Subtask 510 points无特殊限制。对于100 % 100\%100%的数据1 ≤ n , m ≤ 10 6 1\leq n,m\leq 10^61≤n,m≤1060 ≤ a i n 0\leq a_i n0≤ai​n。C实现#includeiostream#includecstdiousingnamespacestd;inta[2000010],b[2000010],c[2000010];//b用于计算第一问c用于计算第二问intmain(){intn,m,maxm1;scanf(%d %d\n,n,m);//maxm设为1而非0registerintans0;for(registerinti0;in;i){chargjrgetchar();b[i](int)(gjr-0);c[i]b[i];}for(registerinti1;im;i){scanf(%d,a[i]);}for(registerinti1;im;i){intpta[i];b[pt];//进行操作c[pt];ans;//更新价值while(b[pt]2){//处理进位b[pt]0;b[pt];ans;}}for(registerinti0;in;i){if(c[i]2){registerintgjri,maxl1;//maxl是当前处理的连续进位的价值while(c[gjr]2){maxl;//能够进位就加1c[gjr1]c[gjr]/2;//处理进位c[gjr]1;}maxmmax(maxl,maxm);}}printf(%d\n%d,ans,maxm);return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容