学大伟业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. 【c++基础】int转string自动补零

    前言 使用to_string函数可以将不同类型的数据转换为string类,请参考here和here.如果string的位数固定,如何进行自动补零呢?请看本文实例! 代码 确定位数,to_string ...

  2. make: *** No rule to make target `/thread_native.h', needed by `ossl.o'. Stop

    修改 Makefile 增加 top_srcdir = ../.. 即可 该文件大多存于ruby源文件下 PS:有时也可能是makefile文件多了空格所致

  3. test20181016 B君的第一题

    题意 分析 考场爆零做法 考虑位数少的一定更小,高位小的一定更少. 然后计算一定位数下不同数字的个数,然后从高到低依次确定数位. 特例:如果确定的高位的后缀出现了x,那么要把x调整到后缀去,这样一定更 ...

  4. citus 多租户应用开发(来自官方文档)

      citus 官方文档很不错,资料很全,同时包含一个多租户应用的文档,所以运行下,方便学习 环境准备 使用docker-compose 运行,同时集成了graphql 引擎,很方便 docker-c ...

  5. 使用 dl 设计的简单的登陆界面 (为了记录)

    先贴图 对应的地方放置 一些登陆的图片即可 html 代码如下: <html><head><style>body {text-align:center;margin ...

  6. web 分享代码片段

    <div class="bshare-custom icon-medium-plus"><a title="分享到QQ空间" class=&q ...

  7. Linux部署禅道Steps&Q&A

    1.查看Linux的位数: getconf LONG_BIT 结果:32/64 2. 禅道开源版安装包下载 Linux 64位 下载站点1: http://sourceforge.net/projec ...

  8. Linux开机自动启动ORACLE设置

    1.安装好Oracle数据库后: 执行 dbstart和dbshut会提示: [oracle@oracle11g ~]$ dbstartORACLE_HOME_LISTNER is not SET, ...

  9. bzoj 3687 简单题——bitset

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3687 关于 bitset :https://blog.csdn.net/snowy_smil ...

  10. bzoj 4566 [Haoi2016]找相同字符——广义后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 每个后缀结尾处 ct[ ] = 1 ,按拓扑序 dp 一下就能求出 right 集合的 ...