Codeforces Round #807 (Div. 2)(A.B.C)
A. Mark the Photographer
题目链接:
题面:
题意:
有2n个人想拍照,要求排两排,每个人都要入镜头,如果后排的比前排的高x就不会挡住
思路:
排序一下,0对应n, 1对应n+1,2对应n+2,以此类推,看看后面的是否比前面的大x
代码:
#include<bits/stdc++.h> using namespace std; int arr[105]; int main(){ int n; int t; cin >> t; int x; while(t--){ cin >> n >> x; for(int i = 0; i < 2 * n; i++){ cin >> arr[i]; } sort(arr, arr + 2 * n); bool f = 0; for(int i = 0; i < n; i++){ if(arr[i + n] - arr[i] < x){ f = 1; break; } } if(f){ cout << "NO" << endl; }else{ cout << "YES" << endl; } } return 0; }
B. Mark the Dust Sweeper
题目链接:
题面:
题意:
可以选择一个i,j(从i到j-1的所有数都大于0)使ai-1,aj+1,问把a0到an-1的所有数变成0需要几步
思路:
如果一段区间都是非0的,那么需要的次数就使区间,如果有0并且前面有数,那就需要多一步把这个0变成1
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long ll arr[200005]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--){ int n; cin >> n; for(int i = 0; i < n; i++){ cin >> arr[i]; } ll a = 0; ll ans = 0; for(int i = 0; i < n - 1; i++){ if(arr[i] == 0 && a != 0){ ans++; } a += arr[i]; } ans += a; cout << ans << endl; } return 0; }
C. Mark and His Unfinished Essay
题目链接:
题面:
题意:
给定n,c,q表示字符串的长度,操作的次数,查询的次数。然后给定一个字符串,每次操作输入l,r。从字符串中截取(l - 1,r - 1)添加到后面,然后查询字符串中的k个字符
思路:
通过查询的位置,不断往前推,直到 <= n的时候就知道是哪个字母了
我们可以在每次输入的时候求出长度,然后通过二分的查询在第几段,然后通过找输入的l的位置不断往前面推即可
#include<bits/stdc++.h> using namespace std; long long arr[105]; long long sum[105]; long long l[45]; long long r[45]; int main(){ int t; cin >> t; while(t--){ int n, m, k; cin >> n >> m >> k; string s; cin >> s; arr[0] = sum[0] = n; l[0] = 1; for(int i = 1; i <= m; i++){ cin >> l[i] >> r[i]; arr[i] = r[i] - l[i] + 1; sum[i] = sum[i - 1] + arr[i]; } while(k--){ long long a; cin >> a; while(a > n){ int ans = lower_bound(sum, sum + m + 1, a) - sum; a = l[ans] + a - sum[ans - 1] - 1; } cout << s[a - 1] << endl; } } return 0; }