CF #373 div2 补题记录

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;
}

 

posted @ 2016-09-24 22:24  啊嘞  阅读(210)  评论(0编辑  收藏  举报