ISIJ 2018 很多序列(Training Round D4T3)


题目名称:很多序列

文件名:sequences.in / sequences.out

题目描述

假设 $ x_1 < x_2 < \dots < x_n $ 且 $ x_1 $ 与 $ x_2 $ 互质。
考虑所有的单调递增序列,其首项为 $ 0 $ 且相邻两项之差是 $ x_1,x_2 \dots x_n $ 之一。
例如,当 $ n=2, x_1 = 4 , x_2 = 7 $ 时,序列可以是 $ 0, 4, 8, 15, 19, 26, 33, 40, 44 $ 。
那么请问不出现在任何序列中最大的数是多少?
 

限制

$ 1s \quad 256M $

对于 40% 的数据,$ 1 < n < 6 , x_1 > 1 , x_n <1000 $ ;
对于另外 30% 的数据,$ n=2 , x_n < 10^ 9 $ ;
对于另外 30% 的数据,$ 1 < n < 6 , 1 < x_1 < 10^{6-n} , x_2 > 10^{n+11} , x_n < 10^{n+12} $ 。
 

输入格式

第一行,一个整数 $ n $

第二行,一共 $ n $ 个整数 $ x_1 , x_2 \dots x_n $
 

输出格式

一个整数,表示不出现在任何序列中最大的数
 

输入样例

 24 7

输出样例

 17 

 

题解

$ x_1 < 10^6 $ 按照对 $ x_1 $ 取模建图,从每个点 $ u $ 按边权为 $ x_i $ 向 $ (u+x_i) \quad mod \quad x_1 $ 连边,
从 $ 0 $ 出发到 $ u $ 的最短路径长表示,序列中最小的 $ mod \quad x_1 = u $ 的数是多少。
当然,这个数(跑 $ SPFA $ 求最短路) - $ x_1 $ 即为最大的不可取到的数。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define int long long
#define N 1000005
int n,x[10],ans;
void read(int &x){char ch;x=0;while(ch=getchar(),ch<'0'||ch>'9');x=ch-48;while(ch=getchar(),ch>='0'&&ch<='9')x=10*x+ch-48;
}
queue<int>q;
int dis[N];
bool vis[N];
inline void spfa(){memset(dis,0x6f,sizeof(dis));q.push(0); dis[0]=0; while(!q.empty()){int u=q.front(); q.pop(); vis[u]=0;for(int i=2;i<=n;++i){int v=(u+x[i]%x[1])%x[1];if(dis[v]>dis[u]+x[i]){dis[v]=dis[u]+x[i];if(!vis[v]){ vis[v]=1; q.push(v); }}}}
}
signed main(){freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);read(n);for(int i=1;i<=n;++i) read(x[i]);if(n==2) printf("%lld",x[1]*x[2]-x[1]-x[2]);else {spfa();for(int i=1;i<x[1];++i) ans=max(ans,dis[i]);printf("%lld",ans-x[1]);}return 0;
}

 
 

ISIJ 2018 移动光标(Cup T2)


题目名称:移动光标

文件名:cusor.in / cusor.out

题目描述

小明是一名优秀的打字员,他正在检查一份文本文件,现在已知第 $ i ( 1 \le i \le n ) $ 行有 $ L_i $ 个字符。
每时每刻光标会指向一个字符,小明可以通过键盘上的 4 个键移动光标位置。
按下 “ ↑ ” 时,光标会直接移动到上一行对应的字符处,如果已经在第一行或上一行没有同列的字符,则不作移动。
按下 “ ↓ ” 时,光标会直接移动到下一行对应的字符处,如果已经在第 行或下一行没有同列的字符,则不作移动。
按下 “ ← ” 时,光标会直接移动到同行左边的字符处,如果左边已没有字符,则不作移动。
按下 “ → ” 时,光标会直接移动到同行右边的字符处,如果右边已没有字符,则不作移动。
现在小明有 $ q $ 次询问 $ x_1 , y_1 , x_2 ,y_2 $ 表示光标需要从第 $ x_1 $ 行第 $ y_1 $ 个字符移动到第 $ x_2 $ 行第 $ y_2 $ 个字符,
求出 最少按几次键盘(保证 $ 1 \le y_1 \le L_{x_1}, 1 le y_2 \le L_{x_2} $ )。
 

限制

$ 2s \quad 256M $

$ 1 \le n, L_i ,q \le 10^5 $

输入格式

第一行,一个整数 $ n $
接下来 $ n $ 行,其中第 $ i $ 行一个整数 $ L_i $
接下来一行,一个整数 $ q $
接下来 $ q $ 行,每行 4 个整数 $ x_1 , y_1 , x_2 , y_2 $
 

输出格式

一共 $ q $ 行,每行表示对应询问的答案
 

输入样例

 4 324331 1 3 23 3 4 21 3 3 4

输出样例

 325 

 

题解

大致路径是先横再往上/下再横着走,
如果 $ x_1 $ 到 $ x_2 $ 之间的 $ L $ 最小值(线段树维护区间最小值)$ m $ 比 $ y_1 $ 和 $ y+2 $ 都 小,
那么需要额外从 $ y_1 $ 走到 $ m $ 并从 $ m $ 走到 $ y_2 $ ;其他情况都是 $ |x_1-x_2| + | y_1-y_2| $ 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,q,sum[100005<<2],x1,x2,y1,y2;
void read(int &x){char ch;x=0;while(ch=getchar(),ch<'0'||ch>'9');x=ch-48;while(ch=getchar(),ch>='0'&&ch<='9')x=10*x+ch-48;
}
void build(int o,int l,int r){if(l==r){read(sum[o]);return;}int mid=l+r>>1;build(o<<1,l,mid); build(o<<1|1,mid+1,r);sum[o]=min(sum[o<<1],sum[o<<1|1]);
}
int query(int o,int l,int r,int L,int R){if(L<=l&&r<=R) return sum[o];int mid=l+r>>1;if(L>mid) return query(o<<1|1,mid+1,r,L,R);else if(R<=mid) return query(o<<1,l,mid,L,R);else return min(query(o<<1,l,mid,L,R),query(o<<1|1,mid+1,r,L,R));
}
int main(){freopen("cusor.in","r",stdin);freopen("cusor.out","w",stdout);read(n);build(1,1,n);read(q);while(q--){read(x1); read(y1); read(x2); read(y2);int tmp=query(1,1,n,min(x1,x2),max(x1,x2));if(y1<=tmp&&y2<=tmp) printf("%d\n",abs(x2-x1)+abs(y2-y1));else printf("%d\n",abs(y1-tmp)+abs(y2-tmp)+abs(x2-x1));}return 0;
}

 

 

ISIJ 2018 假期旅行(Training Round D6T2)

题目描述

这个假期,小明打算乘火车游览风光,沿途一共经过 $ n $ 个城市。
从第 $ i $ 个城市设有第 $ i $ 条铁路到达第 $ i+1 $ 个城市,这连成一条铁路链。
小明乘坐的这班火车一共有 $ k $ 个座位,从第 $ 1 $ 个城市开到第 $ n $ 个城市,但在买票时遇到 了困难,因为火车上的部分座位被订掉了。
有 $ m $ 位乘客的订单可以用各自的 $ (s,t,a) $ 来描述,
表示从第 $ s $ 个城市坐车到第 $ t $ 个城市,订了这段中的第 $ a $ 个座位(不保证乘客之间是否存在冲突,但这不会影响到小明)。
 
小明沮丧地发现可能没有座位从头到尾都没人预订的,不过他马上意识到自己可以订不同的座位,
只需要保证第 $ i $ 条铁路中坐的座位是没人预订的。
小明会一共乘坐 $ q $ 次火车,从第 $ l $ 到第 $ r $ 个城市。
你需要求出期间最少换几个座位(第 $ i $ 和第 $ i+1 $ 条铁路中座位不同的个数),如果无法从 $ l $ 抵达 $ r $ 则输出 $ -1 $ 。
 

限制

$ 2s \quad 256M $
对于 30% 的数据,$ n\le 100 , m \le 100 , k\le 100 , q=1 $
对于 60% 的数据,$ n \le 200,000 , m\le 200,000 , k \le 200,000, q=1 $
对于 100% 的数据,$ 1\le n \le 200,000 ,0 \le m \le 200,000 , 1 \le k \le 200,000 , 1 \le q \le 200,000 $
 

输入格式

第一行,$ 3 $ 个整数 $ n,m $ 和 $ k $
接下来 $ m $ 行,每行 3 个正整数表示这个乘客的 $ s, t $ 和 $ a ( 1 \le s < t \le n , 1 \le a \le k ) $
接下来一行,$ 1 $ 个正整数 $ q $
接下来 $ q $ 行,每行 $ 2 $ 个正整数 $ l $ 和 $ r ( 1 \le l < r \le n) $
 

输出格式

一共 $ q $ 行,每行一个整数表示最少要换几次座位,若无法到达则输出 $ -1 $
 

输入样例

 5 4 31 4 12 5 32 3 24 5 2 31 53 54 5

输出样例

 -121

 

样例解释

第 $ 2 $ 条轨道上所有座位都被预订了,因此从第 $ 1 $ 到第 $ 5 $ 个城市是不可能的。
从第 $ 3 $ 到第 $ 5 $ 个城市可以先买座位 $ 2 $ 的票、再换到座位 $ 1 $ 。
从第 $ 4 $ 到第 $ 5 $ 个城市只需要买座位 $ 1 $ 的票即可。
 

题解

对于每个城市 $ i $ ,记录 $ a[i] $ 表示 $ i $ 向后最远可以只用一种车票走到哪里。
先将 $ m $ 个订单离线,处理同个座位的预订区间(若有相交的区间则合并,可以扫描线处理区间),
相邻两个区间之间的部分是可以使用这种车票的,用线段树(维护最大值)更新这段的 $ a[i] $ 为右端点(即原来的下一个区间左端点)。
由 $ i $ 指向 $ a[i] $ 即构成了森林(因为 $ i \le a[i] $ ),求从 $ l $ 到 $ r $ 的路径长度时使用倍增即可。
预处理 $ O (n \times log_n $ ,询问在线每次 $ O(log_n) $ 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define N 200005
vector<pair<int,int> >val[N];
void read(int &x){char ch;x=0;while(ch=getchar(),ch<'0'||ch>'9');x=ch-48;while(ch=getchar(),ch>='0'&&ch<='9')x=10*x+ch-48;
}
int sum[N<<2],lzy[N<<2];
inline void pushdown(int o){sum[o<<1]=max(sum[o<<1],lzy[o]);sum[o<<1|1]=max(sum[o<<1|1],lzy[o]);lzy[o<<1]=max(lzy[o<<1],lzy[o]);lzy[o<<1|1]=max(lzy[o<<1|1],lzy[o]);lzy[o]=0;
}
void modify(int o,int l,int r,int L,int R,int v){if(L<=l&&r<=R){sum[o]=max(sum[o],v);lzy[o]=max(lzy[o],v);return;}if(lzy[o]) pushdown(o);int mid=l+r>>1;if(L>mid) modify(o<<1|1,mid+1,r,L,R,v);else if(R<=mid) modify(o<<1,l,mid,L,R,v);else {modify(o<<1,l,mid,L,R,v);modify(o<<1|1,mid+1,r,L,R,v);}sum[o]=max(sum[o<<1],sum[o<<1|1]);
}
int query(int o,int l,int r,int x){if(l==r) return sum[o];if(lzy[o]) pushdown(o);int mid=l+r>>1;if(x>mid) return query(o<<1|1,mid+1,r,x);else return query(o<<1,l,mid,x);sum[o]=max(sum[o<<1],sum[o<<1|1]);
}
int f[N][21],n,m,k,ans,q;
int main(){freopen("trip.in","r",stdin);freopen("trip.out","w",stdout);read(n); read(m); read(k);for(int i=1;i<=m;++i){int s,t,a;read(s); read(t); read(a);val[a].push_back(make_pair(s,t-1));}for(int i=1;i<=k;++i){sort(val[i].begin(),val[i].end());int L=0,R=-1;for(int j=0;j<val[i].size();++j)if(val[i][j].first<=R+1) R=max(R,val[i][j].second);else{modify(1,0,n,R+1,val[i][j].first-1,val[i][j].first);L=val[i][j].first; R=val[i][j].second;}modify(1,0,n,R+1,n,n);}for(int i=1;i<n;++i){int tmp=query(1,0,n,i);if(!tmp) tmp=n+1;f[i][0]=tmp;}f[n][0]=n; f[n+1][0]=n+1;for(int j=1;j<=20;++j)for(int i=n+1;i>=1;--i)f[i][j]=f[f[i][j-1]][j-1];read(q);while(q--){int l,r; ans=0;read(l); read(r);for(int i=20;~i;--i) if(f[l][i]<r){ l=f[l][i]; ans+=(1<<i); }l=f[l][0]; ++ans;if(l==n+1||l<r) puts("-1");else printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/PotremZ/p/Test20180925.html

NOIP2018 模拟 9.11相关推荐

  1. 备战Noip2018模拟赛11(B组)T4 Path 好路线

    10月27日备战Noip2018模拟赛11(B组) T4路径好路线 题目描述 nodgd在旅游.现在,nodgd要从城市的西北角走到东南角去.这个城市的道路并不平坦,nodgd希望找出一条相对比较好走 ...

  2. [JZOJ5863] 【NOIP2018模拟9.11】移动光标

    Description Input Output Sample Input 4 3 2 4 3 3 1 1 3 2 3 3 4 2 1 3 3 4 Sample Output 3 2 5 Data C ...

  3. jozj5945. 【NOIP2018模拟11.02】昆特牌

    5945. [NOIP2018模拟11.02]昆特牌 Description 作为一个资深OIer,你被邀请到位于波兰的CDPR总部参观.但没想到你刚一到就遇到了麻烦.昆特牌的数据库发生了故障.原本昆 ...

  4. C语言模拟11答案,C语言模拟试题11答案.doc

    C语言模拟试题11答案.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...

  5. EZ 2018 06 17 NOIP2018 模拟赛(十九)

    这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...

  6. 备战Noip2018模拟赛3(B组)T1 Apple 韬韬抢苹果

    10月3日备战Noip2018模拟赛3(B组) T1 Apple韬韬抢苹果 题目描述 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果.每个韬韬都想要最大的苹果,所以发生 ...

  7. 备战Noip2018模拟赛3(B组) T2 Dance 开场舞蹈

    10月3日备战Noip2018模拟赛3(B组) T2 Dance 开场舞蹈 题目描述 在全世界人民的期盼下,2008年北京奥林匹克运动会终于隆重召开了! 为了展示中华民族博大精深的优秀传统文化,负责开 ...

  8. 备战Noip2018模拟赛5(B组)T2 Tree 采果子

    10月4日备战Noip2018模拟赛5(B组) T2 Tree采果子 题目描述 LYL大牛今天心情不错,于是走到埃及郊外旅游.他边走边向四周望望,发现周围有许多果树.这些树之间互相到达的时间LYL是知 ...

  9. jzoj 5906. 【NOIP2018模拟10.15】传送门(树形dp)

    5906. [NOIP2018模拟10.15]传送门 Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normal ...

最新文章

  1. libsvm java api文档,libsvm-javaAPI
  2. 在CentOS 6.3 64bit上安装FTP服务器vsftpd 2.2.2
  3. 前端学习(833):操作元素小结
  4. js提交出现post错误_阿里云的 Node.js 稳定性实践
  5. 黑群晖给局域网电脑发消息_老电脑搭建家用NAS,省钱又好用
  6. 58. Attribute item() 方法
  7. Atitit 获取多媒体mp3 mp4 m4a元数据 G:\桌面安装\paidashi\bin\ffprobe.exe ffprobe -i 1.flv -print_format json -sh
  8. 非常易懂且全面的计算机科学概论知识总结
  9. 第二届ATI获奖自动化测试工具介绍
  10. bp matlab预测结果差,BP神经网络 预测 精度差
  11. Windows实现微信多开+美化图标
  12. python获取国内IP地址合集下发至网络设备
  13. 【在线仿真】Arduino WS2812b环形24颗霓虹灯动态效果显示
  14. Cannot create fileC:\Users\LML\AppData\Local\Temp\EditorLineEnds.ttr。另一个程序正在使用此文件,进程无法访问。
  15. 新建android模拟器无法拨号 真机可以拨号,Android模拟器相关操作设置
  16. Windows中redis设置密码
  17. Socks代理上网工具 tsocks
  18. MySQL输入密码闪退
  19. java将简体中文_【Java】简体中文、繁体中文转换
  20. IC从业人员基础:计算机基础知识缩写

热门文章

  1. python 吧-做为IT人的你 趁年轻学点Python吧
  2. python画三维立体图-Python 竟能绘制出如此酷炫的三维图
  3. python安装教程3.8.5-怎么安装最新Python3.8.5-新手入门教程必看
  4. python第三方库有哪些常用的、请列举15个-python基础面试常见题
  5. python就业前景-Python就业前景分析
  6. python简单代码编写-python读写Excel表格的实例代码(简单实用)
  7. python多个for的执行顺序-python_装饰器篇(多个装饰器下的执行顺序)
  8. python安装步骤win10-教你如何在Win10系统安装Python?
  9. python自动测试p-Python自动化测试
  10. 软件测试用python一般用来做什么-python能够做软件的自动化测试吗?