20200804总结

今天做了几个难度比较小的题,一下子就来感觉了,很爽,尽管我觉得并没有用到线段树的多少知识,但是做题的时候是真的爽。虽然后面又看了看难题依旧是一言难尽,但是慢慢来嘛(又自我安慰,果然老师说的没错,每人管着我我就天天放飞自我)
附上几个今天研究的值得写博客的几个题吧。
P1774 最接近神的人
这个题做了好久但是还没过,先放到前面以免忘了,感觉并没有什么错,就是一个简单的归并排序,把自己代码先晾这里,再慢慢找错误的地方在哪

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=200005;
typedef long long ll;
int dp[maxn],b[maxn],a[maxn],n,x,m,w,d,t,i,j,k,tail,ans,cnt,sum,Max,Min;
void merge_sort(int *A,int x,int y,int *T)
{
    
    
    if(y-x>1)
    {
    
    
        int m=x+(y-x)/2;    //划分
        int p=x,q=m,i=x;
        merge_sort(A,x,m,T);    //递归求解
        merge_sort(A,m,y,T);    //递归求解
        while(p<m||q>y)
        {
    
    
            if(q>=y||(p<m&&A[p]<=A[q]))
                T[i++]=A[p++];    //从左半数组复制到临时空间
            else
            {
    
    
                T[i++]=A[q++];
                ans+=m-i+1;
            }//从右半数组复制到临时空间
        }
        for(i=x;i<y;i++) A[i]=T[i];    //从辅助空间复制回原数组
    }
}
int main()
{
    
    
    cin>>n;
    for(i = 1; i <= n; i++)
    {
    
    
        cin>>a[i];
    }
    merge_sort(a,1,n,b);
    cout<<ans<<endl;
    return 0;
}

P1204 [USACO1.2]挤牛奶Milking Cows
作为一个普及-的题,它其实还是比较水的,按开始时刻排序,然后遍历即可。只不过这是我为数不多的主动用pair,所以拿过来做个纪念(虽然可以用结构体,但是想着多方面的练练,所以就用了pair)

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=100005;
typedef long long ll;
int dp[maxn],b[maxn],n,m,w,d,t,i,j,k,tail,ans,cnt,sum,Max,Min;
pair<int,int>a[maxn];
int main()
{
    
    
    ios::sync_with_stdio(false);
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>a[i].first>>a[i].second;
    sort(a+1,a+1+n);
    int head=a[1].first;
    int tail=a[1].second;
    for(i=2;i<=n;i++)
    {
    
    
        if(a[i].first<=tail)
            tail=max(tail,a[i].second);
        else
        {
    
    
            ans=max(ans,tail-head);
            cnt=max(cnt,a[i].first-tail);
            head=a[i].first;
            tail=a[i].second;
        }
    }
    ans=max(ans,tail-head);
    cnt=max(cnt,a[i].first-tail);
    cout<<ans<<" "<<cnt;
    return 0;
}

P1168 中位数
就是输出前1,3,5…个数的中位数。这个题做的时候比较曲折,超时是永远解决不了的难题,后来去网上搜了下,一个绿题,代码只需要短短几行。用到了vector,用upperbound找到前面存入序列中大于当前元素的元素的位置(有点绕),然后插入该元素,从而实现有序插入,输入的同时就可以输出,省时省力。这个题主要就是我还是不大会使用工具,老是用笨方法想题。很神奇,有一次提交出现了UKE,不知道啥原因,把代码重复交了一遍居然就AC了。这个题我刚开始出现了一个致命的错误,把取整号写成了取余号,怎么看怎么没毛病,结果就是不正确,叹气。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=100005;
typedef long long ll;
int dp[maxn],b[maxn],n,x,m,w,d,t,i,j,k,tail,ans,cnt,sum,Max,Min;
vector<int>v;
int main()
{
    
    
    ios::sync_with_stdio(false);
    cin>>n;
    for(i=1;i<=n;i++)
        {
    
    
            cin>>x;
            v.insert(upper_bound(v.begin(),v.end(),x),x);
            if(i%2)
            {
    
    
                cout<<v[(i-1)>>1]<<endl;
            }
        }
    return 0;
}

然后今天还研究了个自我感觉非常难的题,P1438 无聊的数列,用到了差分数组这个对我来说比较陌生的词汇,研究大佬的代码研究了大半天,还是没怎么研究透,感觉如果这个题理解透了。差分这部分也就明白的差不多了。
附上大佬博客,方便重复研究。

猜你喜欢

转载自blog.csdn.net/weixin_46434074/article/details/107796214