学大伟业 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挂在原点上.数轴 ...
随机推荐
- Farm Irrigation ZOJ 2412(DFS连通图)
Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot ...
- 第一次作业(homework-01)成绩公布
已收到博客名.github名的同学得分列表: 学号后三位 成绩(0-10) 215 8082 0132 5184 5027 7194 9.5157 7074 8195 6222 8158 6128 8 ...
- 线段树---poj2528 Mayor’s posters【成段替换|离散化】
poj2528 Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要 ...
- 处理了一个以前写的java小程序的异常
之前用java做过0-99的数字和英文之间的翻译,输入数字就会翻译成英文,输入英文会翻译成数字,比如输入56 输出fiftysix 输入fiftysix 输出56, 发现这会有一个异常,当输入 ...
- TCP系列51—拥塞控制—14、TLP、ER与拥塞控制
一.概述 这里的重点是介绍TLP.ER与拥塞控制并不是介绍TLP和ER本身,因此TLP和ER的详细内容请翻前文. 在TLP与拥塞控制的交互中有几个点需要注意 1.TLP触发的重传后,TCP仍然处于Op ...
- Microsoft Orleans 之 开发人员指南
开发一个Grain 在开发Grain之前请先阅读Grains 这篇文章 Grain 接口 Grains通过调用各自定义在接口中的方法相互作用,一个grain实现了事先定义好的一个或多个接口,grain ...
- 3dContactPointAnnotationTool开发日志(二九)
今天想着在Windows平台上跑通那个代码,不过它的官网上写的支持平台不包括windows,但我还是想试试,因为看他的依赖好像和平台的关系不是特别大. 看了下它的py代码,不知道是py2还是p ...
- 用友 SAP 金蝶 季报
用友 2018Q3季报 营收:.42亿 营收收入同比增长:42.36% 净利润:.35万 净利润同比增长率:113.83% 销售毛利率:66.88% 销售净利率:19.29% 用友2017财年年报 营 ...
- 微信小程序组件 客服
<!-- 话务 --> <view class='detail-tel flexca'> <image class='image-full' src='../../img ...
- 20个PHP程序性能优化的方法
1.数据库连接当使用完毕时应当关闭,不要使用长连接. 2.用@屏蔽错误消息的做法非常低效,极其低效. 3.使用选择分支语句(switch case)好于使用多个if,else if. 4.$row[' ...