咕咕咕

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. 运用php函数mkdir创建多级目录

    php默认的mkdir一次只能创建一层目录,如果在当前目录下创建一个div/css/layout 的目录就需要逐层逐层的先创建div,再创建div/css 再创建 div/css/layout,然而我 ...

  2. jQuery基础--选择器

    2. 选择器 2.1. 什么是jQuery选择器 jQuery选择器是jQuery为我们提供的一组方法,让我们更加方便的获取到页面中的元素.注意:jQuery选择器返回的是jQuery对象. jQue ...

  3. [Linux] 012 文件搜索命令

    文件搜索命令:find 命令名称:find 命令所在路径:/bin/find 执行权限:所有用户 语法:find [搜索范围] [匹配条件] 功能描述:文件搜索 范例: 在目录 /etc 中查找文件 ...

  4. A Bug’s Life POJ - 2492(种类并查集)

    题目链接 每次给出两个昆虫的关系(异性关系),然后发现这些条件中是否有悖论 就比如说第一组数据 1 2 2 3 1 3 1和2是异性,2和3是异性,然后说1和3是异性就显然不对了. 我们同样可以思考一 ...

  5. java中位运算和移位运算详解

    一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算        分别看一下正数和负数的具体运算步骤 ...

  6. 查询sqlserver中表信息

    ALTER PROCEDURE [dbo].[GetTableInfo] @tableName NVARCHAR(MAX) AS BEGIN SELECT -- CASE -- WHEN col.co ...

  7. 记一次用Linux curl命令获取Django url返回值异常的问题

    问题描述: curl 检测 URL 返回值以判断服务器是否正常 原命令:curl -I -m 10 -o /dev/null -s -w %{http_code} --insecure $url 问题 ...

  8. linux驱动启动顺序

    首先,我们可以查看Linux内核编译完成后的System.map文件,在这个文件中我们可以看到macb(dm9161驱动模块)链接到了dm9000驱动之前,如下所示: c03b6d40 t __ini ...

  9. javascript中数组元素删除方法splice,用在for循环中巨坑

    一.demo splice: 该方法会改变自动原始数组长度 实例: var array = ["aa","dd","cc","aa ...

  10. 【串线篇】Mybatis之缓存原理

    所谓二级缓存是名称空间级别的缓存,什么意思呢? TeacherDao.xml首行 <mapper namespace="com.atguigu.dao.TeacherDao" ...