温馨提示全部代码在文章的最后思路在文章的开始构造的芙莉莲 - 题目详情 - JNACMer Online JudgeA题异或是指将十进制的数字转成二进制的数字然后两个数字相同的位对齐同为0或1则该位为0如果不同则为1。例如8和3,8的二进制为1000,3的二进制为11对齐后就是1000800113结果为101112现在得知了异或的概念我们可以发现一件事如果A、B异或了以后那么留下的就是每一位不同的数字那个如果跟原来的A或B再异或那么如果A的第三位是1B的第三位是0留下的就是1对吧那么在跟1异或是不是该位就变成0了同样的那么如果A的第三位是0B的第三位是1留下的就是1对吧那么再跟0异或该位就变成1了其他的情况也能证明跟异或的结果跟A异或后得到的每一位都跟B相同。由此我们证明了A^B^AB。还有一个最简单的证明方法在赛后我突然想到A^BB^A证明异或具有交换律则A^B^AA^A^B那么A^A等于0,0异或某个数字等于那个数字本身。题目解法这道题读题后我们发现了关键点异或之后只有一个位置的数字会发生变化那么我们尝试能不能让两个数字位置互换因为从A排列到B排列其实可以看成为位置的互换。我们可以让两个数字异或A变成异或之后的数字CB不变再让B异或C让B变成A再让C异或AC就变成了B就可以完成位置的互换总共步骤也就是三步刚好卡住题目给的操作次数不大于3n。这道题如果想要操作成功必须把排列里的每一个数字都要留下来如果an与bn不同可以先让an异或bn的数字所以要知道bn在a数组里的位置我们需要一个记录数字位置的数组如下我在输入a数组的时候一起处理了mapint,int mp; for(int i1;in;i){ cina[i]; mp[a[i]]i; }an^bn后an的位置变成了cn(an^bn),bn没变再让bn^cn那个bn那个位置上的数变成了an再让cn^ancn变成了bn那么an和bn完成了位置的交换。以太编辑 - 题目详情 - JNACMer Online Judge这题其实就是你按照他给的流程做一遍就可以完成了设计代码的思路是设定两个值一个值nu记录现在有多少能量一个值nv记录现在欠多少能量一层一层往下走第一层深度多少就欠多少能量(nv加上多少能量然后nu加上补给的能量然后nu减去下一层与该层之间的深度差如果是负数就把nv把该负数正过来的值这样就能算出一开始需要给多少能量才能到最后一层。需要注意的是xi10的12次方那么如果x1是10的12次方int是不够用的更别说有很多个10的12次方如果补给一直很少呢比如一直为一那么n2*10的5次方那个最坏的情况是2*10的17次方需要long long银狼的字符串 - 题目详情 - JNACMer Online Judge这道题使用滑动窗口如果满足条件就缩小左边界缩小到不满足条件时记录上一个状态的左边界实现方法满足条件就一直ansmin(ans,右边界减左边界如果不满足条件了就再扩张右边界直到满足条件设计代码的细节满足条件后记录一次防止万一删去一个就不满足另外就是弄一个数组记录字母数量另外我写代码的时候不小心把左边界写成r右边界写错l了观看代码请注意实际用途代码很简单写了一次就通过了AtCoder 排名模拟 - 题目详情 - JNACMer Online Judge这道题是关于排序之类的但是数据类型繁多用pair或者其他一些容器好像不能完成目标所以我使用了结构体排序。struct Player {int id;int score;int penalty;bool ac[25];int wa[25];};A题代码#include bits/stdc.husing namespace std;using PIIpairint,int;vectorPII acc;int main(){int n;cinn;vectorint a(n1), b(n1);mapint,int mp;for(int i1;in;i){cina[i];mp[a[i]]i;}for(int i1;in;i){cinb[i];}for(int i1;in;i){if(a[i]!b[i]){int cmp[b[i]];acc.push_back({i,c});acc.push_back({c,i});acc.push_back({i,c});swap(mp[a[i]],mp[a[c]]);swap(a[i],a[c]);}}coutYes\nacc.size()\n;for(auto [x,y]:acc){coutx y\n;}return 0;}K题代码#includebits/stdc.husing namespace std;#define int long longsigned main(){int t;cint;while(t--){int n;cinn;int nu10;int nu20;int s;int x,y;for(int i0;in;i){if(i0){cinxy;nu1x;nu2y;sx;}else{cinxy;if(nu2(x-s)){nu1(x-s)-nu2;nu2y;sx;}else{nu2y-(x-s);sx;}}}coutnu1\n;}return 0;}G题代码#includebits/stdc.husing namespace std;#define int long longint c[30];signed main(){int n;cinn;//vector char a(n);string s;cins;int r0,l0;int u0;int ans1000000;for(int i0;in;i){c[s[i]-a];if(c[s-a]1c[i-a]1c[l-a]2c[v-a]1c[e-a]1c[w-a]1c[o-a]1c[f-a]1c[r-a]1){u1;li;}while(u){if(c[s-a]1c[i-a]1c[l-a]2c[v-a]1c[e-a]1c[w-a]1c[o-a]1c[f-a]1c[r-a]1){u1;ansmin(ans,(l-r));}else {u0;}c[s[r]-a]--;r;}}if(ans1000000){cout-1;}else coutans;return 0;}C题代码#include bits/stdc.husing namespace std;struct Player {int id; // 选手编号int score; // 总得分int penalty; // 总罚时所有AC题罚时的最大值bool ac[25]; // 标记每题是否已ACM≤20开25足够int wa[25]; // 每题AC前的非CE错误提交次数Player() : id(0), score(0), penalty(0) {memset(ac, 0, sizeof(ac));memset(wa, 0, sizeof(wa));}};// 得分降序 → 罚时升序 → 编号升序bool cmp(const Player a, const Player b) {if (a.score ! b.score)return a.score b.score;if (a.penalty ! b.penalty)return a.penalty b.penalty;return a.id b.id;}int main() {ios::sync_with_stdio(false);cin.tie(nullptr); // 加速输入输出int T;cin T;bool first_case true;while (T--) {if (!first_case)cout \n;first_case false;int N, M, K;cin N M K;vectorint S(M 1);for (int i 1; i M; i)cin S[i];vectorPlayer players(N 1);for (int i 1; i N; i)players[i].id i;for (int i 0; i K; i) {int p, q, t;string res;cin p q t res;if (players[p].ac[q])continue;if (res AC) {players[p].ac[q] true;players[p].score S[q];int cur_pen t players[p].wa[q] * 300;if (cur_pen players[p].penalty)players[p].penalty cur_pen;} else if (res CE) {} else {players[p].wa[q];}}vectorPlayer vec;for (int i 1; i N; i)vec.push_back(players[i]);sort(vec.begin(), vec.end(), cmp);// 计算排名并输出int rank 1;for (int i 0; i vec.size(); i) {if (i ! 0) {// 和前一名得分、罚时都不同排名更新为i1if (!(vec[i].score vec[i-1].score vec[i].penalty vec[i-1].penalty)) {rank i 1;}}cout rank vec[i].id vec[i].score vec[i].penalty \n;}}return 0;}