学大伟业 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挂在原点上.数轴 ...
随机推荐
- Beta阶段中间产物
空天猎功能说明书:https://git.coding.net/liusx0303/Plane.git 空天猎代码控制:https://coding.net/u/MR__Chen/p/SkyHunte ...
- jQuery之回到顶部
实现回到顶部的功能,根据学了元素滚动实现,温习知识点. 做之前先理清一下步骤和思路: 1.获得页面的滚动长度 var $page = $("html,body"); var dis ...
- 201621123037 《Java学习设计》 第五周学习总结
Week05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键词:接口."has-a".多态.comparable.Compa ...
- webgl 初识1
1. webgl是什么? WebGL其实是一个非常简单的API.好吧,“简单”可能是一个不恰当的描述. 它做的是一件简单的事,它仅仅运行用户提供的两个方法,一个顶点着色器和一个片断着色器, 去绘 ...
- javascript之容易出错的地方
1: 不是所有的非空对象都有toString()方法的 var obj = Object.create(null); console.log(obj.toString()); // false; ...
- 第114天:Ajax跨域请求解决方法(二)
一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / script/jquery.js http:// (协议号) www (子 ...
- 第87天:HTML5中新选择器querySelector的使用
一.HTML5新选择器 1.document.querySelector("selector");selector:根据CSS选择器返回第一个匹配到的元素,如果没有匹配到,则返回n ...
- HDU4803_Poor Warehouse Keeper
题目很有意思,我想说其实我在比赛的时候就看过了一下这个题目,今天才这么快搞出来吧. 其实总共按上键的次数不会超过10个,我们可以每次假设相隔按两次上键之间按了xi次下键,由于上键的次数是确定的,所以最 ...
- android面试(5)---SQL数据库
SQL基础: 1.如何查询table1从20到30条记录: select * from table1 limit 19,11 2.替换id=1,name =deman的记录? replace into ...
- 聊聊flink的Async I/O
// This example implements the asynchronous request and callback with Futures that have the // inter ...