湖南集训Day1

难度
不断网:☆☆☆
断网:☆☆☆☆

/*
卡特兰数取模 由于数据范围小,直接做。
考试时断网。忘记卡特兰数公式,推错了只有5分。
数学公式要记别每次都现用现搜!!!
*/
#include<iostream>
#include<cstdio>
#include<cstring> using namespace std;
int f[];
int n,m,ans; int main()
{
freopen("stack.in","r",stdin);
freopen("stack.out","w",stdout);
scanf("%d",&n);
f[]=;f[]=;
for(int i=;i<=n;i++)
for(int j=,k=i-;j<=i- && k>=;j++,k--)
f[i]+=(f[j]*f[k])%;
printf("%d",f[n]%);
return ;
}
/*
模数较小是一个坑点,直接做逆元可能爆掉(模数很小许多数没有逆元)
答案是 2n!/(n!*(n+1))! 如果直接逆元,2n!预处理很可能成为零,但做了除法后答案可能不是零,就会出错。
所以7的倍数要单独考虑
这里记录了7的倍数的因子里7的幂,然后分子分母就可以加加减减了。这个题用不到。
原来逆元还可以直接搞...
*/
#include<bits/stdc++.h> #define N 1007 using namespace std;
int n,m,d,c,r; int fac(int n)
{
r=;
for(int i=;i<=n;i++)
{
if(i%) r=r*i%;
else
{
int x=i;
while(x%==) {x/=;c+=d;r=r*x%;}
}
}return r;
} int inv(int x)
{
for(int i=;i<;i++)
if(i*x%==) return i;
} int main()
{
scanf("%d",&n);
d=;c=;
r=fac(*n);
int ans=(r*inv(fac(n))%*inv(fac(n+))%)%;
printf("%d\n",c?:ans);
return ;
}


/*
带权并查集
维护链底,链顶,并查集找链底,并维护链的大小
合并时两个链顶链底都要维护。别忘了链底size大小改为1。
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 30007 using namespace std;
int n,m,ans,cnt;
int top[N],dep[N],siz[N]; int find(int x)
{
if(x==dep[x]) return x;
int tmp=dep[x];
dep[x]=find(tmp);
siz[x]+=siz[tmp];
return dep[x];
} void merge(int a,int b)
{
int r1=find(a),r2=find(b);
dep[r1]=top[r2];
top[r2]=top[r1];
siz[r1]=;
} int main()
{
freopen("cube.in","r",stdin);
freopen("cube.out","w",stdout);
int x,y;char ch;
scanf("%d",&n);
for(int i=;i<=n;i++) top[i]=dep[i]=i;
while(n--)
{
cin>>ch;
if(ch=='M')
{
scanf("%d%d",&x,&y);
merge(x,y);
}
else
{
scanf("%d",&x);find(x);
printf("%d\n",siz[x]);
}
}
return ;
}

/*
区间dp,情况有些多需要讨论
首先连续相同的颜色为了方便要合并,记录每个块的颜色,就可以dp了
dp[l][r]表示合并这段区间的最小步数,分几种情况
这段区间是奇数(为了避免区间长度为2的情况)
1. color[l]==color[r] && tot[l]+tot[r]==2 --> dp[l][r] 可从 dp[l+1][r-1]+1 转移过来。
2. color[l]==color[r] && tot[l]+tot[r]>2 --> dp[l][r] 可从 dp[l+1][r-1] 转移过来。
3. color[l]==color[k]==color[r](k∈(l,r) && [l,k],[k,r] 为奇数) -->可从dp[l+1][k-1]+dp[k+1][r-1]转移过来。
这段区间是偶数
普通的转移 dp[l][r] =min(dp[l][r] , dp[l][k]+dp[k+1][r]);
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 257 using namespace std;
int dp[N][N],col[N],a[N];
char s[N];
int n,m,ans; int main()
{
freopen("zuma.in","r",stdin);
freopen("zuma.out","w",stdout);
scanf("%s",s);n=strlen(s);
a[]=;m=;
for(int i=;i<n;i++)
{
if(s[i]==s[i-])
{
col[m]=s[i]==''?:;
a[m]++;
}
else
{
a[++m]=;
col[m]=s[i]==''?:;
}
} for(int len=;len<=m;len++)
{
for(int i=;i<=m;i++)
{
int j=i+len;
if(j>= && j<=m)
{
dp[i][j]=*n;
if(len==) dp[i][j]=-a[i];
else
{
for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][k]+dp[k+][j],dp[i][j]); if((j-i)%==)
{
if(a[i]+a[j]==)
{
if(col[i]==col[j])
dp[i][j]=min(dp[i][j],dp[i+][j-]+);
} else
{
if(col[i]==col[j])
dp[i][j]=min(dp[i][j],dp[i+][j-]);
} if(a[i]+a[j]<)
for(int k=i+;k<j;k+=)
{
if(a[k]==) dp[i][j]=min(dp[i+][k-]+dp[k+][j-],dp[i][j]);
}
}
}
}
}
}
printf("%d\n",dp[][m]);
return ;
}
湖南集训Day1的更多相关文章
- 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1
目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...
- 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生
题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...
- P3900 [湖南集训]图样图森破
P3900 [湖南集训]图样图森破 链接 分析: 感觉像个暴力. 可以枚举回文串的回文中心,即枚举一个串,枚举一个串的位置作为回文中心,然后求出这个串内的回文串的长度. 此时如果回文串两端都没有到这个 ...
- 国庆集训 Day1 T2 生成图 DP
国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...
- 2019暑期金华集训 Day1 组合计数
自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...
- 2019暑期金华集训 Day1 数据结构
自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...
- LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)
LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set $ solution: $ 这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小.于是我 ...
- 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)
牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...
- 暑假集训Day1 整数划分
题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...
随机推荐
- python黑科技库:FuckIt.py,让你代码从此远离bug
今天给你推荐的这个库叫 “FuckIt.py”,名字一看就是很黄很暴力的那种,作者是这样介绍它的: FuckIt.py uses state-of-the-art technology to make ...
- mysql 查询出的数组为null怎么转换成0
mysql 查询出的数组为null怎么转换成0 IFNULL(b.dayPay,0) as yesterdayPay,
- Leetcode 93.复制IP地址
复制IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135& ...
- HBase shell的常用命令(CRUD)
@来源是传智播客hadoop的视频教程,觉得入门不错,就copy过来了 一.启动HBase: sudo -i cd /home/cx/itcast/hbase-1.2.6/bin ./start- ...
- 中文命名之Hibernate 5演示 - 使用注解(annotation)而非xml定义映射
前文中文编程:中文命名之Hibernate 4+MySQL演示最后留下了个Hibernate 5之后出现的问题, 于是在Hibernate社区提交了报告: Seemingly regression s ...
- Linux 安装 RabbitMQ
转载文章,地址:https://www.cnblogs.com/uptothesky/p/6094357.html 侵删!
- Ubuntu中LightDM是什么(转)
LightDM(Light Display Manager)是一个全新的轻量级Linux桌面显示管理器,而传统的Ubuntu是使用GNOME桌面标准的GDM. LightDM是一个跨桌面显示管理器,其 ...
- 网卡MAC地址异常会导致无接受数据包,表现为只有发送没有接收
遇到一个诡异的问题,一块4口博通千兆网卡中两个正常,两个怎么都没有接受,但是博通的程序网卡自检没有任何问题,最后发现是MAC地址的原因.需要将地址改为正常MAC方可正常通讯. 感觉应该是交换机丢弃了M ...
- Effictive Java学习笔记1:创建和销毁对象
建议1:考虑用静态工厂方法代替构造器 理由:1)静态方法有名字啊,更容易懂和理解.构造方法重载容易让人混淆,并不是好主意 2)静态工厂方法可以不必每次调用时都创建一个新对象,而公共构造函数每次调用都会 ...
- mysql limit具体用法
MYSQL中LIMIT用法_百度知道 答 limit是mysql的语法select * from table limit m,n其中m是指记录开始的index,从0开始,表示第一条记录n是指从第m+1 ...