学大伟业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 ...
随机推荐
- MySQL性能优化方法二:表结构优化
原文链接:http://isky000.com/database/mysql-perfornamce-tuning-schema 很多人都将 数据库设计范式 作为数据库表结构设计“圣经”,认为只要按照 ...
- 1.2 Linux中的进程 --- fork、vfork、exec函数族、进程退出方式、守护进程等分析
fork和vfork分析: 在fork还没有实现copy on write之前,Unix设计者很关心fork之后立即执行exec所造成的地址空间浪费,也就是拷贝进程地址空间时的效率问题,所以引入vfo ...
- matlab fgetl()
% % file=dir('/home/wang/Desktop/trainset/others/'); % % :length(file) % % path= strcat('/home/wang/ ...
- set 与 map 的第一次尝试
map 杭电6015http://acm.hdu.edu.cn/showproblem.php?pid=6015 基本用法:map<string,int>mp; mp[class[ i ...
- WPF 多线程异常抛送到UI线程
无论是winform还是WPF,在.NET 2.0之后 只要是多线程中产生了异常都会导致程序强制结束. 那么我们一般的做法是将未知的多线程的异常抛送到UI线程去,然后进行处理.. 正确的多线程中的异常 ...
- Linux内核电源管理综述
资料:http://blog.csdn.net/bingqingsuimeng/article/category/1228414http://os.chinaunix.net/a2006/0519/1 ...
- windows 版 nginx 运行错误的一些解决方法
1. 关于文件夹的中文的问题. 错误的截图如下: 看得到这个 failed (1113: No mapping for the Unicode character exists in the targ ...
- 获取js 文件传递的参数并使用json2进行json数据转换
主要的技术就不用详细进行介绍了,就是使用js文件进行参数的传递,用途有一下几个: 1,进行js的版本控制. 2,获取参数并,进行一些额外功能的添加(比如使用js 进行用户验证,设计开发API (一些开 ...
- TensorFlow笔记-04-神经网络的实现过程,前向传播
TensorFlow笔记-04-神经网络的实现过程,前向传播 基于TensorFlow的NN:用张量表示数据,用计算图搭建神经网络,用会话执行计算图,优化线上的权重(参数),得到模型 张量(tenso ...
- 针对 FastAdmin 2018-01-19 号的升级 SQL (废)
FastAdmin 在 2018-01-19 升级增加了以下功能. 新增前台会员模块和API会员模块 新增后台会员管理.会员规则和会员分组管理 新增短信发送的行为事件 新增前台Token.短信.日志模 ...