UVA12983 The Battle of Chibi

2023-10-10 20:59
文章标签 battle chibi uva12983

本文主要是介绍UVA12983 The Battle of Chibi,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

R e s u l t Result Result

...


H y p e r l i n k Hyperlink Hyperlink

https://www.luogu.com.cn/problem/UVA12983


D e s c r i p t i o n Description Description

T T T组数据,每组数据给定一个长度为 n n n的序列 A A A,问 m m m元上升子序列个数,答案对 1 0 9 + 7 10^9+7 109+7取模

数据范围: n , m ≤ 1000 n,m\leq 1000 n,m1000


S o l u t i o n Solution Solution

我们只关心大小关系,不关心具体数值,所以先离散化

f i , j f_{i,j} fi,j表示长度为 i i i,以 j j j结尾的 L I S LIS LIS个数,用树状数组维护转移

拓展: n n n如果大到 1 0 5 10^5 105级别的话,如果数据纯随机构造,第一维可以只开到 n \sqrt n n ,因为 L I S LIS LIS的期望长度就是 n \sqrt n n 级别的


C o d e Code Code
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define LL long long
#define N 1010
#define mod 1000000007
using namespace std;int n,m,k,a[N],b[N],T,cas;
LL f[N][N],res,C[N];
inline void A(int x,LL y){for(;x<=n;x+=x&-x)C[x]+=y,C[x]%=mod;return;}
inline LL Q(int x){LL s=0;for(;x;x-=x&-x)s+=C[x],s%=mod;return s;}
inline LL read()
{LL d=1,f=0;char c;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
signed main()
{T=read();while(T--){n=read();k=read();for(register int i=1;i<=n;i++) b[i]=a[i]=read();sort(b+1,b+1+n);m=unique(b+1,b+1+n)-b-1;for(register int i=1;i<=n;i++) f[1][i]=1,a[i]=lower_bound(b+1,b+1+m,a[i])-b;for(register int i=2;i<=k;i++) {fill(C+1,C+1+n,0);for(register int j=1;j<=n;j++){f[i][j]=Q(a[j]-1);A(a[j],f[i-1][j]);}}res=0;for(register int i=k;i<=n;i++) res+=f[k][i],res%=mod;printf("Case #%d: %lld\n",++cas,res);}
}

这篇关于UVA12983 The Battle of Chibi的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/183042

相关文章

【HDU】3986 Harry Potter and the Final Battle 最短路

传送门:【HDU】3986 Harry Potter and the Final Battle 题目分析:先求一次最短路,同时记录在最短路上的顶点以及以该顶点为弧尾的最短路上的边。然后枚举删除每一条边,分别求一次最短路,其中最大的即答案。当然不可达输出-1。 测试发现堆优化的dij不如slf优化的spfa。。可能图太稀疏了吧。。。反正我觉得我写的挺搓的了。。。 代码如下:

1013. Battle Over Cities (25) DFs

1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It is vitally important to have all the cities connected by highways in a

Technocup 2017 - Elimination Round 2 D. Sea Battle

算是正式开始康复训练啦 这是一题简单的思维题… 第一想法是鸽巢原理,因为“最小数量“,“至少一个“等关键词。 那么,就要先知道鸽巢的总数,也就是可能是船的位置的数量。这个时候就要用贪心做,然后只需要保存每个船整个身位中的一个点就行。 然后用鸽巢原理输出数目和顺序就行。 #include <cstdio> #include <cstring> #include <algorithm

TOJ 4365 ZOJ 3623 Battle Ships / 完全背包

Battle Ships 时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte 描述 Battle Ships is a new game which is similar toStar Craft. In this game, the enemy builds a defense tower, which has L longe

URAL 1933 Guns for Battle!

给一个n,要求构造一个矩阵,满足: 1、矩阵大小为(2n+1)*(2n+1) 2、沿对角线对称 3、每个数的值在[0,2n+1]上 4、每行每列没有重复的值 手动写了一下 直接找到规律。。 #include<cstdio>#include<cstring>using namespace std;int n,m,i,j,cnt,s[205][205],k;int ma

hdu3061 Battle 最大流最小割

由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅。而他上任的第一天,就面对了一场极其困难的战斗: 据侦查兵回报,前方共有N座城池,考虑到地势原因,最终得到一个结论:攻占某些城池之前必须攻占另外一些城池。 事实上,可以把地图看做是一张拓扑图,而攻占某个城池,就意味着必须先攻占它的所有前驱结点。 小白还做了一份调查,得到了攻占每个城池会对他的兵力产生多少消耗(当然也可能会得到增

POJ - 2312 Battle City (bfs + priority_queue)

原题: 传送门 题意: 给你一个地图,各字母含义如下: Y:你所在的位置 T:目标位置 B:砖头墙(先开炮打碎砖头,花费1,再通过,花费1,一共花费为2) E:空地(直接通过,花费为1) S:钢铁墙(不能走) R:小河(不能走) 题目就是要求从Y到T的最小花费 思路: 直接bfs套上 注意: 由于存在花费不同的情况,所以需要用优先队列把花费小的放在前面 注意: 由于存在花费不同的情况,所以需要用优

九度OJ 1325:Battle Over Cities(城市间的战争) (并查集)

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:376 解决:132 题目描述: It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/t

poj 1856Sea Battle(BFS ,DFS亦可)

终于AC了,眼泪汪汪啊……昨天从晚上11点弄到2点,开始时TL,然后WR……今天早上再看代码,突然发现,有一个等号没写,悲催啊…… 这个题的关键在于先找出‘#’围成的最大矩形,然后判断: 矩形内部是否全为‘#’; 左边界的左边,右边界的右边和下边界的下边是否全为‘.’ ;下方两个顶点的对顶点是否为‘.’; Sea Battle Time Limit:

浙大PAT 1013题 1013. Battle Over Cities

实质就是判断有几个联通子集,400ms的时限。可以用BFS或者DFS或者并查集,效率当然是并查集最高。 我用BFS暴力320ms过了,练习了C++ STL的QUEUE,代码如下: #include<iostream>#include<queue>using namespace std;int rel[1005][1005];int main(){int i,j,k,N,M,K;int