学习笔记(4)

来源:互联网 发布:c语言代码混淆工具 编辑:程序博客网 时间:2024/05/16 16:20

好几天没有更新学习笔记了,昨天实验室的一帮人去吃队饭了,大二和大一的,想想自己都大二了,真的好快,还记得大一来时候,对所有都充满这好奇,现在更多的是坚持,奋斗了,ZT学长跪了,北京得了铜,他说是铁牌,对他来说铜和铁一样,HEU的学长得了银,很高兴,祝贺他们,他们也是我们的榜样啊,希望大三的时候别再打铁了,还是在啃大白书的数据结构,刚才过了个RMQ,一维的,POJ(3264),他就问你区间最大与最小的差值,把模板一粘,改下,最开始二维数组没开够实际上,dp[50009][50]这样就够了,自己二笔到开100000*100000导致MTE。。。

#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>


#define ll __int64
#define MAX 1000009
using namespace std;


int a[MAX];
int dp1[50009][20];
int dp2[50009][20];


void RMQ_init1(int n)
{
    for(int i=1; i<=n; i++)
        dp1[i][0] = a[i];
    for(int j=1; (1<<j)<=n; j++)
        for(int i=1; i+j-1<=n; i++)
            dp1[i][j] = min(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]);
}
int RMQ1(int l,int r)
{
    int k = 0;
    while((1<<(k+1))<=r-l+1) k++;
    return min(dp1[l][k],dp1[r-(1<<k)+1][k]);
}


void RMQ_init2(int n)
{
    for(int i=1; i<=n; i++)
        dp2[i][0] = a[i];
    for(int j=1; (1<<j)<=n; j++)
        for(int i=1; i+j-1<=n; i++)
            dp2[i][j] = max(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]);
}
int RMQ2(int l,int r)
{
    int k = 0;
    while((1<<(k+1))<=r-l+1) k++;
    return max(dp2[l][k],dp2[r-(1<<k)+1][k]);
}


int main()
{
    int n,m,o;
    while(~scanf("%d%d",&n,&m))
    {
        for(int o = 1; o<=n; o++)
        {
            scanf("%d",&a[o]);
        }
        RMQ_init1(n);
        RMQ_init2(n);
        while(m--)
        {
            int xx,yy;
            scanf("%d%d",&xx,&yy);
            printf("%d\n",RMQ2(xx,yy)-RMQ1(xx,yy));
        }
    }
    return 0;
}

虽然代码写的很罗嗦,但是还是自己OK的,比较高兴,很久没有自己A题了,刚来实验室的时候A了个大一的二分····

#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<math.h>


#define ll __int64
#define s 1e-8
#define E exp(1.0f)
#define MAX 1000009


using namespace std;


int main()
{
    double x;
    while(cin>>x)
    {
        if(x>=E)
            cout<<-1<<endl;
        else
        {
            double l = E,r = 100;
            double mid;
            while(r-l>=1e-15)
            {
                mid = (l+r)/2.0;
                if(log(mid)/mid==log(x)/x)
                {
                    break;
                }
                else if(log(mid)/mid>log(x)/x)
                    l = mid + s;
                else if(log(mid)/mid<log(x)/x)
                    r = mid - s;
            }
            printf("%.5lf\n",mid);
        }
    }
    return 0;
}
/*
但是要注意到一句话:输入的是a和b中较小的那个,如果没有这句话的话就又是另一种做法了


我们可以对方程两边同时取对数,从而得到:ln(a)/a=ln(b)/b
移一下项得到f(x)=ln(a)/a-ln(b)/b
我们的目的是让f(x)=0,所以很容易让人联想到二分算法。


那么首先我们需要证明函数单调性。
我们可以假设输入的数据是a,而需要求的是b=x


于是f(x)=ln(a)/a-ln(x)/x
求导可以计算得到,当x=e的时候f(x)有最小值。


而且f(x)与x轴的两个交点就是所谓的可行解a和b
那么我们很显然的可以得到a和b分列于e的两边。


既然a是较小的那个,那么必然有a<e
故,当a已经大于了e就必然无解,这个时候输出-1


反之一定有解。
于是可以二分计算出答案。
注意到x>e的那个部分是单调递增的。
*/

就是求有没有满足A的B次幂等于B的A次幂的数,这题还是对两边求对数,然后判断函数关系式,好吧,确实看题解了,不会求对数,现问的大胡子。

接回正题,今天看了sha崽的线段树,一点一点学起,稳扎稳打,真的,这个时候正是拔高的时候,明天有CF还是会做的,为了自己,也为了V,不管怎么样,都要努力做到最好,rt<<1和rt<<1|1给我弄蒙了都,还是现看的大白书,rt<<1的意思是rt*2,另一个是rt*2+1,好了,今天就到这了,我要背单词了,四级ing`````

0 0