codeforce 344 div2 前三题

http://codeforces.com/contest/631

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

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

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



//A题 #include #include #include #include #include #include #include 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 #include #include 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 #include #include 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; }

你可能感兴趣的:(CF)