2017-10-23学大伟业Day1
T1 叉叉
|
题目名称 |
叉叉 |
|
程序文件名 |
cross |
|
输入文件名 |
cross.in |
|
输出文件名 |
cross.out |
|
每个测试点时限 |
1秒 |
|
内存限制 |
128MB |
|
测试点数目 |
10 |
|
每个测试点分值 |
10 |
|
是否有部分分 |
无 |
|
试题类型 |
传统 |
题目描述
现在有一个字符串,每个字母出现的次数均为偶数。接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线...对其他25个字母也做同样的操作。
现在我们想知道有多少对连线交叉。交叉的定义为一个连线的端点在另外一个连线的内部,另外一个端点在外部。
下图是一个例子,共有三对连线交叉(我们连线的时候,只能从字符串上方经过)。
输入格式
一行一个字符串。保证字符串均由小写字母组成,且每个字母出现次数为偶数次。
输出格式
一个整数,表示答案。
样例输入
abaazooabz
样例输出
3
数据范围
对于30% 的数据,字符串长度不超过50。
对于100% 的数据,字符串长度不超过100,000。
处理出每对字符的两个位置,按左端点排序,判断是否会相交,加一个小剪枝、、、暴力做法数据水就过了。。
#include <algorithm>
#include <cstring>
#include <cstdio> const int N();
int cnt,n,ans;
struct Node {
int l,r;
bool operator < (const Node&x)const
{
return l<x.l;
}
}a[N];
char s[N]; int Presist()
{
freopen("cross.in","r",stdin);
freopen("cross.out","w",stdout);
scanf("%s",s+); n=strlen(s+);
cnt=;
for(int k=; k<; ++k)
for(int i=; i<=n; ++i)
if(s[i]-'a'==k)
{
if(a[cnt].r) a[++cnt].l=i;
else if(!a[cnt].l) a[cnt].l=i;
else a[cnt].r=i;
}
std::sort(a+,a+cnt+);
for(int i=; i<=cnt; ++i)
// printf("%d %d\n",a[i].l,a[i].r);
for(int j=i+; j<=cnt; ++j)
{
if(a[i].r<a[j].l) break;
ans+=(a[i].r<a[j].r);
}
printf("%d\n",ans);
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
T2 跳跳虎想回家

k==0的就是普通的最短路,k==1的可以Floyd求出多源最短路,枚举每个传送通道更新最小值,
另外就是乱搞的(把传送通道全加进去跑最短路。。可能还是数据水)、、考试时数组开小了80分、
#include <cstdio>
#include <queue> #define min(a,b) ((a)<(b)?(a):(b)) inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
} const int INF(0x3f3f3f);
const int M();
const int N();
int n,m,q,k,ans;
int dis[N][N];
bool vis[N]; int head[N],sumedge;
struct Edge {
int v,next,w;
Edge(int v=,int next=,int w=):
v(v),next(next),w(w){}
}edge[M<<];
inline void ins(int u,int v,int w)
{
edge[++sumedge]=Edge(v,head[u],w);
head[u]=sumedge; dis[u][v]=w;
} struct Node {
int pos,dis;
bool operator < (const Node&x)const
{
return dis>x.dis;
}
}u,v;
std::priority_queue<Node>que; inline void Dijkstra(int s)
{
for(int i=; i<=n; ++i)
dis[s][i]=INF,vis[i]=;
u.dis=dis[s][s]=,u.pos=s;
for(; !que.empty(); ) que.pop(); que.push(u);
for(; !que.empty(); )
{
u=que.top(); que.pop();
if(vis[u.pos]) continue; vis[u.pos]=;
for(int i=head[u.pos]; i; i=edge[i].next)
{
v.pos=edge[i].v;
if(dis[s][v.pos]>dis[s][u.pos]+edge[i].w)
{
dis[s][v.pos]=dis[s][u.pos]+edge[i].w;
v.dis=dis[s][v.pos]; que.push(v);
}
}
}
} struct Road {
int u,v,w;
Road(int u=,int v=,int w=):u(u),v(v),w(w){}
}road[M]; inline void violence()
{
for(int k=; k<=n; ++k)
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
ans=dis[][n];
for(int u,w,v,i=; i<=q; ++i)
{
u=road[i].u,v=road[i].v,w=road[i].w;
ans=min(ans,dis[][u]+dis[v][n]+w);
}
printf("%d\n",ans>=INF?(-):ans);
} inline void violence2()
{
for(int u,w,v,i=; i<=q; ++i)
ins(road[i].u,road[i].v,road[i].w);
Dijkstra(); printf("%d\n",dis[][n]>=INF?(-):dis[][n]);
} int Presist()
{
freopen("move.in","r",stdin);
freopen("move.out","w",stdout);
read(n),read(m),read(q),read(k);
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
dis[i][j]=(i!=j)*INF;
for(int u,v,w,i=; i<=m; ++i)
read(u),read(v),read(w),ins(u,v,w);
for(int u,v,w,i=; i<=q; ++i)
read(u),read(v),read(w),road[i]=Road(u,v,w);
if(!k) { Dijkstra(); printf("%d\n",dis[][n]>=INF?(-):dis[][n]); return ;}
else if(k==) { violence(); return ; }
else { violence2(); return ; }
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
T3 秀秀 和哺 噜国 ( cut )



f[i][j]表示以i为根,连通块大小为k的满足题目要求联通个数的方案数,f[i][0]表示以i为根的所有合法方案数
对于u的一个孩子v,f[u][j+k]+=f[u][j]*f[v][k],(乘法原理,一颗以u的孩子为根的树的贡献与其余树互不影响)
f[u][0]+=f[u][i](k<=i<=size[u])
只枚举当前 u 所在子树的大小,每当枚举到它的其中孩子时,当前 u 所在子树的大小加上它孩子为根的子树的大小。
可以理解为每一个点对只被枚举到一次。 这样可以优化到n^2
ans=f[root][0]
#include <cstdio> #define min(a,b) ((a)<(b)?(a):(b)) inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int mod();
const int N();
int n,q,ans,dis[N][N];
int head[N],sumedge;
struct Edge {
int v,next;
Edge(int v=,int next=):v(v),next(next){}
}edge[N<<];
inline void ins(int u,int v)
{
edge[++sumedge]=Edge(v,head[u]);
head[u]=sumedge,dis[u][v]=;
} int size[N],tmp[N],f[N][N];
void DFS(int u,int pre)
{
size[u]=; f[u][]=;
for(int v,i=head[u]; i; i=edge[i].next)
{
v=edge[i].v; if(v==pre) continue;
DFS(v,u); int tot=size[u]+size[v];
for(int j=; j<=tot; ++j) tmp[j]=;
for(int j=; j<=size[u]; ++j)
tmp[j]=1ll*f[v][]*f[u][j]%mod;
for(int j=; j<=size[u]; ++j)
for(int k=; k<=size[v]; ++k)
tmp[k+j]=(tmp[k+j]%mod+1ll*f[u][j]*f[v][k]%mod)%mod;
for(int j=; j<=tot; ++j) f[u][j]=tmp[j];
size[u]+=size[v];
}
for(int i=q; i<=size[u]; ++i) f[u][]=(f[u][]+f[u][i])%mod;
} int Presist()
{
// freopen("cut.in","r",stdin);
// freopen("cut.out","w",stdout);
read(n),read(q);
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
dis[i][j]=(i!=j)*(n+);
for(int u,v,i=; i<n; ++i)
read(u),read(v),ins(u,v);
DFS(,-);
printf("%d\n",f[][]);
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
2017-10-23学大伟业Day1的更多相关文章
- 学大伟业Day1解题报告
学大伟业Day1解题报告 张炳琪 一. 时间分配 T1:30分钟 T2: 60分钟 T3:100分钟 二.答题情况及错因 T1:100 T2:55 T3 ...
- 学大伟业 2017 国庆 Day1
期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...
- 学大伟业 Day 3 培训总结
今天讲的字符串: 不多说,直接看题 一.表达式求值 题目大意: 输入一行一个表达式,计算其答案 表达式包含非负整数.加减乘除.括号 两种做法 ·栈 ·表达式树 这里更推荐表达式树,因为栈是先压进去,逆 ...
- 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等
今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...
- 学大伟业 国庆Day2
期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) [问题描述] 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个 ...
- 学大伟业DAY2模拟赛
T1忍者钩爪 题目描述 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个练习使用钩爪的好地方,决定在这里大显身手. 场景的天花板可以被描述为一个无穷长的数轴,初始小Q挂在原点上.数轴 ...
- 学大伟业 Day 6 培训总结
今天接着昨天的继续讲数据结构 今天先是 分块 在统计问题中,尤其是序列问题,经常涉及到区间的操作,比如修改一段区间的元素,询问某个区间的元素的信息. 如果每次都对一整个区间的每一个元素进行操作的话,那 ...
- 学大伟业 Day 5 培训总结
今天讲数据结构 先从mzx大佬的ppt摘抄一段: 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 通常情况下,精心选择的数据结构可以带来更高的运行或 ...
- 学大伟业 Day 1 培训总结
第一天培训,讲的基本算法,东西很多.还有些数论,图论,数据结构and some small tricks 一.输入输出技巧 //输入输出技巧 /* scanf.printf:速度快,需要记忆不同数据类 ...
随机推荐
- ubuntu 升级到5.1kernel,打开bbr
apt-get -f install wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.1/linux-headers-5.1.0-0 ...
- Linux内核漏洞利用-环境配置(转)
实验环境: Ubuntu-14.04.1 x86 linux-2.6.32.1 busybox-1.27.2 qemu 0x00 安装qemu sudo apt-get install qemu qe ...
- shell脚本,awk实现文件a的每行数据与文件b的相对应的行的值相减,得到其绝对值。
解题思路 文件 shu 是下面这样的.220 34 50 70553 556 32 211 1 14 98 33 文件 jian是下面这样的.1082 想要得到结果是下面这样的.210 24 40 6 ...
- React初识整理(四)--React Router(路由)
官网:https://reacttraining.com/react-router 后端路由:主要做路径和方法的匹配,从而从后台获取相应的数据 前端路由:用于路径和组件的匹配,从而实现组件的切换. 如 ...
- (41)zabbix监控api接口性能及可用性 天气预报api为例
现在各种应用都走api,例如淘宝,天气预报等手机.pad客户端都是走api的,那么平时也得对这些api做监控了.怎么做呢?zabbix的web监控是不二选择了.今天就以天气预报api作为一个例子. 天 ...
- Git学习——工作区和暂存区
工作区就是我们的电脑上的git初始化目录.版本库就是我们工作区中的隐藏目录.git.版本库中分为两个部分:(1)stage(index)暂存区:git add <file>命令后file就 ...
- https原理解读
参考:架构师必读!以图文的方式解锁 HTTPS原理,10分钟还原HTTPS真像! 对于消息安全的定义是:即使消息被中间人拦截到,中间人也没办法解读出其中的消息. 对称加密 要实现消息安全,首先想到的是 ...
- AVL树总结
定义:一棵AVL树或者是空树,或者是具有下列性质的二叉搜索树:它的左子树和右子树都是AVL树,且左右子树的高度之差的绝对值不超过1 AVL树失衡旋转总结: 假如以T为根的子树失衡.定义平衡因子为 H( ...
- pep-8要求归纳
代码布局缩进每个缩进级别使用4个空格. 连续行应使用Python的隐式行连接括号,括号和大括号,或使用悬挂缩进 来垂直对齐包装元素.当使用悬挂式缩进时,应考虑以下内容:第一行应该没有任何争论,应该使用 ...
- 【05】project board
GitHub 上的 project board 我总是用 Jira 做大项目,独立项目用 Trello,这两者我都很喜欢. 后来我知道,GitHub 也有类似的 project board: 我个人为 ...