A
#include<stdio.h> #define MAX_SIZE 100 int moon[MAX_SIZE]; int main() { int n; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d", &moon[i]); if(n == 1) { if(moon[n-1] == 15) printf("DOWN\n"); else if(moon[n-1] == 0) printf("UP\n"); else printf("-1\n"); } else if(moon[n-1] > moon[n-2]) { if(moon[n-1] == 15) printf("DOWN\n"); else printf("UP\n"); } else if(moon[n-1] < moon[n-2]) { if(moon[n-1] == 0) printf("UP\n"); else printf("DOWN\n"); } return 0; }
B
#include<stdio.h> #include<string.h> #define MAX_SIZE 100010 #define MIN(A,B) ((A)<(B)?(A):(B)) char a[MAX_SIZE]; char b1[MAX_SIZE], b2[MAX_SIZE]; int cmp1(char *s, char *p) { int i = 0, count = 0; int len = strlen(s); for(i=0; i<len; i++) if(p[i] == 'b' && p[i] != s[i]) count++; return count; } int cmp2(char *s, char *p) { int i = 0, count = 0; int len = strlen(s); for(i=0; i<len; i++) if(p[i] == 'r' && p[i] != s[i]) count++; return count; } int main() { int n; scanf("%d", &n); scanf("%s", a); b1[0] = 'r'; b2[0] = 'b'; for(int i=1; i<n; i++) { if(b1[i-1] == 'r') b1[i] = 'b'; else if(b1[i-1] == 'b') b1[i] = 'r'; if(b2[i-1] == 'b') b2[i] = 'r'; else if(b2[i-1] == 'r') b2[i] = 'b'; } int count1, count2; int count3, count4; int res1, res2; count1 = cmp1(a, b1); count2 = cmp2(a, b1); res1 = MIN(count1, count2); res1 += (count1 + count2) - 2 * MIN(count1, count2); count3 = cmp1(a, b2); count4 = cmp2(a, b2); res2 = MIN(count3, count4); res2 += (count3 + count4) - 2 * MIN(count3, count4); printf("%d\n", MIN(res1, res2)); return 0; }
C
#include<stdio.h> #include<string.h> #define MAX_SIZE 200010 char grade[MAX_SIZE]; int n, t; int mini; bool flag; void jinwei(char *s, int k) { int x = k - 2; while(x >= 0 && s[x] == '9') { s[x] = '0'; x--; } if(x < 0) flag = true; else s[x]++; } int main() { scanf("%d%d", &n, &t); scanf("%s", grade); int i=0; while(grade[i] != '.') i++; i++; while(i != n) { if(grade[i] >= '5') { mini = i; break; } i++; } if(i == n) mini = n; while(t > 0 && i > 0 && grade[i] != '.') { if(grade[i] >= '5') { t--; grade[i] = '0'; if(grade[i-1] == '.') { jinwei(grade, i); break; } else grade[i-1]++; } i--; } if(mini == n) mini--; while(grade[mini] == '0') mini--; if(grade[mini] == '.') mini--; grade[mini+1] = '\0'; if(flag) printf("1"); printf("%s\n", grade); return 0; }
D
#include<stdio.h> #include<string.h>#define MAX_SIZE 100010 const int MOD_NUM = 1e9 + 7; typedef long long ll; struct mat { mat() {} mat(int a, int b, int c, int d) { ans[0][0] = a; ans[0][1] = b; ans[1][0] = c; ans[1][1] = d; } int ans[2][2]; bool JudgeOne() { for(int i=0; i<2; i++) for(int j=0; j<2; j++) if(i == j && ans[i][j] != 1 || i != j && ans[i][j] != 0) return false; return true; } void SetOne() { for(int i=0; i<2; i++) for(int j=0; j<2; j++) ans[i][j] = (i == j) ? 1 : 0; } mat operator *(const mat &b)const { mat c(0,0,0,0); for(int k=0; k<2; k++) for(int i=0; i<2; i++) for(int j=0; j<2; j++) c.ans[i][j] = (c.ans[i][j] + (ll)ans[i][k] * b.ans[k][j]) % MOD_NUM; return c; } mat operator +(const mat &b)const { mat c; for(int i=0; i<2; i++) for(int j=0; j<2; j++) c.ans[i][j] = (ans[i][j] + b.ans[i][j]) % MOD_NUM; return c; } }; struct node { mat sum; mat tempt; }tree[4*MAX_SIZE]; mat a[MAX_SIZE]; mat temp; mat cal_fib(int x) { mat c; mat t(0,1,1,1); c.SetOne(); while(x) { if(x & 1) c = c * t; t = t * t; x = x >> 1; } return c; } void build(int l, int r, int root) { tree[root].tempt.SetOne(); if(l == r) { tree[root].sum = a[l]; return ; } int mid = (l + r) / 2; build(l, mid, root*2); build(mid+1, r, root*2+1); tree[root].sum = tree[root*2].sum + tree[root*2+1].sum; } void down(int root) { tree[root*2].sum = tree[root*2].sum * tree[root].tempt; tree[root*2].tempt = tree[root*2].tempt * tree[root].tempt; tree[root*2+1].sum = tree[root*2+1].sum * tree[root].tempt; tree[root*2+1].tempt = tree[root*2+1].tempt * tree[root].tempt; tree[root].tempt.SetOne(); } void query_1(int l, int r, int L, int R, int root, mat value) { if(L == l && r == R) { tree[root].tempt = tree[root].tempt * value; tree[root].sum = tree[root].sum * value; return ; } if(!tree[root].tempt.JudgeOne()) { down(root); } int mid = (L + R) / 2; if(r <= mid) query_1(l, r, L, mid, root*2, value); else if(l > mid) query_1(l, r, mid+1, R, root*2+1, value); else { query_1(l, mid, L, mid, root*2, value); query_1(mid+1, r, mid+1, R, root*2+1, value); } tree[root].sum = tree[root*2].sum + tree[root*2+1].sum; } int query_2(int l, int r, int L, int R, int root) { if(L == l && r == R) { return tree[root].sum.ans[0][1]; } if(!tree[root].tempt.JudgeOne()) { down(root); } int ret = 0; int mid = (L + R) / 2; if(r <= mid) ret = query_2(l, r, L, mid, root*2); else if(l > mid) ret = query_2(l, r, mid+1, R, root*2+1); else { ret = query_2(l, mid, L, mid, root*2) + query_2(mid+1, r, mid+1, R, root*2+1) % MOD_NUM; } return ret % MOD_NUM; } int main() { int n, m, d; scanf("%d%d", &n, &m); for(int i=1; i<=n; i++) { mat base(0, 1, 1, 1); scanf("%d", &d); a[i] = cal_fib(d); } build(1, n, 1); for(int i=0; i<m; i++) { int type, l, r, x; scanf("%d", &type); if(type == 1) { mat base(0, 1, 1, 1); scanf("%d%d%d", &l, &r, &x); temp = cal_fib(x); query_1(l, r, 1, n, 1, temp); } else { scanf("%d%d", &l, &r); printf("%d\n", query_2(l, r, 1, n, 1)); } } return 0; }