首页 > 其他分享 >C - Almost Sorted

C - Almost Sorted

时间:2023-04-06 15:45:05浏览次数:50  
标签:newi Almost ++ int continue pragma Sorted mod

https://atcoder.jp/contests/arc132/tasks/arc132_c

  • 很难想到的动态规划,优化空间的思路非常巧妙
  • 用相对位置来转移
  • f[i][j]表示i之前,放置数字的压缩情况为j,的所有方案数
  • ** f[i+1][(j | (1 << k)) >> 1] += f[i][j] **
  • k表示i放的数字的相对位置
  • 具体转移还是看代码
#include<bits/stdc++.h>
#define debug1(a) cout<<#a<<'='<< a << endl;
#define debug2(a,b) cout<<#a<<" = "<<a<<"  "<<#b<<" = "<<b<<endl;
#define debug3(a,b,c) cout<<#a<<" = "<<a<<"  "<<#b<<" = "<<b<<"  "<<#c<<" = "<<c<<endl;
#define debug4(a,b,c,d) cout<<#a<<" = "<<a<<"  "<<#b<<" = "<<b<<"  "<<#c<<" = "<<c<<"  "<<#d<<" = "<<d<<endl;
#define debug5(a,b,c,d,e) cout<<#a<<" = "<<a<<"  "<<#b<<" = "<<b<<"  "<<#c<<" = "<<c<<"  "<<#d<<" = "<<d<<"  "<<#e<<" = "<<e<<endl;
#define debug0(x) cout << "debug0: " << x << endl
#define fr(t, i, n)for (long long i = t; i < n; i++)
#define YES cout<<"Yes"<<endl
#define nO cout<<"no"<<endl
#define fi first
#define se second
//#define int long long
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;

//#pragma GCC optimize(3,"Ofast","inline")
//#pragma GCC optimize(2)

const int N = 510,mod = 998244353;
int f[N][1<<15];                                //表示i之前的所有数字的使用情况,压缩为j
int a[N];                                       //通过相对位置来转移
                                                //因为像个的太远肯定彼此之间不会用到
void solve() 
{
    f[0][0] = 1;                    
    int n,d;cin >> n >> d;
    for(int i = 0;i < n;i ++)
    {
        cin >> a[i];
        a[i] --;
    }

    for(int i = 0;i < n;i ++)                   //位置
    {
        for(int j = 0;j < 1<<(2*d + 1);j ++)    //状态
        {

            if(a[i] >= 0)                       //a[i]大于0的情况
            {
                int temp = a[i] - i + d;        //已经放的数字对应的相对位置
                if(~j>>temp&1)(f[i+1][(j | (1<<temp)) >> 1] += f[i][j]) %= mod;
                continue;
            }

            for(int k = 0;k < 2*d+1;k ++)       //a[i]是-1的情况
            {
                int newi = k - d + i;
                if(newi < 0 || newi >= n)continue;
                if(j>>k&1)continue;             
                (f[i+1][(j|(1<<k)) >> 1] += f[i][j]) %= mod;
            }
        }
    }
    // for(int i = 0;i <= n;i ++)                   //位置
    // {
    //     debug2(i,f[i][(1<<d) - 1]);
    // }
    cout << f[n][((1<<d) - 1)] << endl;             //((1<<d) - 1)d个1的二进制,正好是n之前所有的
    
}

signed main()
{
    /*
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    */

    int T = 1;//cin >> T;
    while(T--){
        solve();
    }
    return 0;
}

标签:newi,Almost,++,int,continue,pragma,Sorted,mod
From: https://www.cnblogs.com/cfddfc/p/17292954.html

相关文章

  • sort,sorted,reverse,reversed的区别
    python中sort,sorted,reverse,reversed的区别简单的说以上四个内置函数都是排序。对于sort和reverse都是list列表的内置函数,一般不传参数,没有返回值,会改变原列表的值。而sorted和reversed是python内置函数,需要传参数,参数可以是字符串,列表,字典,元组,不管传的参数是什么sorted返回的......
  • SearchInRotatedSortedArray
    packageBisectionMethod;/***33.搜索旋转排序数组*在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,*使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。*例如,[0,1,2,4,5......
  • 解决tabix建索引报错[E::hts_idx_push] Unsorted positions on sequence #
    当我对两个基因型文件位置取交集,并重新生成两个vcf:$bcftoolsview-Roverlap.lstvariant.filter.vcf.gz-Oz-o300.vcf.gz出现如下错误:$tabix300.vcf.gz[E::hts_idx_push]Unsortedpositionsonsequence#4:29013869followedby29013853tbx_index_buildfailed:300.......
  • Redis 有序集合(sorted set)
    Redis有序集合(sortedset)Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通......
  • python中sorted排序
     key是自定义函数reverse=False,升序(默认)reverse=True,倒序#不区分大小写排序sorted(['bob','aBout','ZOO','Credit'],key=str.lower)#按绝对值排序sorted([36,5,-12......
  • 数据类型-Sorted Set(待补充)
    Redis为什么使用skiplist而不是平衡树Redis中的skiplist主要是为了实现sortedset相关的功能,红黑树当然也能实现其功能,为什么redis作者当初在实现的时候用了skiplist而不......
  • Python基础之sorted()函数用法
    1、简单的排序sorted函数可以对可迭代类型的容器内的数据进行排序lst1=(5,4,3,2,1)lst2=('F','D','Y','e','a','v')#字符串类型的排序按照ASCII的大小进行比较L1......
  • Java stream sorted自定义排序规则实现多字段排序
      Stream提供了丰富的操作(中间操作和终端操作)集合元素的轮子,但Stream流操作不影响原始集合数据,执行结果是一个新的集合对象。在《Javastreamsorted使用Comparator进......
  • Steam流中的sorted方法排序
    使用方法packagecom.sports.basketball.controller.dto;importjava.util.ArrayList;importjava.util.Comparator;importjava.util.List;importjava.util.stream.Col......
  • java8新特性-引用流-sorted
    例子:List<User>users=newArrayList<>();users.add(newUser("张三",30));users.add(newUser("李四",34));users.add(newUser("王五",20));......