Codeforces Round #420 (Div. 2)(A+B)

来源:互联网 发布:hadoop在linux部署 编辑:程序博客网 时间:2024/06/06 15:04

A. Okabe and Future Gadget Laboratory
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Okabe needs to renovate the Future Gadget Laboratory after he tried doing some crazy experiments! The lab is represented as an n by n square grid of integers. A good lab is defined as a lab in which every number not equal to 1 can be expressed as the sum of a number in the same row and a number in the same column. In other words, for every x, y such that 1 ≤ x, y ≤ n and ax, y ≠ 1, there should exist two indices s and t so that ax, y = ax, s + at, y, where ai, j denotes the integer in i-th row and j-th column.

Help Okabe determine whether a given lab is good!

Input
The first line of input contains the integer n (1 ≤ n ≤ 50) — the size of the lab.

The next n lines contain n space-separated integers denoting a row of the grid. The j-th integer in the i-th row is ai, j (1 ≤ ai, j ≤ 105).

Output
Print “Yes” if the given lab is good and “No” otherwise.

You can output each letter in upper or lower case.

Examples
input
3
1 1 2
2 3 1
6 4 1
output
Yes
input
3
1 5 2
1 1 1
1 2 3
output
No
Note
In the first sample test, the 6 in the bottom left corner is valid because it is the sum of the 2 above it and the 4 on the right. The same holds for every number not equal to 1 in this table, so the answer is “Yes”.

In the second sample test, the 5 cannot be formed as the sum of an integer in the same row and an integer in the same column. Thus the answer is “No”.
题意:问你对于每一个!=1的aij。是否在第i行和第j列各找一个数,使他们的和==aij。
题解:暴力判断
代码:

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <set>using namespace std;int a[60][60];int n;int solve(int x,int y){    set<int>s;    for(int ii=1;ii<=n;ii++)    {        for(int jj=1;jj<=n;jj++)        {            s.insert(a[x][ii]+a[jj][y]);        }    }    if(s.find(a[x][y])!=s.end()) return 1;    return 0;}int main(){    cin>>n;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {            cin>>a[i][j];        }    }    bool flag=true;      for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)        {           if(a[i][j]!=1)           {               if(solve(i,j)==0)               flag=false;           }           if(flag==false) break;        }        if(flag==false) break;    }    if(flag==false) cout<<"No"<<endl;    else    cout<<"Yes"<<endl;}

B. Okabe and Banana Trees
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Okabe needs bananas for one of his experiments for some strange reason. So he decides to go to the forest and cut banana trees.

Consider the point (x, y) in the 2D plane such that x and y are integers and 0 ≤ x, y. There is a tree in such a point, and it has x + y bananas. There are no trees nor bananas in other points. Now, Okabe draws a line with equation . Okabe can select a single rectangle with axis aligned sides with all points on or under the line and cut all the trees in all points that are inside or on the border of this rectangle and take their bananas. Okabe’s rectangle can be degenerate; that is, it can be a line segment or even a point.

Help Okabe and find the maximum number of bananas he can get if he chooses the rectangle wisely.

Okabe is sure that the answer does not exceed 1018. You can trust him.

Input
The first line of input contains two space-separated integers m and b (1 ≤ m ≤ 1000, 1 ≤ b ≤ 10000).

Output
Print the maximum number of bananas Okabe can get from the trees he cuts.

Examples
input
1 5
output
30
input
2 3
output
25
题意:在所给的直线和第一象限所围成的图形中,找到贡献最大的矩形(可退化)。贡献:矩形中,所有点的行列和。
题解:因为y轴最大为1000,所以o(b^2)枚举起点和终点,根据直线算出矩形的长,前缀和计算贡献,维护最大值。
代码:

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <set>using namespace std;typedef long long int ll;ll  a[10000001];void init(){    a[0]=0;    for(int i=1;i<=10000000;i++)    a[i]+=a[i-1]+i;}int main(){    int m,b;    cin>>m>>b;    init();    ll ans=0;    for(int i=0;i<=b;i++)    {        for(int j=0;j<=b;j++)        {            ll leni=(b-i)*m;            ll lenj=(b-j)*m;            ll mi=min(leni,lenj);            ll x,y;            if(i==0) x=0;            else x=a[i-1];            y=a[j];            if(ans<a[mi]*(j-i+1)+(y-x)*(mi+1))            {                ans=a[mi]*(j-i+1)+(y-x)*(mi+1);            }        }    }    cout<<ans<<endl;}
原创粉丝点击