a题:
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!
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).
Print "Yes" if the given lab is good and "No" otherwise.
You can output each letter in upper or lower case.
3 1 1 2 2 3 1 6 4 1
Yes
3 1 5 2 1 1 1 1 2 3
No
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".
#include <iostream>
#include <stack>
#include <map>
#include <set>
#include <cstdio>
using namespace std;
const int maxn = 55;
set<int> row[55];
set<int> col[55];
int n, mat[55][55];
bool check(int x, int r, int c) {
for(auto it = row[r].begin(); it != row[r].end(); ++it)
if(*it != x && col[c].find(x - *it) != col[c].end())
return true;
return false;
}
bool judge() {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(mat[i][j] != 1 && !check(mat[i][j], i, j))
return false;
}
}
return true;
}
int main() {
//freopen("in.txt", "r", stdin);
while(~scanf("%d", &n)) {
for(int i = 0; i < 55; i++) {
row[i].clear();
col[i].clear();
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
scanf("%d", &mat[i][j]);
row[i].insert(mat[i][j]);
col[j].insert(mat[i][j]);
}
}
if(judge()) printf("Yes\n");
else printf("No\n");
}
return 0;
}
b题
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.
The first line of input contains two space-separated integers m and b (1 ≤ m ≤ 1000, 1 ≤ b ≤ 10000).
Print the maximum number of bananas Okabe can get from the trees he cuts.
1 5
30
2 3
25
#include <iostream>
#include <cstdio>
#include <cmath>
typedef long long ll;
using namespace std;
ll b, m;
int main() {
cin >> m >> b;
ll ans = -1;
for(ll x = 0; x <= b*m; x++) {
ll y = (b*m - x) / m;
ll a1 = (x + 1) * x / 2;
ll n = y + 1, d = x + 1;
ans = max(ans, (n*a1 + n*(n-1)/2*d));
}
cout << ans << endl;
return 0;
}
c题
Okabe and Super Hacker Daru are stacking and removing boxes. There are n boxes numbered from 1 to n. Initially there are no boxes on the stack.
Okabe, being a control freak, gives Daru 2n commands: n of which are to add a box to the top of the stack, and n of which are to remove a box from the top of the stack and throw it in the trash. Okabe wants Daru to throw away the boxes in the order from 1 to n. Of course, this means that it might be impossible for Daru to perform some of Okabe's remove commands, because the required box is not on the top of the stack.
That's why Daru can decide to wait until Okabe looks away and then reorder the boxes in the stack in any way he wants. He can do it at any point of time between Okabe's commands, but he can't add or remove boxes while he does it.
Tell Daru the minimum number of times he needs to reorder the boxes so that he can successfully complete all of Okabe's commands. It is guaranteed that every box is added before it is required to be removed.
The first line of input contains the integer n (1 ≤ n ≤ 3·105) — the number of boxes.
Each of the next 2n lines of input starts with a string "add" or "remove". If the line starts with the "add", an integer x (1 ≤ x ≤ n) follows, indicating that Daru should add the box with number x to the top of the stack.
It is guaranteed that exactly n lines contain "add" operations, all the boxes added are distinct, and n lines contain "remove" operations. It is also guaranteed that a box is always added before it is required to be removed.
Print the minimum number of times Daru needs to reorder the boxes to successfully complete all of Okabe's commands.
3 add 1 remove add 2 add 3 remove remove
1
7 add 3 add 2 add 1 remove add 4 remove remove remove add 6 add 7 add 5 remove remove remove
2
In the first sample, Daru should reorder the boxes after adding box 3 to the stack.
In the second sample, Daru should reorder the boxes after adding box 4 and box 7 to the stack.
/*
add操作简单。
对于remove操作,当栈顶元素正好是要移除的时候,直接移除即可。当栈顶元素并非要移除的元素的时候,说明要进行排序,
将答案加上一,此时要移除的目标元素肯定在栈中,将栈全都移入一个堆。然后弹出堆顶的元素,这样肯定是目标移除元素。
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <stack>
using namespace std;
stack<int> st;
priority_queue<int, vector<int>, greater<int> > pq;
int n;
int main() {
//freopen("in.txt", "r", stdin);
while(~scanf("%d", &n)) {
while(!st.empty()) st.pop();
while(!pq.empty()) pq.pop();
string cmd;
int id, lastbox = 0, ans = 0;
for(int i = 0; i < 2*n; i++) {
cin >> cmd;
if(cmd == "add") {
cin >> id;
st.push(id);
}
if(cmd == "remove") {
++lastbox;
if(!st.empty() && st.top() != lastbox) {
ans++;
while(!st.empty()) {
pq.push(st.top());
st.pop();
}
pq.pop();
}
else if(!st.empty() && st.top() == lastbox)
st.pop();
else if(st.empty() && !pq.empty())
pq.pop();
}
}
cout << ans << endl;
}
}