http://codeforces.com/contest/273
A. Dima and Staircase
简单的线段树成段更新询问操作
// Author : JayYe Created Time: 2013-11-23 19:32:38
#include
#include
#include
using namespace std;
typedef __int64 ll;
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
const int maxn = 100000 + 10;
ll mx[maxn<<2], mark[maxn<<2];
void down(int rt) {
if(mark[rt]) {
mark[rt<<1] = mark[rt<<1|1] = mark[rt];
mx[rt<<1] = mx[rt<<1|1] = mx[rt];
mark[rt] = 0;
}
}
void up(int rt) {
mx[rt] = max(mx[rt<<1], mx[rt<<1|1]);
}
void create(int rt, int l, int r) {
if(l == r) {
scanf("%I64d", &mx[rt]);
return ;
}
int mid = (l + r)/2;
create(lson); create(rson);
up(rt);
}
ll query(int rt, int l, int r, int L, int R) {
if(L <= l && R >= r) {
return mx[rt];
}
down(rt);
int mid = (l + r)/2;
ll ret = 0;
if(L <= mid) ret = max(ret, query(lson, L, R));
if(R > mid) ret = max(ret, query(rson, L, R));
up(rt);
return ret;
}
void update(int rt, int l, int r, int L, int R, ll val) {
if(L <= l && R >= r) {
mark[rt] = val;
mx[rt] = val;
return ;
}
down(rt);
int mid = (l + r)/2;
if(L <= mid) update(lson, L, R, val);
if(R > mid) update(rson, L, R, val);
up(rt);
}
int main() {
int n, m, w, h;
scanf("%d", &n);
create(1, 1, n);
scanf("%d", &m);
while(m--) {
scanf("%d%d", &w, &h);
ll now = query(1, 1, n, 1, w);
printf("%I64d\n", now);
update(1, 1, n, 1, w, now + h);
}
return 0;
}
B. Dima and Two Sequences
题意:给你两个序列a, b,分别构成点 ( a(1), 1 ), ( a(2), 2), ... ( a(n), n) , (b(1), 1) , ( b(2), 2) ... ( b(n), n)
将这2n个点排成一列,要求x不下降,问有多少种不同的排列方法。
思路:对于不同的x,肯定是排在不同的块中的,所以对于相同的x进行处理排列数,然后相乘即可。由于相同的x中y相同的最多就两个相同,所以直接暴力处理这个块中排列数即可。
// Author : JayYe Created Time: 2013-11-23 19:50:38
#include
#include
#include
#include