咕咕咕

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. Dos.Common - 目录、介绍

    引言: Dos.Common是一个开发中的常用类库,如HttpHelper.LogHelper.CacheHelper.CookieHelper.MapperHelper等等.与Dos.WeChat. ...

  2. vscode左侧文件不同颜色标识含义

    代码里的左侧颜色标识: 红色,未加入版本控制; (刚clone到本地)绿色,已经加入版本控制暂未提交; (新增部分)蓝色,加入版本控制,已提交,有改动: (修改部分)白色,加入版本控制,已提交,无改动 ...

  3. Robotframework使用自写库连接mysql数据库

    Robotframework使用自写库连接mysql数据库 新建库文件mysqltest.py 代码如下: # -*- coding: utf-8 -*- import MySQLdbimport o ...

  4. deepin下安装配置git

    https://blog.csdn.net/menglinjie/article/details/77145537 1.安装gitsudo apt-get install git12.配置用户名和邮箱 ...

  5. [BZOJ3622] 已经没有什么好害怕的了(dp+容斥)

    Description: ​ 有两个数组a和b,两两配对,求 \(a_i>b_i\) 的配对比 \(b_i>a_i\) 的配对多 \(k\) 个的方案数 \(k\le n\le 2000\ ...

  6. redis缓存架构-03-redis下的replication以及master+slave

    1.master和slave的读写分离(水平扩容支持读高并发) 2.master主从复制流程 master开始复制给slave前的认证流程 master向slave复制流程 2.1 无磁盘化复制配置 ...

  7. POI之Excel文档增删改查

    需要引用apache第三方lib库poi 支持xls.xlsx格式excel读写操作 package com.hua.excel; import java.io.File;import java.io ...

  8. NGUI的下拉框的使用(popup list script)

    一,我们先添加一个sprite,选择sprite,右键选择attach,添加box collider, 然后右键选择attach,添加popup list script ,我们给popup list ...

  9. Js数据去重复,时间更换格式,cookie,localStorage和sessionStorage的使用等通用方法

    一,数组去重复 function unique(arr) { // 遍历arr,把元素分别放入tmp数组(不存在才放) var tmp = new Array(); for (var i in arr ...

  10. 汇编语言之寄存器使用bx si di bp

    转载自:https://www.cnblogs.com/youxin/archive/2012/05/29/2524780.html 如果你看到这篇博客时正在做第七章问题,强烈建议先去把8.1~8.4 ...