您的位置:首页 > 其它

codeforce 344 div2 前三题

2016-03-11 19:49 309 查看
http://codeforces.com/contest/631

第一题就是按位或,其实不要管这个题目的最后的说明,只要把所有的按位或就可以了

第二题就是涂矩形,每次都会进行涂色,然后如果直接模拟的话肯定是wa的。因为有20W*5000的复杂度(表示刚开始尝试着模拟了一下,就tle)。所以只能够先做预处理储存下这些数字,然后通过条件判断就可以了。

第三题就是排序问题。这道题目卡了我好久,看了一下别人的解释还是没做出来,就顺便看了一下别人的代码。感觉想法是差不多的,不过大牛就是大牛,佩服佩服。大牛的思路就是,先通过for循环和while循环找出其中k所能够对应的坐标的最大值,然后就是模拟。因为最大的所需要排序的数目就是b[i][0]中的,所以只需要对最后几个进行排列就可以了。然而排列的时候需要注意不能超过p,k在寻找值的时候并没有重新更新那些值,所以要注意一定要多一个while(p > b[][])的条件。其他都还好

//A题
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<map>

using namespace std;

typedef long long ll;
const ll inf = 0x3f3f3f3f;
const int maxn = 1000 + 20;
int ind[maxn][2];
int n;

void solve(){
ll x = 0, y = 0;
for (int i = 0; i < n; i++){
x |= ind[i][0];
}
for (int i = 0; i < n; i++){
y |= ind[i][1];
}
printf("%I64d\n", x + y);
}

int main(){
while (scanf("%d", &n) != EOF){
memset(ind, 0, sizeof(ind));
for (int i = 0; i < 2; i++){
for (int j = 0; j < n; j++){
scanf("%d", &ind[j][i]);
}
}
solve();
}
return 0;
}

//B题
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef long long ll;
const int maxn = 5000 + 50;
int n, m, k;
struct point{
int tmp;
int cnt;
}x[maxn], y[maxn];

void init(){
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
int a, b, c;
for (int i = 1; i <= k; i++){
scanf("%d%d%d", &a, &b, &c);
if (a == 1) {
x[b - 1].tmp = i;
x[b - 1].cnt = c;
}
else if (a == 2){
y[b - 1].tmp = i;
y[b - 1].cnt = c;
}
}
}

void prin(){
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
if (y[j].tmp > x[i].tmp){
printf("%d%c", y[j].cnt, j == m-1 ? '\n':' ');
}
else if (y[j].tmp < x[i].tmp){
printf("%d%c", x[i].cnt, j == m-1 ? '\n' : ' ');
}
else printf("%d%c", 0, j == m-1 ? '\n' : ' ');
}
}
}

int main(){
while (scanf("%d%d%d", &n, &m, &k) == 3){
init();
prin();
}
return 0;
}

//C题目
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

const int maxn = 200000 + 20;
int n, m, k;
int a[maxn];
int b[maxn][2];
//方法,如果前面的比他短。那就删除前面的。后面的值保存了就可以了。
void init(){
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for (int i = 0; i < n; i++) scanf("%d", a + i);
k = 0;
for (int i = 0; i < m; i++){
int t, r;
scanf("%d%d", &t, &r);
while (k > 0 && r >= b[k - 1][0]) k--;
if (k > 0 && b[k - 1][1] == t) continue;//一个小小的优化
b[k][0] = r;
b[k][1] = t;
k++;
}
}

void solve(){
int tmp[maxn];
memset(tmp, 0, sizeof(tmp));
int r = b[0][0];
int p = r, l = 0;
for (int i = 0; i < r; i++){
tmp[i] = a[i];
}
b[k][0] = 0;
b[k][1] = 2;//这里就是一个初始化,随便什么种类都可以的
sort(tmp, tmp + r);
for (int i = 0; i <= k; i++){
while (p > b[i + 1][0]){//因为不论怎么改变后面都是不会变的
p--;
if (b[i][1] == 1){
a[p] = tmp[--r];
}
else {
a[p] = tmp[l++];
}
}
}
for (int i = 0; i < n; i++){
printf("%d%c", a[i], i == n - 1 ? '\n' : ' ');
}
}

int main(){
while (scanf("%d%d", &n, &m) == 2){
init();
solve();
}
return 0;
}

</cstring></algorithm></cstdio></algorithm></cstring></cstdio></map></stack></queue></cmath></cstring></algorithm></cstdio>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: