期望得分:100+100+20=220

实际得分:100+100+20=220

(好久没有期望==实际了 ,~\(≧▽≦)/~)

对于 a。。。。。。。。a

如果 第1个a 后面出现的第1个b~z 是右端点,且在第2个a之前,那么有贡献

如果 第2个a 前面出现的第1个b~z 是左端点,且在第1个a之后,那么有贡献

最后的贡献/2

#include<cstdio>
#include<cstring> #define N 100001 using namespace std; char s[N]; int LAST[],last[N],pre[N][],suf[N][];
bool w[N],c[]; int main()
{
freopen("cross.in","r",stdin);
freopen("cross.out","w",stdout);
scanf("%s",s+);
int len=strlen(s+),ans=,ch; for(int i=;i<=len;i++)
for(int j=;j<;j++)
if(s[i]-'a'==j) pre[i][j]=i;
else pre[i][j]=pre[i-][j]; for(int i=;i<;i++) suf[len][i]=len+;
suf[len][s[len]-'a']=len;
for(int i=len-;i;i--)
for(int j=;j<;j++)
if(s[i]-'a'==j) suf[i][j]=i;
else suf[i][j]=suf[i+][j]; for(int i=;i<=len;i++)
{
ch=s[i]-'a';
c[ch]^=; w[i]=!c[ch];
if(c[ch]) LAST[ch]=i;
else last[i]=LAST[ch];
} for(int i=;i<=len;i++)
if(w[i])
{
for(int j=;j<;j++)
if(j!=s[i]-'a')
{
if(suf[last[i]][j]<i && w[suf[last[i]][j]]) ans++;
if(pre[i][j]>last[i] && !w[pre[i][j]]) ans++;
}
} printf("%d",ans>>);
}

dis[i][j] 表示 到第i个点,用了j次传送的最快时间

堆优化的dijkstra

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 501
#define M 2001 int n,m,g,k; int front[N],to[M<<],nxt[M<<],val[M<<],tot;
bool fly[M<<]; int DIS[N][]; struct node
{
int tim,dis,num;
bool operator < (node p) const
{
return dis>p.dis;
}
}cur,nt; priority_queue<node>q; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v,int w,bool fl)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w; fly[tot]=fl;
} void init()
{
read(n); read(m); read(g); read(k);
int u,v,w;
k=min(g,k);
while(m--)
{
read(u); read(v); read(w);
add(u,v,w,);
}
while(g--)
{
read(u); read(v); read(w);
add(u,v,w,);
}
} void dijkstra()
{
memset(DIS,,sizeof(DIS));
cur.dis=; cur.num=; cur.tim=;
DIS[][]=;
q.push(cur);
while(!q.empty())
{
cur=q.top(); q.pop();
if(cur.num==n)
{
printf("%d",cur.dis);
return;
}
if(DIS[cur.num][cur.tim]!=cur.dis) continue;
for(int i=front[cur.num];i;i=nxt[i])
{
if(DIS[to[i]][cur.tim+fly[i]]<cur.dis+val[i]) continue;
if(cur.tim+fly[i]>k) continue;
DIS[to[i]][cur.tim+fly[i]]=cur.dis+val[i];
nt.dis=cur.dis+val[i];
nt.tim=cur.tim+fly[i];
nt.num=to[i];
q.push(nt);
}
}
printf("-1");
} int main()
{
freopen("move.in","r",stdin);
freopen("move.out","w",stdout);
init();
dijkstra();
return ;
}

相当于把树分成许多块,每一个块的大小>=k,求分块方案数

树上背包

dp[i][j] 以i为根子树内,块的大小为j的方案数

g[j] 当前大小为j的块的方案数

cnt[i] 以i为根节点的块,大小>=k的方案数

假设当前正在合并u的子节点 v

v所在块 如果本身就>=k,那么v可以不并入u,g[j]=cnt[v]*dp[u][j]

枚举已经与u合并的块的大小j

枚举v所在块的大小h

g[j+h]+=dp[x][j]*dp[v][h]

合并u和v,把g赋给dp

最后处理完u的时候更新cnt

注意师最后合并,这样可以使时间复杂度降到 n^2

相当于每对点只在LCA处有贡献

#include<cstdio>
#include<iostream> using namespace std; #define N 5001
#define mod 786433 int front[N],to[N<<],nxt[N<<],tot; int siz[N],dp[N][N],g[N],cnt[N]; int k; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
} void init()
{
int n;
read(n); read(k);
int u,v;
for(int i=;i<n;i++)
{
read(u); read(v);
add(u,v);
}
} void dfs(int x,int y)
{
siz[x]=;
dp[x][]=;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=y)
{
dfs(to[i],x);
for(int j=;j<=siz[x]+siz[to[i]];j++) g[j]=;
for(int j=;j<=siz[x];j++) g[j]=1ll*cnt[to[i]]*dp[x][j]%mod;
for(int j=;j<=siz[x];j++)
for(int h=;h<=siz[to[i]];h++)
g[j+h]=(g[j+h]+1ll*dp[x][j]*dp[to[i]][h]%mod)%mod;
for(int j=;j<=siz[x]+siz[to[i]];j++) dp[x][j]=g[j];
siz[x]+=siz[to[i]];
}
for(int i=k;i<=siz[x];i++) cnt[x]+=dp[x][i],cnt[x]%=mod;
} int main()
{
freopen("cut.in","r",stdin);
freopen("cut.out","w",stdout);
init();
dfs(,);
int ans=;
for(int i=k;i<=siz[];i++) ans+=dp[][i],ans%=mod;
printf("%d",ans);
}

2^n  20分暴力

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 5001 int n,k; int front[N],to[N<<],nxt[N<<],from[N<<],tot; int ans,cnt; bool use[N]; int siz[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; from[tot]=u;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; from[tot]=v;
} void init()
{
read(n); read(k);
int u,v;
for(int i=;i<n;i++)
{
read(u); read(v);
add(u,v);
}
} void dfs2(int x,int y)
{
cnt++;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=y && use[i]) dfs2(to[i],x);
} void judge()
{
for(int i=;i<=n;i++)
{
cnt=;
dfs2(i,);
if(cnt<k) return;
}
ans++;
} void dfs(int x)
{
if(x==(n-)*+)
{
judge();
return;
}
dfs(x+);
use[x]=use[x+]=true; dfs(x+); use[x]=use[x+]=false;
} int main()
{
freopen("cut.in","r",stdin);
freopen("cut.out","w",stdout);
init();
dfs();
printf("%d",ans);
}

学大伟业 2017 国庆 Day1的更多相关文章

  1. 学大伟业Day1解题报告

    学大伟业Day1解题报告 张炳琪 一.   时间分配 T1:30分钟  T2: 60分钟  T3:100分钟 二.答题情况及错因 T1:100         T2:55             T3 ...

  2. 2017-10-23学大伟业Day1

    T1 叉叉 题目名称 叉叉 程序文件名 cross 输入文件名 cross.in 输出文件名 cross.out 每个测试点时限 1秒 内存限制 128MB 测试点数目 10 每个测试点分值 10 是 ...

  3. 学大伟业 国庆Day2

    期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) [问题描述] 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个 ...

  4. 学大伟业 Day 6 培训总结

    今天接着昨天的继续讲数据结构 今天先是 分块 在统计问题中,尤其是序列问题,经常涉及到区间的操作,比如修改一段区间的元素,询问某个区间的元素的信息. 如果每次都对一整个区间的每一个元素进行操作的话,那 ...

  5. 学大伟业 Day 5 培训总结

    今天讲数据结构 先从mzx大佬的ppt摘抄一段: 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 通常情况下,精心选择的数据结构可以带来更高的运行或 ...

  6. 学大伟业 Day 3 培训总结

    今天讲的字符串: 不多说,直接看题 一.表达式求值 题目大意: 输入一行一个表达式,计算其答案 表达式包含非负整数.加减乘除.括号 两种做法 ·栈 ·表达式树 这里更推荐表达式树,因为栈是先压进去,逆 ...

  7. 学大伟业 Day 1 培训总结

    第一天培训,讲的基本算法,东西很多.还有些数论,图论,数据结构and some small tricks 一.输入输出技巧 //输入输出技巧 /* scanf.printf:速度快,需要记忆不同数据类 ...

  8. 学大伟业 Day 2 培训总结

    一.dp 动态规划的本质 是一种思想.通过对原问题划分成子问题,寻找子问题之间的联系,通过求解子问题得出原问题的解.与贪心不同的是,动归是深谋远虑,考虑全局最优解:而贪心则目光短浅,只考虑局部最优解. ...

  9. 学大伟业DAY2模拟赛

    T1忍者钩爪 题目描述 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个练习使用钩爪的好地方,决定在这里大显身手. 场景的天花板可以被描述为一个无穷长的数轴,初始小Q挂在原点上.数轴 ...

随机推荐

  1. 第9次Scrum会议(10/21)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华小组照片 二.开会信息 时间:2017/10/21 17:20~17:45,总计25min.地点:东北师范 ...

  2. Python:模块学习——os模块

    os模块提供了多个访问操作系统服务的功能 os模块中一些重要的函数和变量 os.name 显示当前使用平台 os.getcwd() 显示当前Python脚本工作路径 os.listdir('dirna ...

  3. centos快速安装lamp

    搭建MySQL数据库 使用 yum 安装 MySQL: yum install mysql-server -y 安装完成后,启动 MySQL 服务: service mysqld restart 设置 ...

  4. Lucene 分词

    在Lucene中很多数据是通过Attribute进行存储的 步骤是同过TokenStrem获取文本信息流 TokenStream stream = a.tokenStream("conten ...

  5. 规则引擎之easyRules

    规则引擎听起来是蛮高深的一个词语,但透过现象看本质,Martin Fowler 有如下言: You can build a simple rules engine yourself. All you ...

  6. PHP面向对象之抽象类,抽象方法

    抽象类,抽象方法 抽象类: 是一个不能实例化的类: 定义形式: abstract  class  类名{} 为什么需要抽象类: 它是为了技术管理而设计! 抽象方法: 是一个只有方法头,没有方法体的方法 ...

  7. LoadRunner脚本参数化常见错误

    错误代码:Error:missing newline in d:\loadrunner\username.dat 错误原因:场景设置不合理,参数数量不够,或者参数化文件有问题. 1)如果参数化文件反复 ...

  8. BZOJ 2109 航空管制(拓扑排序+贪心)

    绝世好题啊.. 题意:给出一个DAG,和每个点要求出现在这个DAG里面的拓扑排序的位置<=ti,求出所有可能的拓扑排序里面每个点出现的位置的最小值. 正着做不好做,考虑反着做,建立这个图的反图. ...

  9. bzoj2818 Gcd(欧拉函数)

    Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...

  10. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...