咕咕咕

A.序列

无解情况:$n>a*b$或$n<a+b-1$

把序列分成B段,每段内部上升,各段分界处构成下降子序列。

实现并不是太简单,要动态地考虑一下边界什么的。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int T,n,a,b;
void work()
{
scanf("%d%d%d",&n,&a,&b);
if(n>1LL*a*b||n<a+b-1)
{
puts("No");
return ;
}
puts("Yes");
int beg=n-a+1;
for(int i=beg;i<=n;i++)
printf("%d ",i);
if(b==1)return ;
b--;
int bl=(beg-1)/b,now=beg-bl;
while(b)
{
bl=(beg-1)/b;
now=beg-bl;
for(int i=now;i<beg;i++)
printf("%d ",i);
beg=now;
b--;
}
putchar('\n');
} int main()
{
scanf("%d",&T);
while(T--)work();
return 0;
}

B.购物

按套路来讲,答案区间应该是连续的?

并不是。如果把$a[]$排序后求前缀和,会发现如果$\frac{a_i}{2} > sum_{i-1}$,那么$(sum_{i-1},\frac{a_i}{2}]$就是一段缺口。因为已经排过序了,所以这段缺口是无法用其它方式补上的。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n;
ll a[N],sum[N],ans;
ll div2(ll x)
{
return (x-1>>1)+1;
} int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
if(div2(a[i])>sum[i-1])ans+=div2(a[i])-sum[i-1]-1;
sum[i]=sum[i-1]+a[i];
}
cout<<sum[n]-ans<<endl;
return 0;
}

C.计数

没有限制的话就是Catalan数。

设$dp[l][r]$为在前序遍历上的区间为$[l,r]$,以$l$为根的子树中的方案数。

用二维前缀和记录限制,枚举左右子树分配的大小转移即可。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
typedef long long ll;
const ll mod=1e9+7;
const int N=405;
int T,n,m,g[N][N],sum[N][N];
ll dp[N][N];
int get(int x,int y,int xx,int yy)
{
return sum[xx][yy]-sum[x-1][yy]-sum[xx][y-1]+sum[x-1][y-1];
}
void work()
{
n=read();m=read();
memset(g,0,sizeof(g));
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
g[x][y]++;
}
for(int i=1;i<=n;i++)
{
dp[i][i]=1;
for(int j=1;j<=n;j++)
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+g[i][j];
}
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
if(!get(i,i+1,i,j))(dp[i][j]+=dp[i+1][j])%=mod;
if(!get(i+1,i,j,i))(dp[i][j]+=dp[i+1][j])%=mod;
for(int k=i+1;k<=j-1;k++)
if(!get(i,i+1,i,k)&&!get(k+1,i,j,k))
(dp[i][j]+=dp[i+1][k]*dp[k+1][j])%=mod;
}
}
printf("%lld\n",dp[1][n]);
return ;
} int main()
{
T=read();
while(T--)work();
return 0;
}

[CSP-S模拟测试76]题解的更多相关文章

  1. CSP-S 模拟测试94题解

    T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...

  2. CSP-S模拟测试 88 题解

    T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...

  3. CSP-S 模拟测试92 题解

    话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...

  4. CSP-S 模拟测试57题解

    人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...

  5. CSP-S 模拟测试 51 题解

    考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...

  6. CSP-S 模拟测试 45 题解

    由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...

  7. [CSP-S模拟测试97]题解

    A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...

  8. [CSP-S模拟测试96]题解

    以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...

  9. [CSP-S模拟测试92]题解

    A.数列 显然每个数的答案是互相独立的,直接扩欧求解.我们需要最小化$ax+by=gcd(a,b)$中的$|x|+|y|$,而显然当x或y靠近0时答案可能最优,列个不等式求一下即可. 能$O(1)$千 ...

随机推荐

  1. java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式

    工厂模式定义(百度百科): 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工 ...

  2. 使用多线程开启OCR

    需求:经过opencv 或者其他算法对一张图片里面的文字内容进行切割,获取到切割内容的坐标信息,再使用ocr进行识别.一张一张识别太慢了,我们可以开启多线程识别.代码如下 threads = [] f ...

  3. org.hibernate.id.IdentifierGenerationException: Hibernate异常

    异常信息: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned b ...

  4. [Linux] 020 RPM 包的命名原则与其依赖性

    1. RPM 包命名原则 例如:httpd-2.2.15-15.e16.centos.1.i686.rpm 字符 释义 httpd 软件包名 2.2.15 软件版本 15 软件发布的次数 e16.ce ...

  5. Spring学习(四)--面向切面的Spring

    一.Spring--面向切面 在软件开发中,散布于应用中多处的功能被称为横切关注点(cross- cutting concern).通常来讲,这些横切关注点从概念上是与应用的业 务逻辑相分离的(但是往 ...

  6. deb包转换为rpm包格式

    在Debian系列中安装软件包可以使用apt或者dpkg安装deb包,但是在CentOs, Redhat等则只能安装RPM包,如果希望在Redhat或者CentOS下也安装Deb包的话是不可行的, 但 ...

  7. Word 中的橫式格式方程式和數學自動校正

    以橫式格式輸入方程式 您可以使用數學自動校正程式碼,迅速輸入大多數的方程式.例如,若要對齊方程式陣列,您可以使用 @ 和 &,如下所示: \eqarray(x+1&=2@1+2+3+y ...

  8. python学习第二十五天函数位置参数和关键词参数

    函数位置参数顾名思义就是按位置排序,按位置对应参数,位置一一对应,函数的关键词参数是不按照顺序来的,可以指定的参数传值.但是注意的是,位置参数必须在关键词参数之前. 1,函数位置参数 def good ...

  9. IEnumerable和IEnumerator 详解 分类: C# 2014-12-05 11:47 18人阅读 评论(0) 收藏

    原:<div class="article_title"> <span class="ico ico_type_Original">&l ...

  10. JSON:结构化数据格式

    JSON是javascript的子类,也是作为更好的互联网传输结构化数据格式逐渐取代XML,因此要理解JSON,重要的是理解它是一种数据格式,不是一种编程语言. 语法 //javascript var ...