题意及思路

题目大意:给定一个H(x,y)方程及一个数 r,求能否有一对(x,y)能满足H 求得 r。当然有条件的 x的值尽可能小。如果没有这样的x,则输出“NO”。


思路:单层循环,循环的范围是1 到 sqrt(r),每一次利用 x 的值去找是否有 y 能够匹配。即 t = r - x*x - x - 1; if(t > 0 && t%2==0)则 y = t/2;


踩坑点:这题的数据范围很大,r 的 范围到了 12次方级别,第一个降时间复杂度的点事 x的范围 <= sqrt(r)。第二个降的点是拿x 和 r 去找满足条件的 y ,之前用的都是双层循环,虽说外层循环降了,内层也降了一半,但是外层的sqrt(r)仍然是 6 次方,双层循环很恐怖的。还有一个点,就是题目说的是正整数,x、y的值只能从1开始,切记!

这里用的数据类型是__int64,存放大整数.


官方题解



代码

#include<stdio.h> #include<math.h> int reverseH(__int64 r,__int64 *x,__int64 *y); int main(){
    __int64 r,x,y;
    scanf("%I64d",&r); if(reverseH(r,&x,&y)){
        printf("%I64d %I64d\n",x,y);
    }else{
        printf("NO\n");
    } return 0;
} int reverseH(__int64 r,__int64 *x,__int64 *y){
    __int64 t,flag = 0; for(__int64 i=1;i<=sqrt(r);i++){
        t = r-i*i-i-1; if(t>0 && t%2==0){ *x = i; *y = t/2;
            flag = 1; break;
        }
    } return flag;
}




题意及思路:

题意:略。

思路:简单模拟。

代码

#include<stdio.h> /* flag = 1 -> 插入
flag = 0 -> 二合一 */ int main(){ int n,k,m,t,flag,i,len;
    scanf("%d %d %d %d",&n,&k,&m,&t);
    len = n; while(t--){
        scanf("%d %d",&flag,&i); if(flag){//insert if(len<m){ if(i>k) len++; else {k++;len++;}
            }else continue;
        }else{//broken if(len==1) continue; if(i>=k) len=i; else{
                len -= i;
                k -= i;
            }
        }
        printf("%d %d\n",len,k);
    } return 0;
}