暑假集训test-8-29
今天瓜成一坨了。
瓜的说不出话来。
直接退役算了我。
T1
傻逼题,但是我傻逼地敲了一个线段树合并,然后把空间炸了,只剩20分,
直接dfs维护子树大小,子树中最大最小值即可统计答案。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,rt,fa[N]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} int ecnt,fir[N],nxt[N],to[N];
void add(int u,int v) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
} int ans;
int mi[N],mx[N],sgrt[N],sz[N];
void dfs(int x) {
mi[x]=mx[x]=x;
sz[x]=;
for(int i=fir[x];i;i=nxt[i]) {
dfs(to[i]);
sz[x]+=sz[to[i]];
mi[x]=min(mi[x],mi[to[i]]);
mx[x]=max(mx[x],mx[to[i]]);
}
if(sz[x]==mx[x]-mi[x]+) ans++;
} #define ANS
int main() {
#ifdef ANS
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
read(n);
For(i,,n) {
int u,v;
read(u); read(v);
fa[v]=u; add(u,v);
}
For(i,,n) if(!fa[i]) rt=i;
dfs(rt);
printf("%d\n",ans);
Formylove;
}
T2
我已经菜到连f[i][j]表示放完前i个数,最后一个放的数是前i个数中第j大的的方案数的dp都想不出来了。。。
上午一直在瞎yy一个三方的垃圾算法,以为t1t3稳了这题大概要T一些点,结果T1爆空间T3没拍写挂了,这题却tmd水过去了。。大概就是从小的往大的连边,这个图的拓扑序的数目就是答案,发现这个图很特殊,可以区间dp,f[l][r]表示把l~r取完的方案数,组合数转移,写的是记忆化搜索。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(register int i=(a);i<=(b);i++)
const int N=,p=;
typedef long long LL;
typedef double db;
using namespace std;
char s[N];
int n,a[N];
LL f[N][N],C[N][N];
vector<int>vc[N]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} void pre() {
For(i,,n) {
For(k,i+,n-) if(a[k]!=&&a[k+]!=-)
vc[i].push_back(k);
}
} LL dfs(int l,int r) {
if(l>=r) return ;
if(f[l][r]==-) {
LL rs=; int k=l;
int ltot=k-l,rtot=r-k;
if(a[k+]!=-)
rs=(rs+dfs(l,k-)*dfs(k+,r)%p*C[ltot+rtot][ltot]%p)%p;
k=r;
ltot=k-l,rtot=r-k;
if(a[k]!=)
rs=(rs+dfs(l,k-)*dfs(k+,r)%p*C[ltot+rtot][ltot]%p)%p;
int up=vc[l].size();
For(j,,up-) {
if(vc[l][j]>=r) break;
k=vc[l][j];
ltot=k-l,rtot=r-k;
rs=(rs+dfs(l,k-)*dfs(k+,r)%p*C[ltot+rtot][ltot]%p)%p;
}
f[l][r]=rs;
}
return f[l][r];
} #define ANS
int main() {
#ifdef ANS
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
#endif
scanf("%s",s);
n=strlen(s);
For(i,,n-) {
if(s[i]=='D') a[i+]=-;
else if(s[i]=='I') a[i+]=;
else a[i+]=;
}
++n;
For(i,,n) C[i][]=;
For(i,,n) For(j,,i) C[i][j]=(C[i-][j]+C[i-][j-])%p;
memset(f,-,sizeof(f));
pre();
dfs(,n);
printf("%lld\n",f[][n]);
Formylove;
}
/*
IIDD?DD??I
*/
T3
先dp出lcs,f[i][j]表示a的前i个字符和b的前j个字符的lcs.
再dp答案。g[i][j]表示a的前i个字符中长度为f[i][j]并且在b的前j个字符中出现过子序列个数。
两种转移
1、不选a[i],
如果f[i-1][j]==f[i][j]
g[i][j]+=g[i-1][j]
2、选a[i]
找到b的前j个字符中最靠后的一个和a[i]相等的字符b[k],
如果f[i-1][k-1]+1==f[i][j]
g[i][j]+=g[i-1][k-1];
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=,p=1e9+;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,f[N][N];
LL g[N][N];
char a[N],b[N]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} #define ANS
int main() {
#ifdef ANS
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
#endif
scanf("%s",a);
scanf("%s",b);
n=strlen(a); m=strlen(b);
For(i,,max(n,m)) g[i][]=g[][i]=;
For(i,,n) For(j,,m) {
if(a[i-]==b[j-]) f[i][j]=f[i-][j-]+;
else f[i][j]=max(f[i-][j],f[i][j-]);
}
For(i,,max(n,m)) g[i][]=g[][i]=;
For(i,,n) {
int k=;
For(j,,m) {
if(a[i-]==b[j-]) k=j;
if(f[i][j]==f[i-][j]) g[i][j]=g[i-][j];
if(k&&f[i-][k-]+==f[i][j]) g[i][j]=(g[i][j]+g[i-][k-])%p;
}
}
printf("%lld\n",g[n][m]);
Formylove;
}
/*
ab
aa
*/
暑假集训test-8-29的更多相关文章
- STL 入门 (17 暑假集训第一周)
快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...
- 2015UESTC 暑假集训总结
day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...
- 暑假集训Day2 互不侵犯(状压dp)
这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...
- 暑假集训Day1 整数划分
题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...
- [补档]暑假集训D5总结
%dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/ ...
- 2013ACM暑假集训总结-致将走上大三征途的我
回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...
- [补档]暑假集训D6总结
考试 不是爆零,胜似爆零= = 三道题,就拿了20分,根本没法玩好吧= = 本来以为打了道正解,打了道暴力,加上个特判分,应该不会死的太惨,然而--为啥我只有特判分啊- - 真的是惨. 讲完题觉得题是 ...
- [补档]暑假集训D1总结
归来 今天就这样回来了,虽然心里极其不想回来(暑假!@#的只有一天啊喂),但还是回来了,没办法,虽然不喜欢这个地方,但是机房却也是少数能给我安慰的地方,心再累,也没有办法了,不如好好集训= = %da ...
- 暑假集训(2)第七弹 -----今年暑假不AC(hdu2037)
J - 今年暑假不AC Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB 64 ...
- [补档]暑假集训D3总结
考试 集训第一次考试,然而- - 总共四道题,两道打了DFS,一道暴力,一道~~输出样例~~乱搞,都是泪啊- - 目前只改了三道,回头改完那道题再上题解吧- - T2 [Poi2010]Monot ...
随机推荐
- Nodejs进阶:密码加盐
原理:就是在密码特定位置插入特定字符串后,再对修改后的字符串进行md5运算. demo var crypto=require("crypto"); function cryptPw ...
- Sql 语法整理
Query 1 SELECT 和 SELECT * 语句 SELECT LastName,FirstName FROM Persons 2 SELECT DISTINCT 语句 SELECT DIST ...
- common配置文件
<dependencies> <dependency> <groupId>com.github.pagehelper</groupId> <art ...
- java中文件下载的思路(参考:孤傲苍狼)
文件下载 文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载 文件下载功能的实现思路: 1.获取要下载的文件的绝对路径 2.获取要下载的文件 ...
- Yii2 自定义组件
basic\components\HelloWidget namespace app\components; use yii\base\Widget; use yii\helpers\Html; cl ...
- 【Dart学习】-- Dart之注释
Dart支持三种注释类型: 单行注释,多行注释,文档注释. 单行注释单行注释以//开头,从//开始到一行结束的所有内容都会被Dart编译器忽略,示例代码如下: main(){ //打印输出 print ...
- 安全检测及分析神器—AppScan使用教程
最近项目准备验收,所以最近在做项目验收的准备工作:我们公司规定,项目的安全检测必须通过才能进行项目验收:公司的安全部门用的检测软件就是大名鼎鼎的IBM Rational Appscan;在教由安全部门 ...
- 向量vector 容器浅析
一.什么是vector? 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能 ...
- cdn 链接
1.jquery : http://www.jq22.com/cdn/ 2.常用前端库引用地址 : http://www.jq22.com/jquery/jquery.html 3.vC ...
- Thymeleaf 模板布局三种区别