Codeforces Round #297 (Div. 2) (ABCDE题解)

2024-03-20 14:18

本文主要是介绍Codeforces Round #297 (Div. 2) (ABCDE题解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

比赛链接:http://codeforces.com/contest/525

算是比较简单的一场了,拖了好久现在才补


A. Vitaliy and Pie
time limit per test:2 seconds
memory limit per test:256 megabytes

After a hard day Vitaly got very hungry and he wants to eat his favorite potato pie. But it's not that simple. Vitaly is in the first room of the house with n room located in a line and numbered starting from one from left to right. You can go from the first room to the second room, from the second room to the third room and so on — you can go from the (n - 1)-th room to the n-th room. Thus, you can go to room x only from room x - 1.

The potato pie is located in the n-th room and Vitaly needs to go there.

Each pair of consecutive rooms has a door between them. In order to go to room x from room x - 1, you need to open the door between the rooms with the corresponding key.

In total the house has several types of doors (represented by uppercase Latin letters) and several types of keys (represented by lowercase Latin letters). The key of type t can open the door of type T if and only if t and T are the same letter, written in different cases. For example, key f can open door F.

Each of the first n - 1 rooms contains exactly one key of some type that Vitaly can use to get to next rooms. Once the door is open with some key, Vitaly won't get the key from the keyhole but he will immediately run into the next room. In other words, each key can open no more than one door.

Vitaly realizes that he may end up in some room without the key that opens the door to the next room. Before the start his run for the potato pie Vitaly can buy any number of keys of any type that is guaranteed to get to room n.

Given the plan of the house, Vitaly wants to know what is the minimum number of keys he needs to buy to surely get to the room n, which has a delicious potato pie. Write a program that will help Vitaly find out this number.

Input

The first line of the input contains a positive integer n (2 ≤ n ≤ 105) — the number of rooms in the house.

The second line of the input contains string s of length n - 2. Let's number the elements of the string from left to right, starting from one.

The odd positions in the given string s contain lowercase Latin letters — the types of the keys that lie in the corresponding rooms. Thus, each odd position i of the given string s contains a lowercase Latin letter — the type of the key that lies in room number (i + 1) / 2.

The even positions in the given string contain uppercase Latin letters — the types of doors between the rooms. Thus, each even position i of the given string s contains an uppercase letter — the type of the door that leads from room i / 2 to room i / 2 + 1.

Output

Print the only integer — the minimum number of keys that Vitaly needs to buy to surely get from room one to room n.

Sample test(s)
Input
3
aAbB
Output
0
Input
4
aBaCaB
Output
3
Input
5
xYyXzZaZ
Output
2


题目大意:有n-1个门大写字母表示,n-1把钥匙小写字母表示,大小写相对应的钥匙能开相对应的门,每次遇到一个钥匙可以将它收起来或者直接使用,用过一次就没了,问最少还要买多少钥匙才能通过所有的门


题目分析:hash存一下,简单模拟


#include <cstdio>
#include <cstring>
int const MAX = 1e6;char s[MAX];
int hash[60];int main()
{int n, ans = 0;scanf("%d %s", &n, s);int len = strlen(s);memset(hash, 0, sizeof(hash));for(int i = 0; i < len; i++){if(s[i] >= 'a' && s[i] <= 'z')hash[s[i] - 'a'] ++;else {if(hash[s[i] - 'A'])hash[s[i] - 'A'] --;elseans ++;}}printf("%d\n", ans);
}




B. Pasha and String
time limit per test:2 seconds
memory limit per test:256 megabytes

Pasha got a very beautiful string s for his birthday, the string consists of lowercase Latin letters. The letters in the string are numbered from 1 to |s| from left to right, where |s| is the length of the given string.

Pasha didn't like his present very much so he decided to change it. After his birthday Pasha spent m days performing the following transformations on his string — each day he chose integer ai and reversed a piece of string (a segment) from position ai to position |s| - ai + 1. It is guaranteed that ai ≤ |s|.

You face the following task: determine what Pasha's string will look like after m days.

Input

The first line of the input contains Pasha's string s of length from 2 to 2·105 characters, consisting of lowercase Latin letters.

The second line contains a single integer m (1 ≤ m ≤ 105) —  the number of days when Pasha changed his string.

The third line contains m space-separated elements ai (1 ≤ ai; ai ≤ |s|) — the position from which Pasha started transforming the string on the i-th day.

Output

In the first line of the output print what Pasha's string s will look like after m days.

Sample test(s)
Input
abcdef
1
2
Output
aedcbf
Input
vwxyz
2
2 2
Output
vwxyz
Input
abcdef
3
1 2 3
Output
fbdcea


题目大意:给1个字符串长度为len,要操作m次,每次将第a[i]到第len-a[i]+1这段子串逆置,问最终字符串成什么样


题目分析:用reverse函数肯定T,同一个数操作偶数次相当于没动,所以算出要变换奇数次个数的数,交换即可


#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[200005];
int a[100005];int main()
{scanf("%s", s + 1);int len = strlen(s + 1), m, get;scanf("%d", &m);while(m--){   scanf("%d", &get);a[get] ++; }for(int i = 1; i <= len / 2; i++)a[i] += a[i - 1];for(int i = 1; i <= len / 2; i++)if(a[i] % 2)swap(s[i], s[len + 1 - i]);printf("%s\n", s + 1);
}



C. Ilya and Sticks
time limit per test:2 seconds
memory limit per test:256 megabytes

In the evening, after the contest Ilya was bored, and he really felt like maximizing. He remembered that he had a set of n sticks and an instrument. Each stick is characterized by its length li.

Ilya decided to make a rectangle from the sticks. And due to his whim, he decided to make rectangles in such a way that maximizes their total area. Each stick is used in making at most one rectangle, it is possible that some of sticks remain unused. Bending sticks is not allowed.

Sticks with lengths a1, a2, a3 and a4 can make a rectangle if the following properties are observed:

  • a1 ≤ a2 ≤ a3 ≤ a4
  • a1 = a2
  • a3 = a4

A rectangle can be made of sticks with lengths of, for example, 3 3 3 3 or 2 2 4 4. A rectangle cannot be made of, for example, sticks 5 5 5 7.

Ilya also has an instrument which can reduce the length of the sticks. The sticks are made of a special material, so the length of each stick can be reduced by at most one. For example, a stick with length 5 can either stay at this length or be transformed into a stick of length 4.

You have to answer the question — what maximum total area of the rectangles can Ilya get with a file if makes rectangles from the available sticks?

Input

The first line of the input contains a positive integer n (1 ≤ n ≤ 105) — the number of the available sticks.

The second line of the input contains n positive integers li (2 ≤ li ≤ 106) — the lengths of the sticks.

Output

The first line of the output must contain a single non-negative integer — the maximum total area of the rectangles that Ilya can make from the available sticks.

Sample test(s)
Input
4
2 4 4 2
Output
8
Input
4
2 2 3 5
Output
0
Input
4
100003 100004 100005 100006
Output
10000800015


题目大意:给n个木条,求从中选择4个出来组成长方形,能组成长方形的四个边满足a1<=a2<=a3<=a4,a1=a2,a3=a4,且每根木条的长度可以减1使用,求所能组成的长方形的最大面积


题目分析:从大到小排序,从大的开始选,选的时候注意减1的情况,开始看错题了,以为只拼一个,其实是可以拼多个


#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
int const MAX = 1e5;
ll l[MAX];bool cmp(ll a, ll b)
{return a > b;
}int main()
{int n;scanf("%d", &n);if(n < 4){printf("0\n");return 0;}for(int i = 0; i < n; i++)scanf("%lld", &l[i]);sort(l, l + n, cmp);ll a = 0, b = 0, ans = 0;for(int i = 0; i < n - 1; i++){if(!a && (l[i] == l[i + 1])){a = l[i];i ++;continue;}else if(!a && (l[i] == l[i + 1] + 1)){a = l[i + 1];i ++;continue;}if(l[i] == l[i + 1]){b = l[i];ans += a * b;a = 0;b = 0;i ++;}else if(l[i] == l[i + 1] + 1){b = l[i + 1];ans += a * b;a = 0;b = 0;i ++;}}printf("%lld\n", ans);
}



D. Arthur and Walls
time limit per test:2 seconds
memory limit per test:512 megabytes

Finally it is a day when Arthur has enough money for buying an apartment. He found a great option close to the center of the city with a nice price.

Plan of the apartment found by Arthur looks like a rectangle n × m consisting of squares of size 1 × 1. Each of those squares contains either a wall (such square is denoted by a symbol "*" on the plan) or a free space (such square is denoted on the plan by a symbol ".").

Room in an apartment is a maximal connected area consisting of free squares. Squares are considered adjacent if they share a common side.

The old Arthur dream is to live in an apartment where all rooms are rectangles. He asks you to calculate minimum number of walls you need to remove in order to achieve this goal. After removing a wall from a square it becomes a free square. While removing the walls it is possible that some rooms unite into a single one.

Input

The first line of the input contains two integers n, m (1 ≤ n, m ≤ 2000) denoting the size of the Arthur apartments.

Following n lines each contain m symbols — the plan of the apartment.

If the cell is denoted by a symbol "*" then it contains a wall.

If the cell is denoted by a symbol "." then it this cell is free from walls and also this cell is contained in some of the rooms.

Output

Output n rows each consisting of m symbols that show how the Arthur apartment plan should look like after deleting the minimum number of walls in order to make each room (maximum connected area free from walls) be a rectangle.

If there are several possible answers, output any of them.

Sample test(s)
Input
5 5
.*.*.
*****
.*.*.
*****
.*.*.
Output
.*.*.
*****
.*.*.
*****
.*.*.
Input
6 7
***.*.*
..*.*.*
*.*.*.*
*.*.*.*
..*...*
*******
Output
***...*
..*...*
..*...*
..*...*
..*...*
*******
Input
4 5
.....
.....
..***
..*..
Output
.....
.....
.....
.....


题目大意:给一个n*m的矩阵,'' * “表示墙 " . "表示空地,被" * "围起来的是房间现在求删去最少的" * "使得每个房间空地的形状都是一个矩形,输出删除后的矩阵


题目分析:YY一下发现类似下面这种形状的(其他可由它翻转或旋转得到)2*2的子矩阵的" * "都要被改成" . "

*. 
.. 

然后就是预处理一下这种形状BFS搜一下,用队列维护,每次删去一个" * "分别向周围8个方向扩展,注意要用vis数组标记防止未更新的点重复入队列!


#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int const MAX = 2005;int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[8] = {0, 1, 0, -1, 1, -1, 1, -1};
char map[MAX][MAX];
bool vis[MAX][MAX];
int n, m;
queue <pair <int, int > > q;bool judge(int i, int j)
{if(map[i][j] == '.' || i == 0 || j == 0 || i == n + 1 || j == m + 1)return false;if(map[i - 1][j - 1] == '.' && map[i - 1][j] == '.' && map[i][j - 1] == '.')return true;if(map[i + 1][j + 1] == '.' && map[i + 1][j] == '.' && map[i][j + 1] == '.')return true;if(map[i + 1][j - 1] == '.' && map[i][j - 1] == '.' && map[i + 1][j] == '.')return true;if(map[i - 1][j + 1] == '.' && map[i - 1][j] == '.' && map[i][j + 1] == '.')return true;return false;
}void BFS()
{while(!q.empty()){int x = q.front().first;int y = q.front().second;q.pop();map[x][y] = '.';for(int i = 0; i < 8; i++){int xx = x + dx[i];int yy = y + dy[i];if(judge(xx, yy) && !vis[xx][yy]){vis[xx][yy] = true;q.push(make_pair(xx, yy));}}}
}int main()
{scanf("%d %d", &n, &m);for(int i = 1; i <= n; i++)scanf("%s", map[i] + 1);for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)if(judge(i, j)){q.push(make_pair(i, j));vis[i][j] = true;}BFS();for(int i = 1; i <= n; i++)printf("%s\n", map[i] + 1);
}



E. Anya and Cubes
time limit per test:2 seconds
memory limit per test:256 megabytes

Anya loves to fold and stick. Today she decided to do just that.

Anya has n cubes lying in a line and numbered from 1 to n from left to right, with natural numbers written on them. She also has k stickers with exclamation marks. We know that the number of stickers does not exceed the number of cubes.

Anya can stick an exclamation mark on the cube and get the factorial of the number written on the cube. For example, if a cube reads 5, then after the sticking it reads 5!, which equals 120.

You need to help Anya count how many ways there are to choose some of the cubes and stick on some of the chosen cubes at most k exclamation marks so that the sum of the numbers written on the chosen cubes after the sticking becomes equal to S. Anya can stick at most one exclamation mark on each cube. Can you do it?

Two ways are considered the same if they have the same set of chosen cubes and the same set of cubes with exclamation marks.

Input

The first line of the input contains three space-separated integers n, k and S (1 ≤ n ≤ 25, 0 ≤ k ≤ n, 1 ≤ S ≤ 1016) — the number of cubes and the number of stickers that Anya has, and the sum that she needs to get.

The second line contains n positive integers ai (1 ≤ ai ≤ 109) — the numbers, written on the cubes. The cubes in the input are described in the order from left to right, starting from the first one.

Multiple cubes can contain the same numbers.

Output

Output the number of ways to choose some number of cubes and stick exclamation marks on some of them so that the sum of the numbers became equal to the given number S.

Sample test(s)
Input
2 2 30
4 3
Output
1
Input
2 2 7
4 3
Output
1
Input
3 1 1
1 1 1
Output
6
Note

In the first sample the only way is to choose both cubes and stick an exclamation mark on each of them.

In the second sample the only way is to choose both cubes but don't stick an exclamation mark on any of them.

In the third sample it is possible to choose any of the cubes in three ways, and also we may choose to stick or not to stick the exclamation mark on it. So, the total number of ways is six.

题目大意:给n个数a[i],其中可以选出k个将它变成自己的阶乘,问有多少种方案取出的数的和为s


题目分析:由于n=25,对每个数有3种情况,不选,选,选它的阶乘,因此3^25肯定T,由此想到类似poj 1840这样的题,我们可以先算前n/2个数然后用map存储下来,再算后n/2个数,在后n/2个数中算出来的数架设为sum2如果s-sum2在前n/2个数的和中出现过,则我们找到相应个数的解,这样将复杂度降到2 * 3^12 约等于1e6的数量级,注意s的范围是10^16,而18! = 6*10^15因此18以后的阶乘我们都不用去算了,搜索的时候当然也不用搜,本地跑了好久,交到cf上才500+ms。。。


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define ll long long
using namespace std;ll fac[20] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 
3628800, 39916800, 479001600, 6227020800 ,87178291200 ,1307674368000
,20922789888000 ,355687428096000 ,6402373705728000};
ll a[30], s, ans;
int n, k;
map <ll, ll> mp[30];void DFS1(int i, int cnt, ll sum)
{if(sum > s || cnt > k)return;if(i == n / 2){mp[cnt][sum] ++;return;}DFS1(i + 1, cnt, sum);DFS1(i + 1, cnt, sum + a[i]);if(a[i] <= 18)DFS1(i + 1, cnt + 1, sum + fac[a[i]]);
}void DFS2(int i, int cnt, ll sum)
{if(sum > s || cnt > k)return;if(i == n){for(int j = 0; j + cnt <= k; j++)if(mp[j].count(s - sum))ans += mp[j][s - sum];return;}DFS2(i + 1, cnt, sum);DFS2(i + 1, cnt, sum + a[i]);if(a[i] <= 18)DFS2(i + 1, cnt + 1, sum + fac[a[i]]);
}int main()
{ans = 0;scanf("%d %d %I64d", &n, &k, &s);for(int i = 0; i < n; i++)scanf("%I64d", &a[i]);DFS1(0, 0, 0);DFS2(n / 2, 0, 0);printf("%I64d\n", ans);
}





这篇关于Codeforces Round #297 (Div. 2) (ABCDE题解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829727

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述