【题解】康拓展开(养生题)

【题解】康拓展开(养生题)

养生养生

编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#528662 #167. 康托展开 Accepted 100 1129 ms 8060 K C++ 11 (Clang) / 1.2 K winlere 2019-07-17 8:29:28

假如说我的排列是这样的
\[
2 \quad3 \quad4\quad5\quad1
\]
可以从左往右扫,扫到第一个时,发现这个位置不是\(1\),而是\(2\),说明至少经历了\((2-1)\times (5-1)!\)次排列才可能第一个是\(2\)。把第一个判断完之后,就剩下了一个子排列,是个子问题。不过要动态维护每个数在当前剩下的数的排名,开个值域线段树就好了。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;  typedef long long ll;
inline int qr(){
      register int ret=0,f=0;
      register char c=getchar();
      while(c<48||c>57)f|=c==45,c=getchar();
      while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
      return f?-ret:ret;
}
const int mod=998244353;
const int maxn=1e6+5;
int jc[maxn],n;
int data[maxn];
#define lowbit(x) ((x)&(-(x)))
inline void add(const int&pos,const int&ad){
      for(register int t=pos;t<=n;t+=lowbit(t))
        data[t]=data[t]+ad;
}

inline int q(const int&pos){
      register ll ret=0;
      for(register int t=pos;t;t-=lowbit(t))
        ret+=data[t];
      return ret;
}

inline void add(const int&l,const int&r,const int&ad){
      if(l>r)return;
      add(l,ad);add(r+1,-ad);
}

int main(){
      int ans=1;
      n=qr();
      jc[0]=1;
      for(register int t=1;t<=n;++t)
        jc[t]=1ll*jc[t-1]*t%mod;
      for(register int t=1;t<=n;++t)
        add(t,t,t);
      for(register int t=1,t1;t<=n;++t){
        t1=qr();
        ans=(ans+1ll*(q(t1)-1)*jc[(n-t)]%mod)%mod;
        add(t1+1,n,-1);
      }
      printf("%d\n",ans);
      return 0;
}

原文地址:https://www.cnblogs.com/winlere/p/11198706.html

时间: 2024-08-30 11:23:57

【题解】康拓展开(养生题)的相关文章

康拓展开和逆康拓展开

康拓展开和逆康拓展开 康拓展开模板题 复杂度O(\(n^2\))的会tle(看数据就知道了)(虽然某题解说可以,不知道是不是后期加强了数据 然而我还是写了O(\(n^2\))的 #include <cstdio> typedef long long LL; LL f[1000010]; const LL mod = 998244353; int a[1000010], b[1000010]; int main() { f[0] = 1; for(int i = 1; i < 100000

九宫重拍(bfs + 康拓展开)

问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12345678. 把第二个图的局面记为:123.46758 显然是按从上到下,从左到右的顺序记录数字,空格记为句点. 本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达.如果无论多少步都无法到达,则输出-1. 输入格式 输入第一行包含九宫的初态,第二行包含九宫的终态. 输出格式 输出最

九宫重排_康拓展开_bfs

历届试题 九宫重排 时间限制:1.0s   内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12345678. 把第二个图的局面记为:123.46758 显然是按从上到下,从左到右的顺序记录数字,空格记为句点. 本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达.如果无论多少步都无法到达,则输出-1. 输入格

【HDOJ3567】【预处理bfs+映射+康拓展开hash】

http://acm.hdu.edu.cn/showproblem.php?pid=3567 Eight II Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 130000/65536 K (Java/Others)Total Submission(s): 4541    Accepted Submission(s): 990 Problem Description Eight-puzzle, which is also calle

hdoj1043 Eight(逆向BFS+打表+康拓展开)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 思路: 由于自己对康拓展开用的太少,看到这个题没想到康拓展开,最开始打算直接转换为数字,但太占内存了,又想到可以将状态存进set,后来查了一下发现原来是考察康拓展开.另外就是需要打表预处理,这样快很多.BFS部分就是已知终点,从终点逆向搜索,并存每个状态的上一个状态以及操作,以便输出. 坑点:输入是多组输入,POJ那道题才是一组输入,卡在这一上午T_T. 有一组输入为12345678x,需要特

康拓展开与逆康拓展开

1.康托展开的解释 康托展开就是一种特殊的哈希函数 把一个整数X展开成如下形式: X=a[n]*n!+a[n-1]*(n-1)!+...+a[2]*2!+a[1]*1! 其中,a为整数,并且0<=a<i,i=1,2,..,n {1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个.123 132 213 231 312 321 . 代表的数字 1 2 3 4 5 6 也就是把10进制数与一个排列对应起来. 他们间的对应关系可由康托展开来找到.

ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)

魔板问题,一道经典的康拓展开+BFS问题,为了实现方便,我用string类来表示字符串,此前很少用string类(因为不够高效,而且相对来说我对char数组的相关函数比较熟),所以在这里也发现了很多容易被忽视的问题. 对于康拓展开不太熟系的可以先参看一篇博客:http://blog.csdn.net/zhongkeli/article/details/6966805 关于sting类,大家要注意,在赋值的时候,其赋值位置不能与首位置间存在未赋值部分. 题目需要转换思路的地方是: 我们需要将起始魔

Hdoj 1430 魔板 【BFS】+【康拓展开】+【预处理】

魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2139    Accepted Submission(s): 452 Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版--魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可用方块的颜

全排序与康拓展开

全排列: n=3 123 132 213 231 312 321 (由1~n组成,且出现一次,从小到大排序(或从大到小排序,或不排序)) 求全排序: I. Dfs1 //全排序没有顺序 #include <iostream> using namespace std; long a[100],n; void swap(long &a,long &b) { long temp; temp=a; a=b; b=temp; } void dfs(long pos) { long i;