AtCoder Beginner Contest 370

A - Raise Both Hands

思路

小模拟

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    using namespace std;
    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef priority_queue<int> PQ;

    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int a,b;

    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>a>>b;
        if(a==1&&b==0)cout<<"Yes"<<endl;

        else if(a==0&&b==1)cout<<"No"<<endl;

        else cout<<"Invalid"<<endl;


        return 0;
    }

B - Binary Alchemy

思路

小模拟,注意读懂题目

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    using namespace std;
    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef priority_queue<int> PQ;

    const int N = 110, MAX = 1e9, INF = -1e9;

    int n;
    int a[N][N];

    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                cin>>a[i][j];
            }
        }
        int e=1;
        for(int i=1;i<=n;i++){
            if(e>=i)e=a[e][i];
            else e=a[i][e];
        }
        cout<<e<<endl;
        return 0;
    }

C - Word Ladder

思路

根据题目发现我们需要找到最小字典序的删除方式,对比\(S\)串和\(T\)串,先顺序将\(S\)串的字符向着\(T\)串变小,再逆序变大即可

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    using namespace std;
    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef priority_queue<int> PQ;

    const int N = 110, MAX = 1e9, INF = -1e9;

    string a;
    string b;

    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>a>>b;
        int l=a.size();
        string s=a;
        int num=0;
        for(int i=0;i<l;i++){
            if(a[i]!=b[i])num++;
        }
        cout<<num<<endl;
        for(int i=0;i<l;i++){
            if(a[i]-b[i]>0){
                s[i]=b[i];
                cout<<s<<endl;
            }
        }
        for(int i=l-1;i>=0;i--){
            if(a[i]-b[i]<0){
                s[i]=b[i];
                cout<<s<<endl;
            }
        }


        return 0;
    }

D - Cross Explosion

思路

考虑使用set处理,每次删除都是\(log\)级别,时间复杂度符合要求,定义\(g1\),\(g2\)分别储存每行/列中未被爆炸的索引,最后使用二分查找,模拟即可

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    using namespace std;
    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef priority_queue<int> PQ;

    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int h,w,q;
    int r,c;
    int ans=0;

    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
    	cin>>h>>w>>q;
    	vector<set<int>> g1(h);//每行储存未被爆炸的列的索引
    	vector<set<int>> g2(w);//每列储存未被爆炸的行的索引
    	for(int i=1;i<=h;i++){
    		for(int j=1;j<=w;j++){
    			g1[i].insert(j);
    			g2[j].insert(i);
    		}
    	}

    	auto erase = [&](int i,int j){g1[i].erase(j),g2[j].erase(i);};

    	while(q--)
    	{
    		cin>>r>>c;

    		if(g1[r].count(c)){
    			erase(r,c);
    			continue;
    		}

    		//up
    		{
    			auto it = g2[c].lower_bound(r);
    			if(it != g2[c].begin())erase(*prev(it),c);
    		}

    		//down
    		{
    			auto it = g2[c].lower_bound(r);
    			if(it != g2[c].end())erase(*it,c);
    		}

    		//left
    		{
    			auto it = g1[r].lower_bound(c);
    			if(it != g1[r].begin())erase(r,*prev(it));
    		}

    		//right
    		{
    			auto it = g1[r].lower_bound(c);
    			if(it != g1[r].end())erase(r,*it);
    		}

    	}
        
    	for(int i=1;i<=h;i++){
    		ans+=g1[i].size();
    	}
    	cout<<ans<<endl;

        return 0;
    }

t.b.c

posted @ 2024-09-08 16:02  Oaths  阅读(16)  评论(0)    收藏  举报