Hiển thị các bài đăng có nhãn Codeforces. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Codeforces. Hiển thị tất cả bài đăng

Chủ Nhật, 16 tháng 12, 2012

Problem Mr. Bender and Square

Link: http://codeforces.com/problemset/problem/255/D

D. Mr. Bender and Square
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Mr. Bender has a digital table of size n × n, each cell can be switched on or off. He wants the field to have at least c switched on squares. When this condition is fulfilled, Mr Bender will be happy.
We'll consider the table rows numbered from top to bottom from 1 to n, and the columns — numbered from left to right from 1 to n. Initially there is exactly one switched on cell with coordinates (x, y) (x is the row number, y is the column number), and all other cells are switched off. Then each second we switch on the cells that are off but have the side-adjacent cells that are on.
For a cell with coordinates (x, y) the side-adjacent cells are cells with coordinates (x - 1, y), (x + 1, y),(x, y - 1), (x, y + 1).
In how many seconds will Mr. Bender get happy?
Input
The first line contains four space-separated integers n, x, y, c (1 ≤ n, c ≤ 109; 1 ≤ x, y ≤ n; c ≤ n2).
Output
In a single line print a single integer — the answer to the problem.
Sample test(s)
input
6 4 3 1
output
0
input
9 3 8 10
output
2
Note
Initially the first test has one painted cell, so the answer is 0. In the second test all events will go as is shown on the figure..

Thuật toán:
Để giải quyết bài toán trên, chúng ta giải bài toán con sau.
Chúng ta cần tính số ô chúng ta có được khi xuất phát từ ô (x, y) sau t bước.
Chúng ta gọi đó là hàm f(x,y,t).

Problem Almost Arithmetical Progression

Link: http://codeforces.com/problemset/problem/255/C

C. Almost Arithmetical Progression
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Gena loves sequences of numbers. Recently, he has discovered a new type of sequences which he called an almost arithmetical progression. A sequence is an almost arithmetical progression, if its elements can be represented as:
  • a1 = p, where p is some integer;
  • ai = ai - 1 + ( - 1)i + 1·q (i > 1), where q is some integer.
Right now Gena has a piece of paper with sequence b, consisting of n integers. Help Gena, find there the longest subsequence of integers that is an almost arithmetical progression.
Sequence s1,  s2,  ...,  sk is a subsequence of sequence b1,  b2,  ...,  bn, if there is such increasing sequence of indexes i1, i2, ..., ik (1  ≤  i1  <  i2  < ...   <  ik  ≤  n), that bij  =  sj. In other words, sequence scan be obtained from b by crossing out some elements.
Input
The first line contains integer n (1 ≤ n ≤ 4000). The next line contains n integers b1, b2, ..., bn (1 ≤ bi ≤ 106).
Output
Print a single integer — the length of the required longest subsequence.
Sample test(s)
input
2
3 5
output
2
input
4
10 20 10 30
output
3
Note
In the first test the sequence actually is the suitable subsequence.
In the second test the following subsequence fits: 10, 20, 10.


Thuật toán: Quy hoạc động.
Gọi f[i,j] là kết quả khi xét từ đoạn i..j.
Nếu có a[j] trước a[i]: f[i][j] = f[pos[a[j]]][i] + 1.
Nếu chưa có a[j] nào trước a[i] thì f[i][j] = 2.
Đánh dấu a[i].

Code:

/*
Coder : Nguyen Duc Tam
template for contest
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
#include<utility>
#include<map>
#include<list>
#include<queue>
#include<deque>
#include<stack>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#include<ctime>
#include<cctype>

using namespace std;

/*
define for statement loop
*/
#define REP(i, start, end, step) for(int i = start; i < end; i += step)
#define DOWN(i, start, end, step) for(int i = start; i > end; i -= step)
#define FOR(it,c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define ALL(c) (c).begin(), (c).end()
#define SZ(x) ((int)(x).size())

/*
define operator bit
*/
#define L(x,i) ((x) << (i))
#define R(x,i) ((x) >> (i))
#define AND(a,b) ((a) & (b))
#define OR(a,b) ((a) | (b))
#define XOR(a,b) ((a) ^ (b))
#define NOT(a) (~(a))
#define SB(x,i) (OR((x), L(1, (i)))) // x | 1 << i
#define CB(x,i) (AND((x),NOT(L(1,(i))))) // x & ~(1 << i)
#define TB(x,i) (AND((x), L(1,(i)))) // x & (1 << i)

/*
define init data
*/
#define FILL(a,val) memset(a,val,sizeof(a));
#define INIT(a,l,r,val) REP(i,l,r,1) (a)[i] = val;

/*
define convert data
*/
#define DIG(c) (int)((c) - '0')
#define CHR(c) (char)((c) + '0')
#define LOW(c) (char)((c) + 32)
#define UPP(c) (char)((c) - 32)

/*
define math function
*/
#define sqr(a) (a) * (a)
#define abs(a) (a < 0 ? -(a) : (a))

/*
define find element in container very fast.
*/
#define LO(c,x) lower_bound(ALL(c),x)
#define UP(c,x) upper_bound(ALL(c),x)
#define IOF(c,x) distance((c).begin(), LO((c),x))
#define IOL(c,x) distance((c).begin(), UP((c),x))
#define IN(c,x) binary_search(ALL(c),x)
#define ER(c,x) equal_range(ALL(c),x)

/*
define geo
*/
#define DIS(p,q) sqrt(sqr(p.x - q.x) + sqr(p.y - q.y)) // khoang cach Euclide
#define DIM(p,q) abs(p.x - q.x) + abs(p.y - q.y) // khoang cach mahatan


/*
define constant
*/

#define EPS 1e-7
#define OO 1000000005
#define N 4005

#define X first
#define Y second

struct Point
{
double x, y;
Point(){}
Point(double x,double y):x(x), y(y){}
};

struct Node
{
int value;
Node* next;
Node(){}
Node(int value, Node* next):value(value),next(next){}
};

struct Edge
{
int src, dst, weight;
Edge(){}
Edge(int src, int dst, int weight):src(src), dst(dst), weight(weight){}

};

struct Compare
{

bool operator() (const int i, const int j)
{
return i > j;
}

/*
bool operator() (const Point& p, const Point& q)
{
return (p.x != q.x ? p.x < q.x : p.y < q.y);
}
*/
/*
bool operator()(const Edge& e, const Edge& f)
{
return (e.weight != f.weight ? e.weight > f.weight : e.src != f.src ?
e.src < f.src : e.dst < f.dst); // inverse weight
}
*/
};


const int DAY[13] = {-1,31,29,31,30,31,30,31,31,30,31,30,31};

const int dx4[4] = {-1, 0, 1, 0}; //U - R - D - L
const int dy4[4] = {0, 1, 0, -1};

const int dx8[8] = {-1, -1, 0, 1, 1, 1, 0, -1}; //U - UR - R - DR - D - DL - L - UL
const int dy8[8] = {0, 1, 1, 1, 0, -1, -1, -1};

typedef pair<int,int> II;
typedef pair<II,int> III;
typedef long long LL;
typedef unsigned long long ULL;
typedef unsigned char UC;

vector<int>::iterator it, low, up; // using lower_bound, upper_bound
pair<vector<int>::iterator, vector<int>::iterator > bound; // using function equal_range(first, last, x)
Compare comp;
Point p[2];

int n, a[N], res = 0, temp = 0, f[N][N], pos[1000005];

int main()
{
#define Off  true
if(Off)
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
}
cin >> n;
REP(i,0,n,1)
{
scanf("%d",&a[i]);
}
REP(j,1,n,1)
{
REP(i,0,n,1) pos[a[i]] = -1;
REP(i,0,j,1)
{
if(pos[a[j]] >= 0)
f[i][j] = f[pos[a[j]]][i] + 1;
else
f[i][j] = 2;
pos[a[i]] = i;
}
}
res = 1;
REP(i,0,n,1)
REP(j,i + 1,n,1)
res = max(res,f[i][j]);
cout << res << endl;
return 0;
}



Problem Code Parsing

Link: http://codeforces.com/problemset/problem/255/B

B. Code Parsing
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Little Vitaly loves different algorithms. Today he has invented a new algorithm just for you. Vitaly's algorithm works with string s, consisting of characters "x" and "y", and uses two following operations at runtime:
  1. Find two consecutive characters in the string, such that the first of them equals "y", and the second one equals "x" and swap them. If there are several suitable pairs of characters, we choose the pair of characters that is located closer to the beginning of the string.
  2. Find in the string two consecutive characters, such that the first of them equals "x" and the second one equals "y". Remove these characters from the string. If there are several suitable pairs of characters, we choose the pair of characters that is located closer to the beginning of the string.
The input for the new algorithm is string s, and the algorithm works as follows:
  1. If you can apply at least one of the described operations to the string, go to step 2 of the algorithm. Otherwise, stop executing the algorithm and print the current string.
  2. If you can apply operation 1, then apply it. Otherwise, apply operation 2. After you apply the operation, go to step 1 of the algorithm.
Now Vitaly wonders, what is going to be printed as the result of the algorithm's work, if the input receives string s.
Input
The first line contains a non-empty string s.
It is guaranteed that the string only consists of characters "x" and "y". It is guaranteed that the string consists of at most 106 characters. It is guaranteed that as the result of the algorithm's execution won't be an empty string.
Output
In the only line print the string that is printed as the result of the algorithm's work, if the input of the algorithm input receives string s.
Sample test(s)
input
x
output
x
input
yxyxy
output
y
input
xxxxxy
output
xxxx
Note
In the first test the algorithm will end after the first step of the algorithm, as it is impossible to apply any operation. Thus, the string won't change.
In the second test the transformation will be like this:
  1. string "yxyxy" transforms into string "xyyxy";
  2. string "xyyxy" transforms into string "xyxyy";
  3. string "xyxyy" transforms into string "xxyyy";
  4. string "xxyyy" transforms into string "xyy";
  5. string "xyy" transforms into string "y".

Thuật toán : Nhận thấy, khi còn tồn tại hai kí tự x, y thì luôn thực hiện thao tác 1, hoặc 2. Do đó thuật toán kết thúc khi chỉ còn một kí tự duy nhất.
Code:

/*
Coder : Nguyen Duc Tam
template for contest
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
#include<utility>
#include<map>
#include<list>
#include<queue>
#include<deque>
#include<stack>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#include<ctime>
#include<cctype>

using namespace std;

/*
define for statement loop
*/
#define REP(i, start, end, step) for(int i = start; i < end; i += step)
#define DOWN(i, start, end, step) for(int i = start; i > end; i -= step)
#define FOR(it,c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define ALL(c) (c).begin(), (c).end()
#define SZ(x) ((int)(x).size())

/*
define operator bit
*/
#define L(x,i) ((x) << (i))
#define R(x,i) ((x) >> (i))
#define AND(a,b) ((a) & (b))
#define OR(a,b) ((a) | (b))
#define XOR(a,b) ((a) ^ (b))
#define NOT(a) (~(a))
#define SB(x,i) (OR((x), L(1, (i)))) // x | 1 << i
#define CB(x,i) (AND((x),NOT(L(1,(i))))) // x & ~(1 << i)
#define TB(x,i) (AND((x), L(1,(i)))) // x & (1 << i)

/*
define init data
*/
#define FILL(a,val) memset(a,val,sizeof(a));
#define INIT(a,l,r,val) REP(i,l,r,1) (a)[i] = val;

/*
define convert data
*/
#define DIG(c) (int)((c) - '0')
#define CHR(c) (char)((c) + '0')
#define LOW(c) (char)((c) + 32)
#define UPP(c) (char)((c) - 32)

/*
define math function
*/
#define sqr(a) (a) * (a)
#define abs(a) (a < 0 ? -(a) : (a))

/*
define find element in container very fast.
*/
#define LO(c,x) lower_bound(ALL(c),x)
#define UP(c,x) upper_bound(ALL(c),x)
#define IOF(c,x) distance((c).begin(), LO((c),x))
#define IOL(c,x) distance((c).begin(), UP((c),x))
#define IN(c,x) binary_search(ALL(c),x)
#define ER(c,x) equal_range(ALL(c),x)

/*
define geo
*/
#define DIS(p,q) sqrt(sqr(p.x - q.x) + sqr(p.y - q.y)) // khoang cach Euclide
#define DIM(p,q) abs(p.x - q.x) + abs(p.y - q.y) // khoang cach mahatan


/*
define constant
*/

#define EPS 1e-7
#define OO 1000000005
#define N 100005

#define X first
#define Y second

struct Point
{
double x, y;
Point(){}
Point(double x,double y):x(x), y(y){}
};

struct Node
{
int value;
Node* next;
Node(){}
Node(int value, Node* next):value(value),next(next){}
};

struct Edge
{
int src, dst, weight;
Edge(){}
Edge(int src, int dst, int weight):src(src), dst(dst), weight(weight){}

};

struct Compare
{

bool operator() (const int i, const int j)
{
return i > j;
}

/*
bool operator() (const Point& p, const Point& q)
{
return (p.x != q.x ? p.x < q.x : p.y < q.y);
}
*/
/*
bool operator()(const Edge& e, const Edge& f)
{
return (e.weight != f.weight ? e.weight > f.weight : e.src != f.src ?
e.src < f.src : e.dst < f.dst); // inverse weight
}
*/
};


const int DAY[13] = {-1,31,29,31,30,31,30,31,31,30,31,30,31};

const int dx4[4] = {-1, 0, 1, 0}; //U - R - D - L
const int dy4[4] = {0, 1, 0, -1};

const int dx8[8] = {-1, -1, 0, 1, 1, 1, 0, -1}; //U - UR - R - DR - D - DL - L - UL
const int dy8[8] = {0, 1, 1, 1, 0, -1, -1, -1};

typedef pair<int,int> II;
typedef pair<II,int> III;
typedef long long LL;
typedef unsigned long long ULL;
typedef unsigned char UC;

vector<int>::iterator it, low, up; // using lower_bound, upper_bound
pair<vector<int>::iterator, vector<int>::iterator > bound; // using function equal_range(first, last, x)
Compare comp;
Point p[2];

string s;
int len = 0,x = 0 ,y = 0;

int main()
{
#define Off  true
if(Off)
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
}
cin >> s;
len = s.size();
REP(i,0,len,1)
if(s[i] == 'x') x++;
else y++;
if(x == y) cout << "" << endl;
else if( x > y)
{
REP(i,0,x-y,1) printf("%c",'x');
}
else
{
REP(i,0,y-x,1) printf("%c",'y');
}
return 0;
}



Problem Greg's Workout

Link : http://codeforces.com/problemset/problem/255/A
A. Greg's Workout
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Greg is a beginner bodybuilder. Today the gym coach gave him the training plan. All it had was nintegers a1, a2, ..., an. These numbers mean that Greg needs to do exactly n exercises today. Besides, Greg should repeat the i-th in order exercise ai times.
Greg now only does three types of exercises: "chest" exercises, "biceps" exercises and "back" exercises. Besides, his training is cyclic, that is, the first exercise he does is a "chest" one, the second one is "biceps", the third one is "back", the fourth one is "chest", the fifth one is "biceps", and so on to the n-th exercise.
Now Greg wonders, which muscle will get the most exercise during his training. We know that the exercise Greg repeats the maximum number of times, trains the corresponding muscle the most. Help Greg, determine which muscle will get the most training.
Input
The first line contains integer n (1 ≤ n ≤ 20). The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 25) — the number of times Greg repeats the exercises.
Output
Print word "chest" (without the quotes), if the chest gets the most exercise, "biceps" (without the quotes), if the biceps gets the most exercise and print "back" (without the quotes) if the back gets the most exercise.
It is guaranteed that the input is such that the answer to the problem is unambiguous.
Sample test(s)
input
2
2 8
output
biceps
input
3
5 1 10
output
back
input
7
3 3 2 7 9 6 8
output
chest
Note
In the first sample Greg does 2 chest, 8 biceps and zero back exercises, so the biceps gets the most exercises.
In the second sample Greg does 5 chest, 1 biceps and 10 back exercises, so the back gets the most exercises.
In the third sample Greg does 18 chest, 12 biceps and 8 back exercises, so the chest gets the most exercise.

Thuật toán: Đơn giản là cài đặt thôi.
Code:
/* 
    Coder : Nguyen Duc Tam 
    template for contest
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
#include<utility>
#include<map>
#include<list>
#include<queue>
#include<deque>
#include<stack>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#include<ctime>
#include<cctype>

using namespace std;

/*
    define for statement loop
*/
#define REP(i, start, end, step) for(int i = start; i < end; i += step)
#define DOWN(i, start, end, step) for(int i = start; i > end; i -= step)
#define FOR(it,c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define ALL(c) (c).begin(), (c).end()
#define SZ(x) ((int)(x).size())

/*
    define operator bit
*/
#define L(x,i) ((x) << (i))
#define R(x,i) ((x) >> (i))
#define AND(a,b) ((a) & (b))
#define OR(a,b) ((a) | (b))
#define XOR(a,b) ((a) ^ (b))
#define NOT(a) (~(a))
#define SB(x,i) (OR((x), L(1, (i))))    // x | 1 << i 
#define CB(x,i) (AND((x),NOT(L(1,(i))))) // x & ~(1 << i)
#define TB(x,i) (AND((x), L(1,(i))))    // x & (1 << i) 

/*
    define init data    
*/
#define FILL(a,val) memset(a,val,sizeof(a));
#define INIT(a,l,r,val) REP(i,l,r,1) (a)[i] = val;

/*
    define convert data
*/
#define DIG(c) (int)((c) - '0')
#define CHR(c) (char)((c) + '0')
#define LOW(c) (char)((c) + 32)
#define UPP(c) (char)((c) - 32)

/*
    define math function    
*/
#define sqr(a) (a) * (a)
#define abs(a) (a < 0 ? -(a) : (a))

/*
    define find element in container very fast.
*/
#define LO(c,x) lower_bound(ALL(c),x)   
#define UP(c,x) upper_bound(ALL(c),x)
#define IOF(c,x) distance((c).begin(), LO((c),x))
#define IOL(c,x) distance((c).begin(), UP((c),x))
#define IN(c,x) binary_search(ALL(c),x)
#define ER(c,x) equal_range(ALL(c),x)

/*
    define geo
*/
#define DIS(p,q) sqrt(sqr(p.x - q.x) + sqr(p.y - q.y)) // khoang cach Euclide
#define DIM(p,q) abs(p.x - q.x) + abs(p.y - q.y) // khoang cach mahatan


/*
    define constant
*/

#define EPS 1e-7
#define OO 1000000005
#define N 100005

#define X first
#define Y second

struct Point
{
    double x, y;
    Point(){}
    Point(double x,double y):x(x), y(y){}   
};

struct Node
{
    int value;
    Node* next;
    Node(){}
    Node(int value, Node* next):value(value),next(next){}
};

struct Edge
{
    int src, dst, weight;
    Edge(){}
    Edge(int src, int dst, int weight):src(src), dst(dst), weight(weight){} 
    
};

struct Compare
{
    
    bool operator() (const int i, const int j)
    {
        return i > j;   
    }

    /*
    bool operator() (const Point& p, const Point& q)
    {
        return (p.x != q.x ? p.x < q.x : p.y < q.y);
    }   
    */
    /*
    bool operator()(const Edge& e, const Edge& f)
    {
        return  (e.weight != f.weight ? e.weight > f.weight : e.src != f.src ? 
            e.src < f.src : e.dst < f.dst); // inverse weight
    }
    */
};

    
const int DAY[13] = {-1,31,29,31,30,31,30,31,31,30,31,30,31};

const int dx4[4] = {-1, 0, 1, 0}; //U - R - D - L
const int dy4[4] = {0, 1, 0, -1};

const int dx8[8] = {-1, -1, 0, 1, 1, 1, 0, -1}; //U - UR - R - DR - D - DL - L - UL 
const int dy8[8] = {0, 1, 1, 1, 0, -1, -1, -1};

typedef pair<int,int> II;
typedef pair<II,int> III;
typedef long long LL;
typedef unsigned long long ULL;
typedef unsigned char UC; 

vector<int>::iterator it, low, up; // using lower_bound, upper_bound
pair<vector<int>::iterator, vector<int>::iterator > bound;  // using function equal_range(first, last, x)
Compare comp;
Point p[2];

int n, x, ans[3], res ;

int main()
{
    #define Off  false
    if(Off)
    {
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    }
    cin >> n;
    REP(i,0,n,1)
    {
        cin >> x;
        ans[i % 3] += x;
    }
    res = max(ans[0],max(ans[1],ans[2]));
    if(res == ans[0])
        cout << "chest" << endl;
    else if(res == ans[1])
        cout << "biceps" << endl;
        else
            cout << "back" << endl;
    return 0;
}