学大伟业 2017 国庆 Day1
期望得分: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的更多相关文章
- 学大伟业Day1解题报告
学大伟业Day1解题报告 张炳琪 一. 时间分配 T1:30分钟 T2: 60分钟 T3:100分钟 二.答题情况及错因 T1:100 T2:55 T3 ...
- 2017-10-23学大伟业Day1
T1 叉叉 题目名称 叉叉 程序文件名 cross 输入文件名 cross.in 输出文件名 cross.out 每个测试点时限 1秒 内存限制 128MB 测试点数目 10 每个测试点分值 10 是 ...
- 学大伟业 国庆Day2
期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) [问题描述] 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个 ...
- 学大伟业 Day 6 培训总结
今天接着昨天的继续讲数据结构 今天先是 分块 在统计问题中,尤其是序列问题,经常涉及到区间的操作,比如修改一段区间的元素,询问某个区间的元素的信息. 如果每次都对一整个区间的每一个元素进行操作的话,那 ...
- 学大伟业 Day 5 培训总结
今天讲数据结构 先从mzx大佬的ppt摘抄一段: 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 通常情况下,精心选择的数据结构可以带来更高的运行或 ...
- 学大伟业 Day 3 培训总结
今天讲的字符串: 不多说,直接看题 一.表达式求值 题目大意: 输入一行一个表达式,计算其答案 表达式包含非负整数.加减乘除.括号 两种做法 ·栈 ·表达式树 这里更推荐表达式树,因为栈是先压进去,逆 ...
- 学大伟业 Day 1 培训总结
第一天培训,讲的基本算法,东西很多.还有些数论,图论,数据结构and some small tricks 一.输入输出技巧 //输入输出技巧 /* scanf.printf:速度快,需要记忆不同数据类 ...
- 学大伟业 Day 2 培训总结
一.dp 动态规划的本质 是一种思想.通过对原问题划分成子问题,寻找子问题之间的联系,通过求解子问题得出原问题的解.与贪心不同的是,动归是深谋远虑,考虑全局最优解:而贪心则目光短浅,只考虑局部最优解. ...
- 学大伟业DAY2模拟赛
T1忍者钩爪 题目描述 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个练习使用钩爪的好地方,决定在这里大显身手. 场景的天花板可以被描述为一个无穷长的数轴,初始小Q挂在原点上.数轴 ...
随机推荐
- FPGA论文
基于 NetFPGA 的 VCP 网络的设计与实现 --可变结构拥塞控制协议(VCP),适应于高带宽时延乘积网络的显式拥塞控制协议 无源光网络(PON) 1.区块链技术发展,物联网设备激增,服务器压力 ...
- 60行代码:Javascript 写的俄罗斯方块游戏
哈哈这个实在是有点意思 备受打击当初用java各种类写的都要几百行啦 先看效果图: 游戏结束图: javascript实现源码: [javascript] view plaincopyprint? & ...
- vs快捷键代码格式化或代码对齐名字
开发人员,换个电脑后环境要重装,vs的环境也需要重新设置. 快捷键需要重新设置,插件也需要重装,在这里备注下,换个环境就可以直接用了. 由于vs不同版本,代码对齐或者代码格式化的快捷键都不一样,所以导 ...
- C语言语法树
- centos系统下禁用笔记本触控板
最近把零几年的老爷笔记本拿出来用,使用windows系统实在太卡了,于是折腾安装上Centos系统了,但是在使用的过程中发现鼠标经常失效.使用了多种方法(比如:http://blog.csdn.net ...
- 【设计模式】C++中的单例模式
讲解来自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&id=4281275&uid=26611383 由于使用了POSIX函 ...
- bzoj1272 Gate Of Babylon(计数方法+Lucas定理+乘法逆元)
Description Input Output Sample Input 2 1 10 13 3 Sample Output 12 Source 看到t很小,想到用容斥原理,推一下发现n种数中选m个 ...
- Angel Beats,AFOer Beats?
意识模糊的时候适合写一些奇怪的东西? NOI退役之后我尝试了很多方法调节心态.(比如做OI题,出OI题,学文化课,读书,吃饭,睡觉,水群,看番,推galgame). 然而看啥都是退役的画风.比如说推W ...
- 【uoj#174】新年的破栈 贪心
题目描述 给你一个长度为 $n$ 的序列和一个空的双端队列,每次进行3种操作种的一种: 1.将序列中编号最小的数加入到双端队列的队尾:2.从双端队列的队尾取出一个数:3.从双端队列的队头取出一个数. ...
- 详解SQL Server数据修复命令DBCC的使用
严重级别为 21 表示可能存在数据损坏. 可能的原因包括损坏的页链.损坏的 IAM 或该对象的 sys.objects目录视图中存在无效条目. 这些错误通常由硬件或磁盘设备驱动程序故障而引起. MS ...