首页 > 其他分享 >CF1208D Restore Permutation

CF1208D Restore Permutation

时间:2022-11-02 11:12:45浏览次数:81  
标签:Restore int 题解 -- Permutation mid vis ans CF1208D

题目传送门

思路

别的题解讲的比较奇妙,来一篇易懂的题解。

首先我们发现最后一个位置的值是可以首先确定的,因为它前面的数已经填完了。

设最后一个位置的数为 \(x\),则它的贡献就是 \(\frac{x \times (x+1)}{2}\),所以最后一个数就是满足 \(\frac{x \times (x+1)}{2}=a_n\) 的 \(x\)。

以此类推,我们从后往前考虑,对于每个节点的数可以二分求得,直接树状数组动态维护前缀和即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int const N=1e6+10;
int a[N],ans[N],n,vis[N];
struct Tree_Array{
    int c[N];
    inline int lowbit(int x){return x&-x;}
    inline void update(int x,int v){while (x<=n) c[x]+=v,x+=lowbit(x);}
    inline int query(int x){int res=0;while (x) res+=c[x],x-=lowbit(x);return res;}
}T;
inline int check(int x){return (x+1)*x/2-T.query(x);}
inline int qry(int x){
    int l=0,r=n;
    while (l<r){
        if (l+1==r){
            if (check(r)<=x) ++l;
            break;
        }
        int mid=(l+r)>>1;
        if (check(mid)>x) r=mid-1;
        else l=mid;
    }
    return l+1;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n;
    for (int i=1;i<=n;++i) cin>>a[i];
    for (int i=n;i>=1;--i){
        ans[i]=qry(a[i]);
        T.update(ans[i],ans[i]);
    }
    for (int i=n;i;--i){
        while (vis[ans[i]]) --ans[i];
        vis[ans[i]]=1;
    }
    for (int i=1;i<=n;++i) cout<<ans[i]<<' ';
    cout<<'\n';
    return 0;
}

标签:Restore,int,题解,--,Permutation,mid,vis,ans,CF1208D
From: https://www.cnblogs.com/tx-lcy/p/16850349.html

相关文章

  • Codeforces - 1391C - Cyclic Permutations(思维 + 组合数学 + 数论 + 图论、*1500)
    1391C-CyclicPermutations(⇔源地址)目录1391C-CyclicPermutations(⇔源地址)tag题意思路AC代码错误次数:0tag⇔思维、⇔组合数学、⇔数论、⇔......
  • SQLSERVER 恢复命令restore总结
    一、概述SQLSERVER的备份与恢复命令:BACKUP和RESTORE是一对孪生兄弟,在前一篇文章中我们介绍了BACKUP命令及其选项的使用,就像BACKUP命令一样,RESTORE命令也有很多的选项,......
  • SP15637 GNYR04H - Mr Youngs Picture Permutations
    SP15637GNYR04H-MrYoungsPicturePermutations-洛谷|计算机科学教育新生态(luogu.com.cn)好题。考虑从小到大(身高从高到低)安排每个数的位置。这样,已经被安排......
  • Leetcode第784题:字母大小写的全排列(Letters case permutation)
    解题思路使用回溯法。从左往右依次遍历字符,当遍历到字符串s的第i个字符c时:如果c为一个数字,继续检测下一个字符。如果c为一个字母,将其进行大小写转换,然后往后继续遍历;完......
  • STL函数之全排列next_permutation
    题目描述牛牛的作业薄上有一个长度为n的排列A,这个排列包含了从1到n的n个数,但是因为一些原因,其中有一些位置(不超过10个)看不清了,但是牛牛记得这个数列顺序对的数量是k,顺......
  • 固定JetBrains的搜索窗口大小(Restore Default Layout)
     1.快捷键Ctrl+Alt+F调出搜索框2.自由调整搜索窗口的大小(可使用Ctrl+Alt+Shift+方向键来调整窗口大小)3.最左上方栏中的倒数第二个Window→点击 StoreC......
  • CF1743B Permutation Value
    题链:cfluogu构造。Description构造一个\(1\simn\)的排列,使之连续子串构成\(1\simk\)排列的数目最少。Analysis显然,最小数目可以为\(2\)。因为可以构造所示......
  • CF1156E Special Segments of Permutation
    题目链接:​​传送门​​直接枚举最大值往左右扩就过了,,*/#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<algorit......
  • next_permutation / prev_permutation 用法
    给定输入的序列a(整数即可,其他无限制条件),next_permutation(a+1,a+n+1)可以求出a的关于值的下一个排列,prev_permutation(a+1,a+n+1)可以求出a的关于值......
  • E. Permutation by Sum
    传送门题意:给出n,l,r,s,要求构造一个序列,要求满足l,r区间的和是s,存在就是输出序列,否则就-1思路:首先判断是否-1,很简单,就是一个区间里面的最大值和最小值,s必须......