AtCoder Beginner Contest 407 A-F

A - Approximation

点击查看代码
#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;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    double a,b;
    cin>>a>>b;
    double c=a/b;

    int d=c;

    int e=c+1;
    if(c-d>e-c){
        cout<<e<<endl;
    }
    else cout<<d<<endl;

}   

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

    int ct=1;
    // cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

B - P(X or Y)

点击查看代码
#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;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    set<pii> s1,s2;

    int a,b,cnt=0;
    cin>>a>>b;
    for(int i=1;i<=6;i++){
        for(int j=1;j<=6;j++){
            if(i+j>=a || abs(i-j)>=b) cnt++;
        }
    }

    double ans = (double)cnt/36;
    printf("%.11f",ans);
    // cout<<cnt;
}   


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

    int ct=1;
    // cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

C - Security 2

点击查看代码
#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;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){
    string s;
    cin>>s;
    int n=s.size();

    vector<int> a(n);
    for(int i=0;i<n;i++){
        a[i]=s[i]-'0';
    }

    int ans=n;
    int cnt=0;

    for(int i=n-1;i>=0;i--){
        a[i]-=cnt;
        a[i]%=10;
        a[i]=(a[i]+10)%10;
        ans+=a[i];
        cnt+=a[i];
    }
    cout<<ans<<endl;
}   

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

    int ct=1;
    // cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

D - Domino Covering XOR

数据范围很小,直接dfs就行,dfs中有很多细节要注意

点击查看代码
#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;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

int dx[]={1,0};
int dy[]={0,1};

void solve(){
    int n,m;

    cin>>n>>m;
    vector<vector<int>> g(n+10,vector<int>(m+10));
    vector<vector<int>> st(n+10,vector<int>(m+10));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
        }
    }

    int ans=0;

    auto dfs = [&](auto dfs,int x,int y)->void {
        int tmp=0;
        //检查当前方案
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(!st[i][j]) tmp^=g[i][j];
            }
        }
        ans=max(ans,tmp);

        for(int i=x;i<=n;i++){
            for(int j = (i == x ? y : 1);j<=m;j++){
                if(!st[i][j]){
                    st[i][j]=1;
                    for(int k=0;k<2;k++){
                        int a=i+dx[k];
                        int b=j+dy[k];

                        if(a>=1 && a<=n && b>=1 && b<=m && !st[a][b]){
                            st[a][b]=1;
                            if(j<m) dfs(dfs,i,j+1);
                            else dfs(dfs,i+1,1);
                            st[a][b]=0;
                        }
                    }
                    st[i][j]=0;
                }
            }
        }
    };

    dfs(dfs,1,1);
    cout<<ans;
}   

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

    int ct=1;
    // cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

E - Most Valuable Parentheses

经典括号序列题目

括号序列的一种定义是同时满足以下 2 个条件:

  1. 对于所有 1≤ i ≤ 2N ,在 S1,…,Si 中至少有一半( i/2 上取整 )是 (
  2. 整个序列 S1 , … , S2N 中恰好有 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;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){   
    int n,ans=0;
    cin>>n;
    priority_queue<int> q;

    for(int i=1;i<=2*n;i++){
        int val;
        cin>>val;

        q.push(val);
        if(i&1){
            ans+=q.top();
            q.pop();
        }
    }

    cout<<ans<<endl;
}   

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

    int ct=1;
    cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}

F - Sums of Sliding Window Maximum

对每个a[i],找到左右边界l,r,满足只要选中的区间严格在区间(l,r)内(或者说在区间[l+1,r-1]中),则a[i]就是这个区间的答案

使用单调栈可以找到每个i的l,r

注意因为会存在重复元素,所以为了保证区间内的重复元素只会对答案产生一次贡献,在找l,r时,让a[l]>a[i], a[r]>=a[i]即可

y=min(i-l[i],r[i]-i), x=max(i-l[i],r[i]-i)

到这一步,会发现a[i]对答案的贡献是一个梯形,从k=1到k=y上升,y-x不变,从x开始下降

用二阶差分可以维护

点击查看代码
#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;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;

void solve(){   
    int n;
    cin>>n;
    vector<int> a(n+10),l(n+10),r(n+10,n+1),ans(n+10);

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

    stack<int> stk;
    for(int i=1;i<=n;i++){
        while(stk.size() && a[stk.top()]<=a[i]){
            stk.pop();
        }
        if(stk.size()) l[i]=stk.top();
        stk.push(i);
    }

    while(stk.size()) stk.pop();

    for(int i=n;i>=1;i--){
        while(stk.size() && a[stk.top()]<a[i]){
            stk.pop();
        }
        if(stk.size()) r[i]=stk.top();
        stk.push(i);
    }

    for(int i=1;i<=n;i++){
        // cout<<l[i]<<" "<<r[i]<<endl;
        int x=max(i-l[i],r[i]-i);
        int y=min(i-l[i],r[i]-i);
        ans[1]+=a[i];
        ans[y+1]-=a[i];
        ans[x+1]-=a[i];
        ans[x+y+1]+=a[i];
    }

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

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


}   

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

    int ct=1;
    // cin>>ct;
    while(ct--){
        solve();
    }

    return 0; 
}
posted @ 2025-05-26 21:39  LYET  阅读(53)  评论(0)    收藏  举报