打一场cf,补题,题解要花费2、3个小时啊,没空看书了 =—=
A. Contest Start
题解
算一下t时间内有多少个开始,有 t / x t/x t/x个,那么对于每个 t t t都是一样的,除了当 i + t > n i+t>n i+t>n时,就是一个等差数列。
代码
long long n, x, t, ans = 0;
bool solve () {
ans = 0;
cin >> n >> x >> t;
long long tt = t / x;
if ( n <= tt) {
ans =1ll * (0 + n-1) * n /2;
}
else {
ans = 1ll * tt * ( n - tt - 1) + 1ll * (tt + 0) * (tt + 1) /2;
}
cout << ans << endl;
return true;
}
int main() {
int T;
cin >> T;
while(T --) {
if(solve ()) {
// puts("YES");
}
else {
// puts("NO");
}
}
return 0;
}
B. Love Song
题解
26 26 26个前缀和
代码
const int N = 100010, M = 26;
int f[N][M], n, q;
char s[N] ;
bool solve () {
cin >> n >> q;
cin >> (s + 1);
for ( int i = 1; i <= n; ++i) {
f[i][s[i] - 'a'] ++;
for(int j=0; j < 26; ++j) f[i][j] += f[i - 1][j];
}
while (q -- ) {
int l, r ;
cin >> l >> r;
int ans = 0;
for (int i = 0; i < 26; ++i) {
ans += (f[r][i] - f[l-1][i] ) * (i + 1);
}
cout << ans << endl;
}
return true;
}
int main() {
int T=1;
// cin >> T;
while(T --) {
if(solve()) {
// puts("YES");
}
else {
// puts("NO");
}
}
return 0;
}
C. Stable Groups
题解
排序,求两个相邻数之间的绝对值d,需要插入 d / x d/x d/x( d d%x!=0 d)个数才能连接这个数,需要注意如果 d d%x==0 d时,只需要插入 d / x − 1 d/x-1 d/x−1个数。
代码
const int N = 200010;
long long n, k, x;
long long a[N];
vector <long long> v;
bool solve () {
cin >> n >> k >> x;
for(int i = 1; i <= n; ++i) cin >> a[i];
sort(a + 1,a + n + 1);
v.clear() ;
for (int i = 1; i < n; ++ i) {
if ( a[i + 1] - a[i] > x) {
long long t = (a[i + 1] - a[i]) / x ;
if(( a[i+1] - a[i]) % x == 0) t--;
v.push_back(t) ;
}
}
sort (v.begin(), v.end());
for (int i = 0; i < v.size(); ++ i) {
if( v[i] <= k) k -= v[i];
else {
cout << v.size() - i + 1 <<endl;
return true;
}
}
cout << 1 << endl;
return true;
}
D. PriceFixed
题解
按b排序。
初始
l
=
1
,
r
=
n
l=1,r=n
l=1,r=n,优先考虑话费
1
1
1买l的商品,没有到
b
[
l
]
b[l]
b[l]的话就通过买
r
r
r的商品补总量。
这样决策正确,因为:可以假设
r
2
r2
r2(表示用
2
2
2买
r
r
r的部分,
l
1
l1
l1的数量等于
r
2
r2
r2的数量)的这些商品没有买,那就只能用
2
2
2买
l
l
l的商品,后面遍历到了
r
r
r由于我们的购买总量不变,
b
[
r
]
b[r]
b[r]又大于
b
[
l
]
b[l]
b[l],所以原本的
r
2
r2
r2这部分可能还是没有办法全用
1
1
1买,那还不如早点把他们买了,就可以用
1
1
1把
l
l
l全买了。
代码
const int N = 100010;
typedef pair<long long , long long > PLL;
PLL a[N];
bool used[N];
bool solve () {
int n;
cin >> n;
long long s1 = 0, s2 = n, tot = 0 , cost = 0;
for (int i = 1; i <= n; ++i) {
long long x, y;
cin >> x >> y;
a[i] = make_pair(y,x);
}
sort(a + 1, a + 1 + n);
int l = 1, r = n;
while (l <= r) {
if( a[l].first <= tot) {
tot += a[l].second;
cost += a[l].second;
l ++;
}
else if( l == r) {
if( a[l].second + tot >= a[l].first) {
a[l].second -= a[l].first - tot;
cost += (a[l].first - tot) * 2 + a[l].second;
}
else {
cost += a[l].second * 2;
}
break;
}
else {
if( a[r].second + tot >= a[l].first ) {
a[r].second -= a[l].first - tot ;
cost += (a[l].first - tot) * 2 + a[l].second ;
tot += a[l].first - tot + a[l].second;
l ++;
if(a[r].second == 0) r--;
}
else {
tot += a[r].second;
cost += a[r].second * 2;
r --;
}
}
}
cout << cost <<endl;
return true;
}