江南联盟暑期集训第一场,补题
2026/7/19 4:15:21 网站建设 项目流程

温馨提示:全部代码在文章的最后,思路在文章的开始

构造的芙莉莲 - 题目详情 - JNACMer Online Judge

A题,异或是指将十进制的数字转成二进制的数字,然后两个数字相同的位对齐,同为0或1则该位为0,如果不同,则为1。

例如:8和3,8的二进制为1000,3的二进制为11,对齐后就是1000(8)

0011(3)

结果为1011(12)

现在,得知了异或的概念,我们可以发现一件事,如果A、B异或了以后,那么留下的就是每一位不同的数字,那个如果跟原来的A(或B)再异或,那么如果A的第三位是1,B的第三位是0,留下的就是1,对吧,那么在跟1异或,是不是该位就变成0了,同样的,那么如果A的第三位是0,B的第三位是1,留下的就是1,对吧,那么再跟0异或,该位就变成1了,其他的情况,也能证明跟异或的结果跟A异或后得到的每一位都跟B相同。

由此,我们证明了A^B^A=B。还有一个最简单的证明方法,在赛后我突然想到,A^B=B^A,证明异或具有交换律,则A^B^A=A^A^B,那么A^A等于0,0异或某个数字等于那个数字本身。

题目解法:这道题读题后我们发现了关键点,异或之后,只有一个位置的数字会发生变化,那么,我们尝试能不能让两个数字位置互换,因为从A排列到B排列,其实可以看成为位置的互换。

我们可以让两个数字异或,A变成异或之后的数字(C),B不变,再让B异或C,让B变成A,再让C异或A,C就变成了B,就可以完成位置的互换,总共步骤也就是三步,刚好卡住题目给的操作次数不大于3n。

这道题如果想要操作成功,必须把排列里的每一个数字都要留下来,如果an与bn不同,可以先让an异或bn的数字,所以要知道bn在a数组里的位置,我们需要一个记录数字位置的数组,如下,我在输入a数组的时候一起处理了

map<int,int> mp; for(int i=1;i<=n;i++){ cin>>a[i]; mp[a[i]]=i; }

an^bn后,an的位置变成了cn(an^bn),bn没变,再让bn^cn,那个bn那个位置上的数变成了an,再让cn^an,cn变成了bn,那么an和bn完成了位置的交换。

以太编辑 - 题目详情 - JNACMer Online Judge

这题其实就是你按照他给的流程做一遍就可以完成了,设计代码的思路是,设定两个值,一个值nu记录现在有多少能量,一个值nv记录现在欠多少能量,一层一层往下走,第一层深度多少就欠多少能量(nv加上多少能量),然后nu加上补给的能量,然后nu减去下一层与该层之间的深度差,如果是负数,就把nv+把该负数正过来的值,这样就能算出,一开始需要给多少能量才能到最后一层。

需要注意的是xi<=10的12次方,那么如果x1是10的12次方,int是不够用的,更别说有很多个10的12次方,如果补给一直很少呢,比如一直为一,那么n<=2*10的5次方,那个最坏的情况是2*10的17次方,需要long long

银狼的字符串 - 题目详情 - JNACMer Online Judge

这道题使用滑动窗口,如果满足条件,就缩小左边界,缩小到不满足条件时,记录上一个状态的左边界,实现方法:满足条件就一直ans=min(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++.h>
using namespace std;
using PII=pair<int,int>;
vector<PII> acc;

int main(){
int n;
cin>>n;
vector<int> a(n+1), b(n+1);
map<int,int> mp;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]=i;
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
if(a[i]!=b[i]){
int c=mp[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]);
}
}
cout<<"Yes"<<'\n'<<acc.size()<<'\n';
for(auto [x,y]:acc){
cout<<x<<' '<<y<<'\n';
}
return 0;
}

K题代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int nu1=0;
int nu2=0;
int s;
int x,y;
for(int i=0;i<n;i++){
if(i==0){
cin>>x>>y;
nu1+=x;
nu2+=y;
s=x;
}else{
cin>>x>>y;
if(nu2<(x-s)){
nu1+=(x-s)-nu2;
nu2=y;
s=x;
}else{
nu2+=y-(x-s);
s=x;
}
}
}
cout<<nu1<<'\n';

}
return 0;
}

G题代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int c[30];
signed main(){
int n;
cin>>n;
//vector <char> a(n);
string s;
cin>>s;
int r=0,l=0;
int u=0;
int ans=1000000;
for(int i=0;i<n;i++){
c[s[i]-'a']++;
if(c['s'-'a']>=1&&c['i'-'a']>=1&&c['l'-'a']>=2&&c['v'-'a']>=1&&c['e'-'a']>=1&&c['w'-'a']>=1&&c['o'-'a']>=1&&c['f'-'a']>=1&&c['r'-'a']>=1){
u=1;
l=i;

}
while(u){
if(c['s'-'a']>=1&&c['i'-'a']>=1&&c['l'-'a']>=2&&c['v'-'a']>=1&&c['e'-'a']>=1&&c['w'-'a']>=1&&c['o'-'a']>=1&&c['f'-'a']>=1&&c['r'-'a']>=1){
u=1;
ans=min(ans,(l-r));
}else {
u=0;
}
c[s[r]-'a']--;
r++;
}
}
if(ans==1000000){
cout<<-1;
}else cout<<ans;
return 0;
}

C题代码

#include <bits/stdc++.h>
using namespace std;
struct Player {
int id; // 选手编号
int score; // 总得分
int penalty; // 总罚时(所有AC题罚时的最大值)
bool ac[25]; // 标记每题是否已AC(M≤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;

vector<int> S(M + 1);
for (int i = 1; i <= M; ++i)
cin >> S[i];

vector<Player> 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]++;
}
}


vector<Player> 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) {
// 和前一名得分、罚时都不同,排名更新为i+1
if (!(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;
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询