https://vijos.org/p/1892

此题需要手动开栈:

int size=<<; //256MB
char *p=(char*)malloc(size)+size;
__asm__("movl %0, %%esp\n" :: "r"(p));

还需要卡评测机←十分的神

卡了30多次评测机终于屈服了,一开始我盲目乱提交,总是T,后来上网找了一下解决卡常数方法,如下:

  解决卡常数的方法比较多样化,主要有重复交题,拼人品让测评机快一点,在代码末尾加上//orz+神犇名字等(注意:没加“//”可能导致运行时间直接变为0ms!)。很多计算机算法竞赛的专家也在钻研如何解决这一问题,所以类似ZKW线段树等可以有效减少常数的时间占用的方法也在不断被发现,今后还有很大的探索空间。

没错,从那之后我提交就在程序最后加// orz ...,把人差不多都%了个遍,但都是90分,%charge时只是80分,但当我%马神(Godder)时成功AC!所以以后被卡常时就%%Godder,说不定就能AC。OI隐藏技能

以下是我的ACcode,重点在倒数第二行,保我AC的那一行

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
inline const int max(const int &a,const int &b){return a>b?a:b;}
inline const int min(const int &a,const int &b){return a<b?a:b;}
const int N=;
struct charge{
int nxt,to;
}e[N<<];
int cnt=,point[N],r[N],sr[N],et[N],f[N][];
long long M,g[N][];
void read(int &sum)
{
char c=getchar();sum=;
while (c<''||c>'') c=getchar();
while (''<=c&&c<='') sum=sum*+c-,c=getchar();
}
void insect(int x,int y){e[++cnt].nxt=point[x];point[x]=cnt;e[cnt].to=y;}
void dp(int x,int fa)
{
long long tp; int mx,j,sz=;
g[x][]=;
for (int i=point[x];i;i=e[i].nxt) if (e[i].to!=fa)
{
j=e[i].to;
dp(j,x); tp=;
mx=max(f[j][],f[j][]); f[x][]+=mx;
if (f[j][]==mx) tp=g[j][];
if (f[j][]==mx) tp+=g[j][];
g[x][]=(g[x][]*tp)%M;
}
for (int i=point[x];i;i=e[i].nxt)
if (e[i].to!=fa) et[++sz]=e[i].to;
r[sz+]=; sr[sz+]=;
for3 (i,sz,)
{
mx=max(f[et[i]][],f[et[i]][]);
r[i]=r[i+]+mx;
tp=;
if (f[et[i]][]==mx) tp=g[et[i]][];
if (f[et[i]][]==mx) tp+=g[et[i]][];
sr[i]=(sr[i+]*tp)%M;
}
long long sl=; int l=;
for1 (i,,sz)
{
mx=l+r[i+]+f[et[i]][]+;
if (mx>f[x][])
{
f[x][]=mx;
g[x][]=((sl*sr[i+])%M*g[et[i]][])%M;
}
else if (mx==f[x][])
g[x][]=(g[x][]+(((sl*sr[i+])%M*g[et[i]][])%M))%M;
mx=max(f[et[i]][],f[et[i]][]);
l+=mx; tp=;
if (f[et[i]][]==mx) tp=g[et[i]][];
if (f[et[i]][]==mx) tp+=g[et[i]][];
sl=(sl*tp)%M;
}
}
void outit()
{
int mx=max(f[][],f[][]),ans=;
if (mx==f[][]) ans=g[][];
if (mx==f[][]) ans+=g[][];
printf("%d\n%lld\n",mx,ans%M);
}
int main()
{
int size=<<; //256MB
char *p=(char*)malloc(size)+size;
__asm__("movl %0, %%esp\n" :: "r"(p));
memset(point,,sizeof(point));
memset(f,,sizeof(f));
memset(g,,sizeof(g));
int n,i,x,y;
read(n);
for2 (i,,n)
{
read(x); read(y);
insect(x,y); insect(y,x);
}
scanf("%lld\n",&M);
dp(,-);
outit();
return ;
// orz Godder
}

然后就行了。

Vijos p1892 树上的最大匹配 树形DP+计数 被卡常我有特殊技巧heheda的更多相关文章

  1. 【vijos】1770 大内密探(树形dp+计数)

    https://vijos.org/p/1770 不重不漏地设计状态才能正确的计数QAQ 虽然可能最优化是正确的,但是不能保证状态不相交就是作死.... 之前设的状态错了... 应该设 f[i][0] ...

  2. BZOJ_4033_[HAOI2015]树上染色_树形DP

    BZOJ_4033_[HAOI2015]树上染色_树形DP Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的 ...

  3. 2021.07.17 P3177 树上染色(树形DP)

    2021.07.17 P3177 树上染色(树形DP) [P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.dp思想是需要什么,维护 ...

  4. 【vijos】1892 树上的最大匹配(树形dp+计数)

    https://vijos.org/p/1892 这个必须得卡评测机+手动开栈才能卡过QAQ 手动开栈我百度的... int size=256<<20; //256MB char *p=( ...

  5. Vijos p1770 大内密探 树形DP+计数

    4天终于做出来了,没错我就是这么蒟蒻.教训还是很多的. 建议大家以后编树形DP不要用记忆化搜索,回溯转移状态个人感觉更有条理性. 大神题解传送门 by iwtwiioi 我的题解大家可以看注释&quo ...

  6. 树上的等差数列 [树形dp]

    树上的等差数列 题目描述 给定一棵包含 \(N\) 个节点的无根树,节点编号 \(1\to N\) .其中每个节点都具有一个权值,第 \(i\) 个节点的权值是 \(A_i\) . 小 \(Hi\) ...

  7. [vijos 1642]班长的任务 [树形dp]

    背景 十八居士的毕业典礼(1) 描述 福州时代中学2009届十班同学毕业了,于是班长PRT开始筹办毕业晚会,但是由于条件有限,可能每个同学不能都去,但每个人都有一个权值,PRT希望来的同学们的权值总和 ...

  8. 【BZOJ4033】[HAOI2015] 树上染色(树形DP)

    点此看题面 大致题意: 给你一棵点数为N的带权树,要你在这棵树中选择K个点染成黑色,并将其他的N-K个点染成白色.要求你求出黑点两两之间的距离加上白点两两之间距离的和的最大值. 树形\(DP\) 这道 ...

  9. Codeforces Round #277 (Div. 2)D(树形DP计数类)

    D. Valid Sets time limit per test 1 second memory limit per test 256 megabytes input standard input ...

随机推荐

  1. 边工作边刷题:70天一遍leetcode: day 85

    Find the Celebrity 要点: 这题从solution反过来想比较好:loop through n同时maintain一个candidate:如果cand认识某个i,那么modify c ...

  2. MonoDevelop Debug Unity

    环境 Unity 4.3.x MonoDevelop 4.0.1 资料 更新Unity4.3.X之后的版本,MonoDevelop的版本也进行了升级,IDE的界面发生了比较大的改变. 查阅了Unity ...

  3. ant 自动构建血泪史

    1.  android.bat update project -p . -t xxx 其中: xxx 为 targetid 特别注意的是:  targetid 不等于 API Level.... 2. ...

  4. HTML5 - 使用JavaScript控制<audio>音频的播放

    有时我们需要使用js来控制播放器实现音乐的播放,暂停.或者使用js播放一些音效.   1,通过JavaScript控制页面上的播放器 比如把页面上添加一个<audio>用来播放背景音乐(由 ...

  5. Gvim使用

    VIM删除空白行 命令:g/^\s*$/d :g 代表在全文档范围内 ^代表行的开始 \s*代表空白字符 &代表行的结束 d代表删除 用//将3段代码隔开

  6. 一个DOM元素绑定多个事件时,先执行冒泡还是捕获

    绑定在被点击元素的事件是按照代码顺序发生,其他元素通过冒泡或者捕获“感知”的事件,按照W3C的标准,先发生捕获事件,后发生冒泡事件.所有事件的顺序是:其他元素捕获阶段事件 -> 本元素代码顺序事 ...

  7. user database的initial size和dbcc shrinkfile

    之前我们讨论了dbcc shrinkfile改变tempdb initial size的情况.而用DBCC Shrinkfile去收缩一个user database,情况就比较简单了.让我们通过一些测 ...

  8. 微软职位内部推荐-Software Engineer II

    微软近期Open的职位: Job Description Group: Search Technology Center Asia (STCA)/Search Ads Title: SDEII-Sen ...

  9. getLovParameter

    else if (pageContext.isLovEvent()) { StHelper.handleLovEvent(pageContext, webBean); } public static ...

  10. php基础10:字符串中插入变量

    <?php //插入字符串 //1.双引号可以解析字符串中的变量:但是前后不能跟中文符号 $username = "gaoxiong"; echo "my name ...