首页 > 其他分享 >SMU Summer 2023 Contest Round 5

SMU Summer 2023 Contest Round 5

时间:2023-07-21 17:11:54浏览次数:47  
标签:Summer cout Contest int SMU cin long ++ include

SMU Summer 2023 Contest Round 5

A. Points in Segments

\(\mathcal{O}(n \times m)\) 做法数据范围小,直接把每次的\(l - r\)跑一遍标记一下,最后跑一遍循环统计哪些没有被标记的并且输出就好了

#include <bits/stdc++.h>
#define int long long

using namespace std;

signed main() {

    ios::sync_with_stdio(false);cin.tie(nullptr);

    int n,m;
    cin >> n >> m;
    vector<int> a(m + 1);
    int ans = 0;
    for(int i = 0;i < n;i ++){
        int x,y;
        cin >> x >> y;
        for(int j = x;j <= y;j ++){
            a[j] = 1;
        }
    }
    
    for(int i = 1;i <=m;i ++ ){
        ans += (a[i] == 0);
    }
    
    if(!ans){
        cout << 0 << endl;
    }else{
        cout << ans << endl;
        for(int i = 1;i <= m;i ++)
            if(!a[i])
                cout << i << ' ';
    }

    return 0;
}

\(\mathcal{O}(n + m)\) 做法数据再大点就可以开个前缀和数组,让每次输入的\(l\)所在的值为1,\(r\)的值为-1,然后跑一遍前缀和,统计为0的个数就行

#include <bits/stdc++.h>

using namespace std;

int main() {
	
	int n, m;
	cin >> n >> m;
	vector<int> cnt(m + 2);
	for (int i = 0; i < n; ++i) {
		int l, r;
		cin >> l >> r;
		++cnt[l];
		--cnt[r + 1];
	}
	for (int i = 1; i <= m; ++i)
		cnt[i] += cnt[i - 1];
	
	vector<int> ans;
	for (int i = 1; i <= m; ++i) {
		if (cnt[i] == 0)
			ans.push_back(i);
	}
	
	cout << ans.size() << endl;
	for (auto it : ans) cout << it << " ";
	cout << endl;
	
	return 0;
}

B. Obtaining the String

\(\mathcal{O}(n^3)\) 长度只有50,直接跑暴力了,每次对比s和t是否相同,不同就去s后面找到当前与t相同的,然后从后一个一个交换过来,判断s能不能变成b就看s里每个字符数量和b是不是一样

#include <bits/stdc++.h>
#define int long long

using namespace std;

signed main() {

    ios::sync_with_stdio(false);cin.tie(nullptr);

    int n;
    cin >> n;
    string s,t;
    cin >> s >> t;

    if(s == t){
        cout << 0 << endl;
        return 0;
    }

    vector<int> numa(100),numb(100);
    for(int i = 0;i < s.size();i ++){
        numa[s[i] - 'a']++;
        numb[t[i] - 'a']++;
    }

    for(int i = 0;i <= 100;i ++){
        if(numa[i] != numb[i]){
            cout << -1 << endl;
            return 0;
        }
    }

    int ans = 0;
    vector<int> res;
    for(int i = 0;i < n - 1;i ++){
        if(s[i] == t[i]) continue;
        for(int j = i + 1;j < n;j ++){
            if(s[j] == t[i]){
                for(int k = j;k > i;k--){
                    swap(s[k],s[k - 1]);
                    ans++;
                    res.push_back(k);
                }
                break;
            }
        }
    }

    cout << ans << endl;
    for(auto i : res)
        cout << i << ' ';

    return 0;
}

\(\mathcal{O}(n^2)\) 做法就是在后面找到了之后单独拿出来从后跑一遍

#include <bits/stdc++.h>

using namespace std;

int main() {
	
	int n;
	string s, t;
	cin >> n >> s >> t;
	
	vector<int> ans;
	for (int i = 0; i < n; ++i) {
		if (s[i] == t[i]) continue;
		int pos = -1;
		for (int j = i + 1; j < n; ++j) {
			if (s[j] == t[i]) {
			        pos = j;
			        break;
			}
		}
		if (pos == -1) {
			cout << -1 << endl;
			return 0;
		}
		for (int j = pos - 1; j >= i; --j) {
			swap(s[j], s[j + 1]);
			ans.push_back(j);
		}
	}
	
	cout << ans.size() << endl;
	for (auto it : ans) cout << it + 1 << " ";
	cout << endl;
	
	return 0;
}

C. Songs Compression

\(\mathcal{O}(nlog_2n)\) 先把所有歌都压缩,如果还是小于\(m\)的话直接输出-1,否则就将内存的差值从小到大排序,每次从最小的差值开始加,看看能还原多少首歌,最后用总数去减掉还原的就是压缩的个数了

#include <bits/stdc++.h>
#define int long long

using namespace std;

typedef pair<int,int> PII;

signed main() {

    ios::sync_with_stdio(false);cin.tie(nullptr);

    int n,m;
    cin >> n >> m;

    vector<PII> a(n);
    for(auto& [x,y] : a)
        cin >> x >> y;

    sort(a.begin(),a.end(),[](PII x,PII y){
        return x.first - x.second < y.first - y.second;
    });

    int ans = 0, now = 0;
    for(auto i : a){
        now += i.second;
    }
    if(now > m){
        cout << -1 << endl;
        return 0;
    }
    
    for(auto i : a){
        if(i.first - i.second + now <= m){
            now += i.first - i.second;
            ans ++;
        }else
            break;
    }
    cout << n - ans << endl;

    return 0;
}

D. Walking Between Houses

\(\mathcal{O}(k)\) 首先$s < k \(和\)s < (n - 1) \cdot k\(这两种情况肯定是不行的,至于为什么,可以自己推导一下,然后就是一个贪心的思想,每次走当前能走的最远距离,即每次能走的距离为\)min(n-1,s-(k-1))$,然后s也要跟着更新

#include <bits/stdc++.h>
#define int long long

using namespace std;

signed main() {

    ios::sync_with_stdio(false);cin.tie(nullptr);

    int n,k,s;
    cin >> n >> k >> s;

    if(s > (n - 1) * k || s < k){
        cout << "NO" << endl;
        return 0;
    }

    cout << "YES" << endl;
    int sum = 0, now = 1;
    for(; k;k-- ){
        int i = min(s - k + 1, n - 1);
        s -= i;
        if( i + now > n){
            cout << now - i << ' ';
            now -= i;
        }else {
            cout << now + i << ' ';
            now += i;
        }
    }

    return 0;
}

后面摆了,反正cf分还没到那个段位(\(Orz\)

标签:Summer,cout,Contest,int,SMU,cin,long,++,include
From: https://www.cnblogs.com/Kescholar/p/17571959.html

相关文章

  • Atcoder Regular Contest 124 E - Pass to Next
    首先第一步是一个浅显的观察:我们要求的是所有可能的最终序列的贡献之和,如果能改为计算所有操作序列的贡献之和那问题会简单很多,并且我们惊奇地发现,如果一组\(x_i\)全大于\(0\),那么把它们全减去\(1\)以后得到的答案序列不会改变,而对于任意一种可能的最终序列,必然存在一组\(\m......
  • Atcoder Grand Contest 057 D - Sum Avoidance
    先来找些性质:\(A\)中最小的元素\(M\)肯定是最小的不是\(S\)的因子的数,由于\(\text{lcm}(1,2,3,\cdots,43)>10^{18}\),所以\(M\le43\)。对于每个\(0\lei<M\),\(\bmodM=i\)的数被选择的部分必然是一段后缀,因为如果你选择了\(M\)选择了某个\(\bmodM=i\)的数\(v\),......
  • AtCoder Grand Contest 049 E Increment Decrement
    洛谷传送门AtCoder传送门好题。同时考查了slopetrick和选手的计数能力,不愧是AGCE。先考虑问题的第一部分。你现在有一个初始全为\(0\)的序列\(b\)。你每次可以给\(b\)单点\(\pm1\),代价为\(1\),或区间\(\pm1\),代价为\(m\)。求把\(b\)变成给定序列\(a\)的......
  • X-Camp 2023 Summer Training 做题泛记
    由于我懒,本Blog只记录暑期集训的难题&趣题,当然大部分难题我都不会做。\(\textbf{D1T2}\)很奇妙的一题,不过我不会。可以看xhgua的博客。\(\textbf{D5T3}\)模拟赛放Ynoi,兄弟。\(\textbf{D5T3.1Description}\)实现一个数据结构,要求实现三个操作:在图中将两个点连边;回......
  • AtCoder Beginner Contest 310
    A-OrderSomethingElse#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn,p,q;cin>>n>>p>>q;......
  • freee Programming Contest 2023(AtCoder Beginner Contest 310)
    Preface打的就是依托答辩,当时看一眼D感觉是个爆搜不想写就先跳了去想F,结果傻逼了没想出来最后30min了赶紧溜回去把D爆搜写了,但是已经罚时爆炸了,其实如果正常正序做的话排名会挺稳的后面一问包大爷发现F是个傻逼题,只能说计数水平实在是低下A-OrderSomethingElse签到题#i......
  • SMU Summer 2023 Contest Round 4
    SMUSummer2023ContestRound4A-TelephoneNumber思路:满足有8,且8后有大于等于11个数#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<char,int>PCI;type......
  • SMU Summer 2023 Contest Round 4
    SMUSummer2023ContestRound4A.TelephoneNumber满足第一个8后面存在10个字符即可#include<bits/stdc++.h>#defineendl'\n'#defineintlonglongusingnamespacestd;intn,m;voidsolve(){cin>>n;strings;cin>>s;......
  • AtCoder Beginner Contest 310
    PeacefulTeams\(n\)个运动员,要分成\(t\)个队伍,一共有\(m\)对人不能放在一支队伍里,求方案数,每支队伍至少需要有一个人\(1\leqt\leqn\leq10\)题解:DFS搜索通过数据范围考虑爆搜我们考虑枚举的顺序\(O(n!)\)我们对每个人\(c\)枚举将其加到当前的\(d\)支队伍中新开一......
  • AtCoder Regular Contest 092 E Both Sides Merger
    洛谷传送门AtCoder传送门Keyobservation:每个元素的下标奇偶性不改变。于是讨论最后一个数是下标为奇数还是偶数加起来的数。将下标奇偶性相同的元素分开考虑。对于下标奇偶性相同的元素,不难发现答案的上界是所有\(>0\)的元素之和(没有\(>0\)的元素时选一个最大的),并且一......