今天做了几个难度比较小的题,一下子就来感觉了,很爽,尽管我觉得并没有用到线段树的多少知识,但是做题的时候是真的爽。虽然后面又看了看难题依旧是一言难尽,但是慢慢来嘛(又自我安慰,果然老师说的没错,每人管着我我就天天放飞自我)
附上几个今天研究的值得写博客的几个题吧。
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 无聊的数列,用到了差分数组这个对我来说比较陌生的词汇,研究大佬的代码研究了大半天,还是没怎么研究透,感觉如果这个题理解透了。差分这部分也就明白的差不多了。
附上大佬博客,方便重复研究。