2026暑期牛客多校7题解

2026暑期牛客多校7题解
c7ecbfbf84a44700ae08791534994a10
//K
#include<bits/stdc++.h>
using namespace std;
int n;
vector<string>name[30];
int ans[30]; // 第几轮确定的答案
int cnt;
bool fin[30];
void make(int round) // 第几轮
{
    map<stringint>check;
    vector<int>id[30];
    int tot = 0;
    for (int i = 1; i <= n; i++)
    {
        if (fin[i]) continue;
        string s = "";
        for (int j = 0; j < name[i].size(); j++)
        {
            if (j < round)
                s += name[i][j];
            else s += name[i][j][0];
        }
        if (!check[s])
        {
            tot++;
            check[s] = tot;
        }
        id[check[s]].push_back(i);
    }
    for (int i = 1; i <= tot; i++)
    {
        if (id[i].size() == 1)
        {
            fin[id[i][0]] = 1;
            ans[id[i][0]] = round;
            cnt++;
        }
    }
}
int main()
{
    cin >> n;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    for (int i = 1; i <= n; i++)
    {
        string s;
        getline(cin, s);
        string tmp = "";
        for (int j = 0; j < s.size(); j++)
        {
            if (s[j] == ' ')
            {
                name[i].push_back(tmp);
                tmp "";
            }
            else tmp += s[j];
        }
        if (!tmp.empty())
            name[i].push_back(tmp);
    }
    for (int i = 0; cnt != n; i++)
        make(i);
    for (int i = 1; i <= n; i++)
    {
        string res = "";
        for (int j = 0; j < name[i].size(); j++)
        {
            if (j < ans[i])
                cout << name[i][j];
            else cout << name[i][j][0];
        }
        cout << '\n';
    }
    return 0;
}
//L
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, ans;
signed main()
{
    cin >> n;
    for (int b = 1; b * b <= n; b++)
    {
        int s = (n + b) / (b * (b + 1));
        if (!s) break;
        ans += (s - 1) * b;
        ans += min(b, n - b * s * (b + 1) + b + 1);
    }
    cout << ans;
    return 0;
}
//G
#include<bits/stdc++.h>
using namespace std;const int maxn = 2e5 + 10;
int n;
int a[maxn], ans;int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    sort (a 1, a + n + 1);
    for (int i = 2; i <= n; i++)
        if (a[i] != a[i - 1]) ans++;
    cout << (ans <= 2) ? "YES" : "NO";
    return 0;
}
//A
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e5 + 10;
int T, n;
int a[maxn];
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> T;
    while (T--)
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        int ans = 0;
        for (int s = 30; s >= 0; s--)
        {
            bool ok = 1;
            // 假设购买剩下的所有位
            int mask = (ans | ((1 << s) - 1));            // 判断这一位取 0 能不能成功
            int pre = (a[1] ^ (a[1] & mask)); // 操作第一个使得第一个最小
            for (int i = 2; i <= n; i++)
            {
                if ((a[i] | mask) < pre)
                {
                    ok 0;
                    break;
                }
                // 这是可以的,构造一个最小的满足的即可
                // 先把这一个调到最小,然后逐步增大
                int res = (a[i] ^ (a[i] & mask));
                for (int j = 30; j >= 0; j--)
                {
                    if (!((mask >> j) & 1)) continue;
                    // 如果这一位取 0 完全做不到,那就只能取 1
                    if ((res | (mask & ((1ll << j) - 1))) < pre)
                        res |= (1ll << j);
                }
                pre = res;
            }
            if (!ok)
                ans |= (1ll << s);
        }
        cout << ans << '\n';
    }
    return 0;
}
//D
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int n, x;
int a[maxn], b[maxn], apos[maxn], bpos[maxn];
bool vis[maxn];
vector<int>ans;
int main()
{
    cin >> n >> x;
    for (int i = 1; i <= n; i++)
        cin >> a[i], apos[a[i]] = i;
    for (int i = 1; i <= n; i++)
        cin >> b[i], bpos[b[i]] = i;
    int l1 = 1, l2 = 1;
    while (1)
    {
        while (a[l1] != x && vis[a[l1]])
            l1++;
        while (b[l2] != x && vis[b[l2]])
            l2++;
        if (a[l1] == b[l2])
            break;
        if (a[l1] == x)
        {
            vis[b[l2]] 1;
            ans.push_back(b[l2]);
        }
        else if (b[l2] == x)
        {
            vis[a[l1]] 1;
            ans.push_back(a[l1]);
        }
        else
        {
            if (bpos[a[l1]] <= apos[b[l2]])
            {
                vis[a[l1]] 1;
                ans.push_back(a[l1]);
            }
            else
            {
                vis[b[l2]] 1;
                ans.push_back(b[l2]);
            }
        }
    }
    if (ans.size() == n - 1)
    {
        cout << "YES" << '\n';
        for (int i = 0; i < n - 1; i++)
            cout << ans[i] << ' ';
    }
    else cout << "NO";
    return 0;
}
//C
#include<bits/stdc++.h>
#define F first
#define S second
using namespace std;
vector<pair<int,int> > G[1000010];
vector<int> H[1000010],r,g,b;
int x,y,z,col[1000010],vis[1000010],d[1000010],ans[1000010];
int id1(int p,int q){return (p-1)*y+q;
}
int id2(int p,int q){return (p-1)*z+q+x*y;
}
int id3(int p,int q){return (p-1)*z+q+x*y+x*z;
}
void add(int u,int v,int c){G[u].push_back({v,c});G[v].push_back({u,c});
}
void addd(int u,int v,int c){if(!c){H[u].push_back(v);d[v]++;return ;}H[v].push_back(u);d[u]++;
}
void dfs(int u){vis[u]=1;for(int k=0;k<G[u].size();k++){pair<int,int> e=G[u][k];int v=e.first,w=e.second;col[v]=col[u]^w;if(!vis[v]){dfs(v);}}
}
int main(){ios::sync_with_stdio(0);cin>>x>>y>>z;for(int i=1;i<=x;i++){for(int j=1;j<=y;j++){string s;cin>>s;for(int k=1;k<=z;k++){add(id1(i,j),id2(i,k),s[k-1]=='R');add(id2(i,k),id3(j,k),s[k-1]=='B');}}}dfs(1);for(int i=1;i<=x;i++){for(int j=1;j<=y;j++){addd(i,j+x,col[id1(i,j)]);}}for(int i=1;i<=x;i++){for(int j=1;j<=z;j++){addd(i,j+x+y,col[id2(i,j)]);}}for(int i=1;i<=y;i++){for(int j=1;j<=z;j++){addd(i+x,j+x+y,col[id3(i,j)]);}}queue<int> q;for(int i=1;i<=x+y+z;i++){if(!d[i]){q.push(i);}}int ccnt=0;while(!q.empty()){int u=q.front();q.pop();ans[u]=++ccnt;for(int k=0;k<H[u].size();k++){int v=H[u][k];d[v]--;if(!d[v]){q.push(v);}}}for(int i=1;i<=x;i++){cout<<ans[i]<<" ";}cout<<endl;for(int i=1;i<=y;i++){cout<<ans[i+x]<<" ";}cout<<endl;for(int i=1;i<=z;i++){cout<<ans[i+x+y]<<" ";}cout<<endl;return 0;
}