F-Kobolds and Catacombs
考虑每一段,先找到最小的,然后把编号小于它的都化为一组,此时有一个最大值需要把小于最大值的在划分进来,然后又有编号小于它的,于是再把编号小于它的划分为一组,while1 循环一下即可模拟。
Code1
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=1000010;
int n;
struct node
{int v,id;bool operator<(const node&o)const{return v<o.v||v==o.v&&id<o.id;}
}a[N];
int b[N];int main()
{n=rd();for(int i=1;i<=n;i++) {a[i].v=rd(),a[i].id=i;b[i]=a[i].v;}sort(a+1,a+1+n);int ans=0;for(int i=1,j=1;i<=n&&j<=n;i++){ans++;int id=a[i].id;int mx=a[i].v;while(1){for(;j<=id;j++) mx=max(mx,b[j]);while(i<=n&&(a[i].v<mx||a[i].v==mx&&a[i].id<=id)) {if(a[i].v<mx) id=max(id,a[i].id);i++;}if(i==n+1) break;for(;j<=id;j++) mx=max(mx,b[j]);if(a[i].v>=mx) break;}i--;}printf("%d\n",ans);return 0;
}
Code2
题解大佬的代码,一看就恍然大悟,非常简洁
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=1000010;
int n;
int a[N],b[N];
int main()
{n=rd();for(int i=1;i<=n;i++) a[i]=rd(),b[i]=a[i];sort(b+1,b+1+n);ll sa=0,sb=0;int ans=0;for(int i=1;i<=n;i++){sa+=a[i];sb+=b[i];if(sa==sb) ans++;}printf("%d\n",ans);return 0;
}