学大伟业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. 基于TextRank提取关键词、关键短语、摘要

    一.TextRank原理 TextRank是一种用来做关键词提取的算法,也可以用于提取短语和自动摘要.因为TextRank是基于PageRank的,所以首先简要介绍下PageRank算法. 1. Pa ...

  2. 日志的处理 —— 使用 log4j

    通过 log4j,日志信息不仅打印到 console,而且输出到指定文件,根据配置信息: <dependency> <groupId>log4j</groupId> ...

  3. 51Nod:活动安排问题之二(贪心)

    有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个室? 输入 第一行一个正整数n (n <= 10000)代表活动的个数. ...

  4. 推荐 Laravel API 项目必须使用的 8 个扩展包

    如今在现代网络开发中,比较流行的模式是基于 API 开发,可以通过手机或网站来创建服务. Laravel 是创建基于 API 的项目的最佳框架之一,它为世界各地的大型社区提供了高速开发. Larave ...

  5. ECHO不换行

    我想用批处理实现向s.txt中多次分别导入文本例如:“aaaa","bbbb","cccc","dddd"实现s.txt内效果如: ...

  6. php利用curl获取网页title内容

    /**$html = curl_get_file_contents($url); $title = get_title_contents($html); var_dump($title);*/ fun ...

  7. MessageRPC

    项目地址 :  https://github.com/kelin-xycs/MessageRPC MessageRPC 一个 用 C# 实现的 使用 Message 的 RPC MessageRPC ...

  8. Digester库使用总结

    1.Digester是Apache软件基金会的Jakarta项目下的子Commons项目下的一个开源项目,Digester API包含3个包:org.apache.commons.digester,提 ...

  9. nexus7 升级失败后手动刷系统

    http://bbs.gfan.com/android-6934570-1-1.html   步骤如下: 1. 下载Android系统文件,打开官方地址:https://developers.goog ...

  10. hashcode 知识点

    java中常用的哈希码的算法. Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样. String类的hashCode.根据Str ...