Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3)
Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3)
A. Math Problem
-
思路:水题
-
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 1e5 + 10;
int t, n, ans;
int l[N], r[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t -- ){
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> l[i] >> r[i];
sort(l + 1, l + n + 1);
sort(r + 1, r + n + 1);
ans = l[n] - r[1];
if (ans < 0)
ans = 0;
cout << ans << "\n";
}
return 0;
}
B. Box
-
思路:模拟
-
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 1e5 + 10;
int t, n, pos;
int p[N], q[N];
bool flag;
bool vis[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t -- ){
memset(vis, false, sizeof(vis));
flag = true;
pos = 1;
q[0] = 0;
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> q[i];
for (int i = 1; i <= n; i ++ ){
if (q[i] < pos){
flag = false;
break;
}
if (q[i] == q[i - 1]){
p[i] = pos;
vis[pos] = true;
while (vis[pos])
pos ++ ;
}
else if (q[i] > q[i - 1]){
p[i] = q[i];
vis[p[i]] = true;
while (vis[pos])
pos ++ ;
}
}
if (flag){
for (int i = 1; i < n; i ++ )
cout << p[i] << " ";
cout << p[n] << "\n";
}
else
cout << "-1\n";
}
return 0;
}
C. Messy
-
思路:贪心 先统一变成((()))这种形式 先把右边分出来一个看需要几个,左边就出来多大的位置,然后每次从左边再分出来一个
-
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair <int, int> pii;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 2010;
const int M = 2e4 + 10;
int t, n, k, pos, tot, cnt;
bool flag;
char s[M];
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
cin >> t;
while (t -- ){
pos = 1, tot = 0;
flag = false;
vector<pii> ans;
cin >> n >> k;
scanf("%s", s + 1);
for (int i = 1; i <= n; i ++ ){
if (s[i] == '('){
tot ++ ;
if (!flag)
pos ++ ;
else{
if (s[i + 1] == '(')
continue;
else{
ans.push_back(pii(pos, i));
flag = false;
pos = tot + 1;
}
}
}
if (s[i] == ')'){
flag = true;
continue;
}
}
if (k != 1){
ans.push_back(pii(k, n / 2 + k - 1));
tot = k - 2;
cnt = 2;
while (tot -- ){
ans.push_back(pii(cnt, cnt + tot + 1));
cnt += 2;
}
}
cout << ans.size() << "\n";
for (auto x: ans)
cout << x.first << " " << x.second << "\n";
}
return 0;
}
D. Optimal Subsequences
-
思路:考场的时候D1差半分钟就做出来了(我是zz D2参考dalao的思路 首先按数组中的下标建一棵线段树 用一个新数组记录原数组 然后对新数组先按权值排序 再按下标排序 然后再用数组记录m次访问 按k从小到大排序 最后把m次询问按原来的顺序排回来 最后按顺序输出答案即可
-
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 2e5 + 10;
int n, m, now;
int sum[N << 2];
struct node{
int x, pos;
}a[N], b[N];
struct Node{
int k, pos, id, ans;
}q[N];
inline void update(int l, int r, int rt, int pos){
if (pos == l && l == r){
sum[rt] = 1;
return ;
}
int mid = (l + r) >> 1;
if (pos <= mid)
update(l, mid, rt << 1, pos);
else
update(mid + 1, r, rt << 1 | 1, pos);
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
inline int query(int l, int r, int rt, int k){
if (l == r)
return a[l].x;
int mid = (l + r) >> 1;
if (sum[rt << 1] >= k)
return query(l, mid, rt << 1, k);
else
return query(mid + 1, r, rt << 1 | 1, k - sum[rt << 1]);
}
inline bool cmp1(const node &a, const node &b){
if (a.x != b.x)
return a.x > b.x;
return a.pos < b.pos;
}
inline bool cmp2(const Node &a, const Node &b){
return a.k < b.k;
}
inline bool cmp3(const Node &a, const Node &b){
return a.id < b.id;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++ ){
cin >> a[i].x;
a[i].pos = i;
b[i] = a[i];
}
sort(b + 1, b + n + 1, cmp1);
cin >> m;
for (int i = 1; i <= m; i ++ ){
cin >> q[i].k >> q[i].pos;
q[i].id = i;
}
sort(q + 1, q + m + 1, cmp2);
for (int i = 1; i <= m; i ++ ){
while (now < q[i].k)
update(1, n, 1, b[ ++ now ].pos);
q[i].ans = query(1, n, 1, q[i].pos);
}
sort(q + 1, q + m + 1, cmp3);
for (int i = 1; i <= m; i ++ )
cout << q[i].ans << "\n";
return 0;
}