今天瓜成一坨了。

瓜的说不出话来。

直接退役算了我。

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的更多相关文章

  1. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  2. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  3. 暑假集训Day2 互不侵犯(状压dp)

    这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...

  4. 暑假集训Day1 整数划分

    题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...

  5. [补档]暑假集训D5总结

    %dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/   ...

  6. 2013ACM暑假集训总结-致将走上大三征途的我

    回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...

  7. [补档]暑假集训D6总结

    考试 不是爆零,胜似爆零= = 三道题,就拿了20分,根本没法玩好吧= = 本来以为打了道正解,打了道暴力,加上个特判分,应该不会死的太惨,然而--为啥我只有特判分啊- - 真的是惨. 讲完题觉得题是 ...

  8. [补档]暑假集训D1总结

    归来 今天就这样回来了,虽然心里极其不想回来(暑假!@#的只有一天啊喂),但还是回来了,没办法,虽然不喜欢这个地方,但是机房却也是少数能给我安慰的地方,心再累,也没有办法了,不如好好集训= = %da ...

  9. 暑假集训(2)第七弹 -----今年暑假不AC(hdu2037)

    J - 今年暑假不AC Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64 ...

  10. [补档]暑假集训D3总结

    考试 集训第一次考试,然而- -   总共四道题,两道打了DFS,一道暴力,一道~~输出样例~~乱搞,都是泪啊- - 目前只改了三道,回头改完那道题再上题解吧- - T2 [Poi2010]Monot ...

随机推荐

  1. Manacher模板(O(n)内求最长回文串长度)

    转自:https://segmentfault.com/a/1190000008484167 /* 由于回文分为偶回文(比如 bccb)和奇回文(比如 bcacb),而在处理奇偶问题上会比较繁琐,所以 ...

  2. bzoj1066题解

    [解题思路] 考虑拆点,把每根石柱拆成两个点,具体可以理解为石柱底部和石柱顶部,能爬到石柱顶部的蜥蜴只有有限只,而且蜥蜴只有爬到了石柱顶部才能跳到其他石柱的底部. 这样,考虑如下建图: 将每个有蜥蜴的 ...

  3. 建模+线性dp——cf1201D

    这类题目要首先把模型建立起来,挑选一个好的状态能让dp方程简化很多 /* dp[i][0]表示从右到左,最后停在左端 dp[i][1]表示从左到右,最后停在右端 dp[i+1][0]=min(dis( ...

  4. 模数循环节——cf547A

    campjls讲过模数循环节的问题,今天做cf才做到这类题 h1->a1的长度为len1,a1->a1的长度为cir1 h2->a2的长度为len2,a2->a2的长度为cir ...

  5. python的代码块缓存机制,小数据池机制。

    同一代码块的缓存机制 在python中一个模块,一个函数,一个类,一个文件等都是一个代码块. 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其 ...

  6. xlwings结合dataframe数据的写入

    一.代码 import xlwings as xw import pandas as pd xl_path=r'***' df_path=r'***' df=pd.read_excel(df_path ...

  7. HDU 1392 Surround the Trees (凸包周长)

    题目链接:HDU 1392 Problem Description There are a lot of trees in an area. A peasant wants to buy a rope ...

  8. PAT_A1121#Damn Single

    Source: PAT A1121 Damn Single (25 分) Description: "Damn Single (单身狗)" is the Chinese nickn ...

  9. testNG官方文档翻译-3 testng.xml

    你可以通过以下几种不同的方法触发TestNG: 用一个testng.xml文件 使用ant 从命令行触发 这个章节将会介绍testng.xml的格式(你也可以在下面找到关于ant和命令行的内容). 关 ...

  10. DFS问题举例:N个整数选k个使其和为x

    N个整数选k个使其和为x,若有多个方案,选择元素平方和最大的一个 #include<cstdio> #include<cmath> #include<cstring> ...