2011-05-29 07:53:28Morris

a048. 函数增减性

http://zerojudge.tw/ShowProblem?problemid=a048

內容 :

单调函数的增减性的判断想必大家都很清楚了吧...

这里有N个函数f1(x),f2(x),…,fN(x),开始时我告诉你他们全都是增函数。由于我记性不好,我会时不时发现哪个函数的增减性我说错了,要进行更改。当然,更改的话,肯定告诉你不是增(减)函数而是减(增)函数。

这里,我们定义一个函数F(x)=fL(fL+1(…fR(x)…)),这里1<=L<=R<=N

 

我想问问你F(x)是增函数还是减函数。

輸入說明 :

输入的第一行是两个数N(1<=N<=200000)和Q(1<=Q<=200000)。

接下来有Q行,每行第一个数是v(v=1,2)。

若v=1,那么接着有一个数字i,表示这个是我记错了函数fi的增减性,那么你应该在这个操作之后认为fi函数的增减性与原来的相反;

若v=2,那么接着有两个数字L和R,表示询问你F(x)=fL(fL+1(…fR(x)…))的增减性。

輸出說明 :

对所有v=2的操作,输出F(x)的增减性。

若F(x)是增函数则输出0,若F(x)是减函数则输出1。

範例輸入 :

5 3
2 2 4
1 3
2 2 4

範例輸出 :

0
1

提示 :

测资可能有误,欢迎推翻!

出處 :

liouzhou_101 (管理:liouzhou_101)


題目有點難懂就是了,還好請了別人來幫我看看 ...

作法 : Binary indexed tree
你可以用微分發現(連鎖定理)
F(x)=fL(fL+1(…fR(x)…))
F'(x)= fL ' (fL+1(…fR(x)…)) * (fL+1'(…fR(x)…)) ...
只要查看減函數在[L,R]中的個數,就可以判定了

/**********************************************************************************/
/*  Problem: a048 "函数增减性" from liouzhou_101                             */
/*  Language: C                                                                   */
/*  Result: AC (112ms, 2588KB) on ZeroJudge                                       */
/*  Author: morris1028 at 2011-05-17 20:47:36                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
int Input() {  
    char cha;  
    unsigned int x = 0;  
    while(cha = getchar())  
        if(cha != ' ' && cha != '\n' || cha == EOF) break;  
    if(cha == EOF) return -1;
    x = cha-48;  
    while(cha = getchar()) {  
        if(cha == ' ' || cha == '\n') break;  
        x = x*10 + cha-48;  
    }  
    return x;  
}    
int C[200001]={}, A[200001]={};
int lb[200001];
int Modify(int N, int flag) {
    while(N <= 200000) {
        C[N] += flag;
        N += lb[N];
    }
}
int Operator(int N) {
    int Sum = 0;
    while(N) {
        Sum += C[N];
        N -= lb[N];
    }
    return Sum;
}
main() {
    int N, Q, v, L, R, i;
    int a, b;

    for(a = 1; a <= 200000; a++)
        lb[a] = a & -a;
    scanf("%d %d", &N, &Q);
    while(Q--) {
        v = Input();
        if(v == 1) {
            i = Input();
            if(A[i] == 0) Modify(i, 1);
            else Modify(i, -1);
        }
        else {
            L = Input(), R = Input();
            b = Operator(R) - Operator(L-1);
            if(b&1) puts("1");
            else puts("0");
        }    
    }
    return 0;
}

上一篇:d872. 過橋問題

下一篇:a058. MOD3