题目链接: https://codeforces.com/gym/105909
榜单链接:https://board.xcpcio.com/provincial-contest%2F2025%2Fhebei?group=official
1. H签到题
#include <bits/stdc++.h>
using namespace std;
int main(){
string s; cin>>s; int n=s.size();
if(s.substr(n-12,n)=="isallyouneed"){
cout<<"Yes"<<endl;
cout<<s.substr(0,n-12)<<endl;
}else{
cout<<"No"<<endl;
}
return 0;
}
2. Problem K. UNO!
用数组去模拟链表
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin>>n>>m;
vector<int> a(n);
for (int i=0;i<n;i++) cin>>a[i];
string s;
cin >> s;
vector<int> pre(n),nxt(n);
for(int i=0;i<n;i++){
nxt[i]=(i+1)%n;
pre[i]=(i-1+n)%n;
}
vector<bool> alive(n,true);
int dir=1,pos=0;
for(int i=0;i<m;i++){
int cur=pos; char ch=s[i];
auto x=[&](int num){
return nxt[num];
};
auto y=[&](int num){
return pre[num];
};
int nxt_pos=-1;
if(ch=='R'){
dir*=-1;
if(dir==1){
nxt_pos=x(cur);
}else{
nxt_pos=y(cur);
}
}else if(ch=='S'){
if(dir==1){
int f=x(cur);
nxt_pos=x(f);
}else{
int f=y(cur);
nxt_pos=y(f);
}
}else if(ch=='D'){
int v;
if (dir==1){
v=x(cur);
}else{
v=y(cur);
}
a[v]+=2;
if(dir==1){
int s=x(v);
nxt_pos=s;
} else {
int s=y(v);
nxt_pos=s;
}
}else{
if(dir==1){
nxt_pos=x(cur);
}else {
nxt_pos=y(cur);
}
}
a[cur]--;
if(a[cur]==0) {
alive[cur]=false;
int l=pre[cur];
int r=nxt[cur];
nxt[l]=r;
pre[r]=l;
}
pos=nxt_pos;
}
for (int x : a) cout << x << endl;
return 0;
}
Problem M. 第九届河北省大学生程序设计竞赛
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin>>n>>m; //题数/队数
vector<bitset<18>> a(m); //各队
for(int i=0;i<m;i++){
string s; cin>>s;
for(int j=0;j<n;j++){
a[i][j]=(s[j]=='1');
}
}
int rk_p,rk_q,rk_r; //排名
cin>>rk_p>>rk_q>>rk_r; //过题数
int score_p,score_q,score_r;
cin>>score_p>>score_q>>score_r;
for(int k=0;k<(1<<n);k++){
int bits=__builtin_popcount(k);
if(bits<10||bits>13) continue;
vector<int> scores;
for(int i=0;i<m;i++){
int cnt=0;
for(int j=0;j<n;j++){
if((k>>j&1)&&a[i][j]){
cnt++;
}
}
scores.push_back(cnt);
}
sort(scores.begin(),scores.end(),greater<int>());
if(scores[rk_p-1]==score_p&&scores[rk_q-1]==score_q&&scores[rk_r-1]==score_r){
vector<int> res;
for(int j=0;j<n;j++){
if(k>>j&1) res.push_back(j+1);
}
cout<<res.size()<<endl;
for(int& x: res) cout<<x<<" ";
cout<<endl;
return 0;
}
}
cout<<-1<<endl;
return 0;
}
注:完成三题后你已经能稳铜奖了
Problem J. Generate 01 String
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
stack<char> st;
int cnt_1 = count(s.begin(), s.end(), '1');
int cnt_0 = count(s.begin(), s.end(), '0');
if (cnt_1 != cnt_0) {
cout << -1 << endl;
return 0;
}
cout << cnt_1 << endl;
int i = 0;
int pos = 1;
while (i < s.size()) {
char c = s[i];
if (st.empty() || st.top() == c) {
st.push(c);
cout << pos << " " << c - '0' + 1 << endl;
}else{
st.pop();
pos++;
}
i++;
}
return 0;
}
注:完成四题后是稳银奖了
Problem D. 金麦园
不太会
#include<bits/stdc++.h>
using ll=long long;
using namespace std;
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
ll n,k; std::cin>>n>>k;
std::vector<ll> a(n);
for(int i=0;i<n;i++) std::cin>>a[i];
std::sort(a.begin(),a.end());
std::vector<ll> b,freq;
ll cur_num=a[0];
int cnt=1;
for(int i=1;i<n;i++){
if(a[i]==cur_num){
cnt++;
}else{
b.push_back(cur_num); freq.push_back(cnt);
cur_num=a[i];
cnt=1;
}
}
b.push_back(cur_num); freq.push_back(cnt);
std::vector<ll> c(b.size()),d(b.size());
for(int i=0;i<b.size();i++){
if(i==0){
c[i]=freq[i];
d[i]=b[i]*freq[i];
}else{
c[i]=c[i-1]+freq[i];
d[i]=d[i-1]+b[i]*freq[i];
}
}
auto solve = [&](ll d) -> ll {
ll res = 0;
ll cur = 0;
for(int i=0;i<b.size();i++){
ll ck = b[i] + d;
while(cur+1<b.size() && b[cur+1]<=ck) cur++;
res += freq[i]*(freq[i]-1)/2 + freq[i]*(c[cur]-c[i]);
if(res >= k) return res;
}
return res;
};
ll left=0, right=b.back()-b[0];
while(left<right){
ll mid=left+(right-left)/2;
if(solve(mid)>=k){
right=mid;
}else{
left=mid+1;
}
}
ll res=0, cur=0;
for(int i=0;i<b.size();i++){
ll ck=b[i]+left-1;
while(cur+1<b.size() && b[cur+1]<=ck) cur++;
if(i==0){
res += freq[i]*d[cur] - freq[i]*b[i]*c[cur];
}else{
res += freq[i]*(d[cur]-d[i-1]) - freq[i]*b[i]*(c[cur]-c[i-1]);
}
}
res += (k-solve(left-1))*left;
std::cout<<res<<std::endl;
return 0;
}
Problem A. 棋盘
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin>>T;
while(T--){
int n; cin>>n;
vector<vector<long long>> g(3,vector<long long>(n+1));
for(int r=1;r<3;r++){
for(int c=1;c<=n;c++){
cin>>g[r][c];
}
}
vector<vector<long long>> prefix(3,vector<long long>(n+1,0));
for(int r=1;r<=2;r++){
for(int c=1;c<=n;c++){
prefix[r][c]=prefix[r][c-1]+g[r][c];
}
}
int p=n/2,q=p+1;
auto solve=[&](long long x,long long y)->long long{
if(x>y) return 0;
return prefix[1][y]+prefix[2][y]-(prefix[1][x-1]+prefix[2][x-1]);
};
// long long left_sum=prefix[0][n/2]+prefix[1][n/2];
// long long right_sum=(prefix[0][n]-prefix[0][n/2])+(prefix[1][n]-prefix[1][n/2]);
// if(left_sum>right_sum) cout<<"Mandy"<<endl;
// else if(left_sum<right_sum) cout<<"brz"<<endl;
// else{
// int sum1=prefix[0][n]; int sum2=prefix[1][n];
// if(sum1>sum2) cout<<"Mandy"<<endl;
// else if(sum1<sum2) cout<<"brz"<<endl;
// else cout<<"draw"<<endl;
// }
if(solve(1,p)>solve(q,n)) cout<<"Mandy"<<endl;
else if(solve(1,p+1)<solve(q+1,n)) cout<<"brz"<<endl;
else if(prefix[1][n]<prefix[2][n]&&solve(1,p)==solve(q,n)) cout<<"draw"<<endl;
else if(prefix[1][n]>prefix[2][n]&&solve(1,p + 1)==solve(q+1,n)) cout<<"draw"<<endl;
else if(prefix[1][n]>prefix[2][n]) cout<<"Mandy"<<endl;
else if(prefix[1][n]<prefix[2][n]) cout<<"brz"<<endl;
else if(prefix[1][n]==prefix[2][n]) cout<<"draw"<<endl;
}
return 0;
}
//两行n列
银首
Problem F. 不死国的生命树
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
const int LOGN = 20;
int n, q;
int aVal[MAXN];
int parentArr[MAXN];
vector<int> children[MAXN];
int depthArr[MAXN];
int nxt1[MAXN];
int succ[LOGN+1][MAXN];
int savedPrev[MAXN];
int lastPos[MAXN];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> aVal[i];
}
parentArr[1] = 0;
for (int i = 2; i <= n; i++) {
int p;
cin >> p;
parentArr[i] = p;
children[p].push_back(i);
}
{
queue<int> que;
depthArr[1] = 1;
que.push(1);
while (!que.empty()) {
int u = que.front(); que.pop();
for (int v : children[u]) {
depthArr[v] = depthArr[u] + 1;
que.push(v);
}
}
}
for (int v = 0; v <= n + 2; v++) {
lastPos[v] = 0;
}
vector<pair<int,int>> stk;
nxt1[1] = 0;
savedPrev[1] = lastPos[ aVal[1] ];
lastPos[ aVal[1] ] = 1;
stk.emplace_back(1, 0);
while (!stk.empty()) {
auto &top = stk.back();
int cur = top.first;
int &idx = top.second;
if (idx < (int)children[cur].size()) {
int v = children[cur][idx++];
int wantVal = aVal[v] + 1;
if (wantVal <= n + 1) nxt1[v] = lastPos[wantVal];
else nxt1[v] = 0;
savedPrev[v] = lastPos[ aVal[v] ];
lastPos[ aVal[v] ] = v;
stk.emplace_back(v, 0);
} else {
lastPos[ aVal[cur] ] = savedPrev[cur];
stk.pop_back();
}
}
for (int i = 1; i <= n; i++) {
succ[0][i] = nxt1[i];
}
for (int k = 1; k <= LOGN; k++) {
for (int i = 1; i <= n; i++) {
int mid = succ[k-1][i];
succ[k][i] = (mid == 0 ? 0 : succ[k-1][mid]);
}
}
cin >> q;
while (q--) {
int s, t;
cin >> s >> t;
int minDepth = depthArr[t];
int current = s;
int ans = 1;
for (int k = LOGN; k >= 0; k--) {
int nx = succ[k][current];
if (nx != 0 && depthArr[nx] >= minDepth) {
current = nx;
ans += (1 << k);
}
}
cout << ans << endl;
}
return 0;
}