Codeforces 631C Report排序+思维

来源:互联网 发布:上帝悖论 知乎 编辑:程序博客网 时间:2024/06/06 02:08

点击打开链接

//题意:n,k<=2e5 n个数,k个操作 输入t,ri 把1~ri排成非递增或非递减(t=0||1)

//容易看出 若i<j&&ri<rj 则操作i无效 因为最终会被操作j覆盖 

//所以最后剩下的操作为 i<j ri>rj

//r[i]为递减,r[i]操作后a的r[i+1]+1~r[i]这段不会在改变 

为了找到r[i+1]~r[i]这段将b从小到大排序 
t=1 递增时 a中r[i+1]+1~r[i]为b的后几位

t=0 递减时 a中的r[i+1]+1~r[i]为b的前几位

#include <iostream>#include <cmath>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;typedef long long ll;const ll mod=1e8+7;const int N=2e5+20;int a[N],b[N],t[N];//题意:n,k<=2e5 n个数,k个操作 输入t,ri 把1~ri排成非递增或非递减(t=0||1)//容易看出 若i<j&&ri<rj 则操作i无效 因为最终会被操作j覆盖 //所以最后剩下的操作为 i<j ri>rjint r[N]; int main(){int n,k;cin>>n>>k;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}int op=0;for(int i=1;i<=k;i++){scanf("%d%d",&t[i],&r[i]);while(op>0&&r[i]>=r[op-1])op--;t[op]=t[i];r[op]=r[i];op++;}r[op]=0; for(int i=1;i<=r[0];i++)// r[i]+1~n没有操作的 {b[i]=a[i];}sort(b+1,b+1+r[0]);//b从小到大 //t=1 递增时 a中r[i+1]+1~r[i]为b的后几位//t=0 递减时 a中的r[i+1]+1~r[i]为b的前几位//r[i]为递减,每次操作后a的r[i+1]+1~r[i]这段不会在改变 int st=1,ed=r[0];//时间复杂度为O(nlogn+op) for(int i=0;i<op;i++){for(int j=r[i];j>r[i+1];j--){if(t[i]==1){a[j]=b[ed--];}else{a[j]=b[st++];}}}for(int i=1;i<=n;i++){printf("%d",a[i]);if(i==n)cout<<endl;elsecout<<' ';}return 0;} /* 10 5 2 4 3 6 9 7 10 8 1 5 2 9 2 8 1 6 2 4 1 2 */  





0 0
原创粉丝点击