Codeforces Round #757 (Div. 2) A-C题解
A: Divan and a Store
签到
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#include<queue>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<algorithm>
#define ll long long
#define ld long double
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define _rep(i, a, b) for(int i = a; i >= b; i --)
#define io std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 100 + 5;
int n, t, l, r, k;
int a[N];
signed main(){
cin >> t;
while(t --){
cin >> n >> l >> r >> k;
for(int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n);
int p = lower_bound(a, a + n, l) - a;
int ans = 0, sum = 0;
while(sum < k && p < n && a[p] <= r){
sum += a[p];
p++;
ans++;
}
if(sum > k)
cout << ans - 1<< endl;
else cout << ans << endl;
}
return 0;
}
B: Divan and a New Project
签到,但是注意开longlong
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#include<queue>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<algorithm>
#define ll long long
#define ld long double
#define int long long
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define _rep(i, a, b) for(int i = a; i >= b; i --)
#define io std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 2e5 + 5;
int n, t;
struct node{
int v, p;
}a[N];
int cmp(node a, node b){
if(a.v == b.v)
return a.p < b.p;
return a.v > b.v;
}
int ans[N], b[N];
signed main(){
cin >> t;
int sum;
while(t --){
sum = 0;
cin >> n ;
for(int i = 0; i< n; i ++) cin >> a[i].v, b[i] = a[i].v;
for(int i = 0; i < n; i ++) a[i].p = i;
sort(a, a + n, cmp);
int flag = 0, idx = 1;
for(int i = 0; i < n; i ++){
ans[a[i].p] = idx;
if(idx > 0)
idx = -idx;
else
idx = -idx + 1;
}
for(int i = 0; i< n; i ++){
sum += 2 * (abs(ans [i])) *b[i];
}
cout << sum << endl;
cout << "0 ";
for(int i = 0; i < n; i ++) cout << ans[i] << " ";
cout << endl;
}
return 0;
}
C: Divan and bitwise operations
题目大意:有一个长度为n的数组未知,给你m串或(OR)的区间值(l,r,x),保证这m个串的范围涵盖了整个数组,求原串的异或值之和。
思路:样例二其实给出了线索,对于这整个n的区间来说,异或值是唯一的,所以范围其实没什么用hhh,求出总区间的异或值然后对其二进制逐位讨论贡献值并计算和即可。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#include<queue>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<algorithm>
#define ll long long
#define ld long double
#define int long long
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define _rep(i, a, b) for(int i = a; i >= b; i --)
#define io std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e6 + 5;
const int mod = 1e9 + 7;
int n, t, m, l ,r ,x;
signed main(){
cin >> t;
while(t --){
cin >> n >> m;
int idx = 0;
for(int i = 0; i < m; i ++){
cin >> l >> r >> x;
idx |= x;
}
ll ans = 1;
for(int i = 2; i <= n; i++)
ans <<= 1,ans %= mod;
ll res = 0;
for(int i = 0; i <=30; i ++){
if(idx>> i & 1) res=(res+ans*(1<<i)) % mod;
}
cout << res << endl;
}
return 0;
}
C快速幂可以小优化一下,这里就不补上了。