学大伟业Day1解题报告
学大伟业Day1解题报告
张炳琪
一. 时间分配
T1:30分钟 T2: 60分钟 T3:100分钟
二.答题情况及错因
T1:100 T2:55 T3:0
T1:刚开始想枚举的方法,后来发现时间复杂度好像是对的,就那样写了
T2:对数据范围判断不准确,刚开始打算用set盼重怕炸空间,后来又改成了数组结果改错了
T3:看到题目知道是树形dp,然后推了一个多小时的转移方程,写了一张多纸,没推出来
在有大题不会的情况下,要先保证能拿到的分拿到,不然做不出来大题就很吃亏
三.题目解析
T1:
暴力维护两个点的链接可以发现在两个英文字母形成的区间里面至多每个字母只能与他形成一个交叉点
那么我们从右到左枚举每个字母出现的区间直到发现与之交叉的或者右边界超出了控制范围(这个也可以二分,但是实际复杂度并不好)
T2:
增加了限制条件的最短路
首先数据范围是吓唬人的,两千条边用 100000000限速器没有任何用处
5000 * 2000 的visited数组用来判重
然后spfa 中间两种转移,队列中记录下当前用了多少加速器 ,一种转移耗费加速器 一种不耗费
T3:
四.代码
T1:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define MAXN 101000
using namespace std; int ln[][MAXN];
int rn[][MAXN];
int top[];
char s[MAXN];
int ans = ; int main() {
freopen("cross.in","r",stdin);freopen("cross.out","w",stdout);
scanf("%s",s + );
int len = strlen(s + );
for(int i = ; i <= len; i++) {
s[i] = s[i] - 'a' + ;
if(ln[s[i]][top[s[i]]] == ) {
ln[s[i]][top[s[i]]] = i;
} else if(rn[s[i]][top[s[i]]] == ) {
rn[s[i]][top[s[i]]] = i;
for(int j = ; j <= ; j++) {
if(j == s[i])continue;
for(int k = top[j] - ; k >= ; k--) {
if(ln[j][k] < ln[s[i]][top[s[i]]] && rn[j][k] > ln[s[i]][top[s[i]]]) {
ans++;
break;
}
if(rn[j][k] < ln[s[i]][top[s[i]]])
break;
}
}
top[s[i]]++;
}
}
printf("%d",ans);
return ;
}
#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define MAXN 5010
using namespace std; struct Edge {
int vj;
int wei;
int nxt;
} edge1[MAXN * ],edge2[MAXN * ];
int now1,now2;
int head1[MAXN],head2[MAXN]; struct Note {
int now;
int used;
} be; queue<Note>q; void push1(int vi,int vj,int wei) {
now1++;
edge1[now1].vj = vj;
edge1[now1].wei = wei;
edge1[now1].nxt = head1[vi];
head1[vi] = now1;
}
void push2(int vi,int vj,int wei) {
now2++;
edge2[now2].vj = vj;
edge2[now2].wei = wei;
edge2[now2].nxt = head2[vi];
head2[vi] = now2;
}
int read() {
int nm = ;
char c = getchar();
while(c < '' || c > '')c = getchar();
while(c >= '' && c <= '') {
nm *= ;
nm += c -'';
c = getchar();
}
return nm;
} int n,m,qq,k; int dis[MAXN][];
bool vis[MAXN][]; int main() {
freopen("move.in","r",stdin);
freopen("move.out","w",stdout);
n = read();
m = read();
qq = read();
k = read();
if(k > qq)k = qq;
for(int i = ; i <= m; i++) {
int vi = read(),vj = read(),wei = read();
push1(vi,vj,wei);
}
for(int i = ; i <= qq; i++) {
int vi = read(),vj = read(),wei = read();
push2(vi,vj,wei);
} memset(dis,0x3e,sizeof(dis));
dis[][] = ;
be.now = ;
be.used = ;
q.push(be);
while(!q.empty()) {
Note op = q.front();
q.pop();
vis[op.now][op.used] = false;
int now = op.now;
int us = op.used;
for(int i = head1[now]; i; i = edge1[i].nxt) {
int vj = edge1[i].vj;
if(dis[now][us] + edge1[i].wei < dis[vj][us]) {
dis[vj][us] = dis[now][us] + edge1[i].wei;
Note zz;
zz.used = op.used;
zz.now = vj;
if(vis[zz.now][zz.used])continue;
vis[zz.now][zz.used] = true;
q.push(zz);
}
}
if(op.used >= k)continue;
for(int i = head2[now]; i; i = edge2[i].nxt) {
int vj = edge2[i].vj;
if(dis[now][us] + edge2[i].wei < dis[vj][us + ]) {
dis[vj][us + ] = dis[now][us] + edge2[i].wei;
Note zz;
zz.used = op.used + ;
zz.now = vj;
if(vis[zz.now][zz.used])continue;
vis[zz.now][zz.used] = true;
q.push(zz);
}
} }
int ans = 0x3e3e3e3e;
for(int i = ; i <= min(k,qq); i++) {
ans = min(ans,dis[n][i]);
}
printf("%d",ans == 0x3e3e3e3e ? -:ans);
return ;
}
学大伟业Day1解题报告的更多相关文章
- 学大伟业Day解题报告
预计分数:30+30+0=60 实际分数:30+20+0=50 题解部分全部来自http://www.cnblogs.com/TheRoadToTheGold/p/7723564.html T1htt ...
- 2017-10-23学大伟业Day1
T1 叉叉 题目名称 叉叉 程序文件名 cross 输入文件名 cross.in 输出文件名 cross.out 每个测试点时限 1秒 内存限制 128MB 测试点数目 10 每个测试点分值 10 是 ...
- 【九度OJ】题目1190:大整数排序 解题报告
[九度OJ]题目1190:大整数排序 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1190 题目描述: 对N个长度最长可达 ...
- 学大伟业 2017 国庆 Day1
期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...
- NOIP2018提高组Day1 解题报告
前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). 这次\(NOIP\ Day1\)的题目听说很简单(毕竟是三道原题),然而我\(T3\)依然悲剧 ...
- NOIP 2017 Day1 解题报告
总分:100分 T1,小凯的疑惑, 100分 T2,时间复杂度,0分 T3,逛公园,0分 T1 ###题意简化: 给定两个互质的数字,输出最大不能表示的数: 基础数论题目 代码: #include&l ...
- 常州培训 day1 解题报告
第一题:(骗分容易,AC难.) 题目大意: 给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 1 ...
- CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告
最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...
- 【洛谷】NOIP2018原创模拟赛DAY1解题报告
点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...
随机推荐
- Windows下C++删除清除map
清除单map(非嵌套map) #include<map> #include<string> #include<iostream> using namespace s ...
- markdown添加本地图片
这是个坑 如果你的markdown在一个文件目录下,需要添加另一个目录下的图片,绝对路径是不可行的.需要 "迂回" 所谓 迂回,即需要先用../../命令返回上一文件目录,直至可以 ...
- C#浮点数保留位数
C#浮点数保留位数 这里用String.Forma("{0:F}",x);来解决. 下面是试验和截图 using System; using System.Collections. ...
- C#/.NET 使用 CommandLineParser 来标准化地解析命令行
CommandLineParser 是一款用于解析命令行参数的 NuGet 包.你只需要关注你的业务,而命令行解析只需要极少量的配置代码. 本文将介绍如何使用 CommandLineParser 高效 ...
- 1010. Radix (25) pat
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...
- hdu1281 棋盘游戏 二分图最大匹配
小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决 ...
- 结构体:HASH表模板
这种 HASHMAP 就是一个链式前向星的表: 其中: init 函数:hashmap 创建初始化: check 函数:寻找 hash 表中是否有需要查找的值,若有则返回 1 ,否则返回 0 :遍历方 ...
- 使用slot编写弹窗组件
具体slot用法详见http://www.cnblogs.com/keepfool/p/5637834.html html: <!--测试弹窗--> <dialog-test v-i ...
- 通过Jersey客户端API调用REST风格的Web服务
Jersey 客户端 API 基础 要开始使用 Jersey 客户端 API,你首先需要创建一个 com.sun.jersey .api.client.Client 类的实例.下面是最简单的方法: i ...
- 如何查看Eclipse的数字版的版本(转)
为什么叫数字版的版本,因为Eclipse软件里显示的是文字版的版本,比如我现在的就是Version: Indigo Release.这在下载插件的时候很不方便. 如何查看文字版的版本信息:打开Ecli ...