26.3.24 1600-1900 板刷日记

2181 F. Fragmented Nim

tag:博弈论

谁先给对手送去一个大于 \(1\) 的堆,谁就必输

判断 \(1\) 的个数就行

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n;
    cin>>n;

    vector<int> a(n+1);
    int cnt=0;

    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]==1) cnt++;
    }

    if(cnt==n){
        if(n&1) cout<<"Alice\n";
        else cout<<"Bob\n";
    }
    else{
        if(cnt&1) cout<<"Bob\n";
        else cout<<"Alice\n";
    }
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;

    while(ct--){
        solve();
    }
}

2201 A1. Lost Civilization (Easy Version)

tag: 单调栈,贪心,妙妙题

用一个栈,把数从后往前放进去,能消掉就消掉,得到 Easy Version 的答案

同时,也得到每个数字,前面最近的可以把它消掉的数字位置 (Hard Version 需要用到)

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n;
    cin>>n;

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

    vector<int> stk;
    
    for(int i=n;i>=1;i--){
        while(stk.size() && a[i]+1==stk.back()){
            stk.pop_back();
        }
        stk.push_back(a[i]);

    }

    cout<<stk.size()<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;

    while(ct--){
        solve();
    }
}

2201 A2. Lost Civilization (Hard Version)

经典计算每个点的贡献,计算每个点会在多少个区间内有贡献即可

如果这个区间的左端点,超过了这个可以消掉当前数字的最近数字位置,则当前数字不会对当前区间产生贡献

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n;
    cin>>n;

    vector<int> a(n+1);
    int ans=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }

    vector<int> L(n+1);
    vector<int> stk;

    for(int i=n;i>=1;i--){
        while(stk.size() && a[i]+1==a[stk.back()]){
            L[stk.back()]=i;
            stk.pop_back();
        }
        stk.push_back(i);
    }

    for(int i=1;i<=n;i++){
        ans+=(i-L[i])*(n-i+1);
    }
    
    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;

    while(ct--){
        solve();
    }
}

2196 B. Another Problem about Beautiful Pairs

tag: 根号分治

分类讨论 \(a[i]\) 是否大于 \(\sqrt n\) 即可

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    int n;
    cin>>n;

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

    int ans=0;
    int B=sqrt(n);

    //ai * aj = j-i

    for(int i=1;i<=B;i++){
        for(int j=1;j<=n;j++){
            //idx= j - ai*aj
            int idx=j-i*a[j];
            if(idx>=1 && idx<=n && a[idx]==i) ans++;
        }
    }

    for(int i=1;i<=n;i++){
        if(a[i]<=B) continue;
        for(int aj=1;aj<=B;aj++){
            int j=a[i]*aj+i;
            if(j>=1 && j<=n && a[j]==aj) ans++;
        }
    }

    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;

    while(ct--){
        solve();
    }
}

tag: DFS,树上 DP

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 1e9+7;

void solve(){
    int n;
    cin>>n;

    vector<vector<int>> g(n+1);
    g[0].push_back(1);

    for(int i=1;i<=n;i++){
        int u,v;
        cin>>u>>v;
        if(u==0 && v==0) continue;
        g[i].push_back(u);
        g[i].push_back(v);
    }
    vector<int> f(n+1);
    vector<int> ans(n+1);

    auto dfs=[&](auto dfs,int u,int pre)-> void {
        if(g[u].size()==0){
            f[u]=1;
        }
        else{
            for(auto v:g[u]){
                dfs(dfs,v,u);
                f[u]+=f[v];
            }
            f[u]+=3;
            f[u]%=mod;
        }    
    };

    dfs(dfs,1,0);

    queue<int> q;
    q.push(1);
    ans[1]=f[1];
    vector<int> st(n+1);
    st[0]=1,st[1]=1;

    while(q.size()){
        auto u=q.front();
        q.pop();

        for(auto v:g[u]){
            if(st[v]) continue;
            st[v]=1;
            ans[v]=ans[u]+f[v];
            ans[v]%=mod;
            q.push(v);
        }
    }

    for(int i=1;i<=n;i++){
        cout<<ans[i]<<" ";
    }

    cout<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;

    while(ct--){
        solve();
    }
}
posted @ 2026-03-27 20:41  LYET  阅读(20)  评论(0)    收藏  举报