学大伟业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解题报告的更多相关文章

  1. 学大伟业Day解题报告

    预计分数:30+30+0=60 实际分数:30+20+0=50 题解部分全部来自http://www.cnblogs.com/TheRoadToTheGold/p/7723564.html T1htt ...

  2. 2017-10-23学大伟业Day1

    T1 叉叉 题目名称 叉叉 程序文件名 cross 输入文件名 cross.in 输出文件名 cross.out 每个测试点时限 1秒 内存限制 128MB 测试点数目 10 每个测试点分值 10 是 ...

  3. 【九度OJ】题目1190:大整数排序 解题报告

    [九度OJ]题目1190:大整数排序 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1190 题目描述: 对N个长度最长可达 ...

  4. 学大伟业 2017 国庆 Day1

    期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...

  5. NOIP2018提高组Day1 解题报告

    前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). 这次\(NOIP\ Day1\)的题目听说很简单(毕竟是三道原题),然而我\(T3\)依然悲剧 ...

  6. NOIP 2017 Day1 解题报告

    总分:100分 T1,小凯的疑惑, 100分 T2,时间复杂度,0分 T3,逛公园,0分 T1 ###题意简化: 给定两个互质的数字,输出最大不能表示的数: 基础数论题目 代码: #include&l ...

  7. 常州培训 day1 解题报告

    第一题:(骗分容易,AC难.) 题目大意: 给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 1 ...

  8. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告

    最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...

  9. 【洛谷】NOIP2018原创模拟赛DAY1解题报告

    点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...

随机推荐

  1. Express文件上传之Multer

    Express文件上传之Multer Multer是一个nodejs中间件,用来处理http提交multipart/form-data,也就是文件上传.它是在busboy的基础上开发的. 在我看来,M ...

  2. Xcode清理垃圾

    摘抄自https://blog.csdn.net/hu434587115/article/details/54602449 ~/Library/Developer/Xcode/DerivedData/ ...

  3. Ubuntu16.04怎样安装Python3.6

    Ubuntu16.04默认安装了Python2.7和3.5 请注意,系统自带的python千万不能卸载! 输入命令python

  4. 第32课 初探C++标准库

    有趣的重载: 实验: 将1左移到cout对象中. 将Test改名为Console,此时我们的本意是想让这个cout代表当前的命令行: cout代表命令行的一个实例,本意是想将1打印到命令行上. 我们在 ...

  5. Oracle Statistic 统计信息 小结

    oraclestatisticstabledatabasesqldictionary   目录(?)[-] 直方图上列的信息说明 直方图类型说明   一.  Statistic 说明 Oracle 官 ...

  6. Loj 2536 解锁屏幕

    Loj 2536 解锁屏幕 状态比较显然的状压 \(dp\) ,设 \(f[S][i]\) 表示连接 \(S\) 集合中的点,最后到的点是 \(i\) 的方案数. 转移时,枚举一个 \(j\notin ...

  7. NeighboringCellInfo.aidl

    在src下先建立包名为android.telephony(右键src > new > package,create package-info.java打钩),然后右键刚建的android. ...

  8. 【spring源码分析】面向切面编程架构设计

    2 注解说明 2.1 @Aspect 作用是把当前类标识为一个切面供容器读取 2.2 @Before标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有 2.3 @AfterRe ...

  9. MySQL--限制用户使用资源

    在MySQL 5.7及后续版本中,可以按照账号来限制每个账号实际具有的资源限制. 语法: GRANT WITH option, 如: GRANT SELECT ON test.* TO user1@l ...

  10. gRPC-Web is going GA

    原文: https://www.cncf.io/blog/2018/10/24/grpc-web-is-going-ga On behalf of the Cloud Native Computing ...