算法马拉松13 A-E解题报告
A题意(取余最长路):
佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱乐值为所经过的位置的权的总和。
有一天,她被下了恶毒的诅咒,这个诅咒的作用是将她的娱乐值变为对p取模后的值,这让佳佳十分的不开心,因为她无法找到一条能使她得到最大娱乐值的路径了!
她发现这个问题实在是太困难了,既然这样,那就只在3*n的矩阵内进行游戏吧!
现在的问题是,在一个3*n的带权矩阵中,从(1,1)走到(3,n),只能往右往下移动,问在模p意义下的移动过程中的权总和最大是多少。
n(1<=n<=100000),p(1<=p<=1000000000)。
最简单的思路就是 搞一搞前缀和 枚举两个转折点 那么复杂度是n^2。BOOM!
设三段的前缀和和 分别为s1,s2,s3 设转折点分别为(2,x1) (2,x2)
再仔细想一想p-1肯定是我们能得到的最大值,那么我们可以优化到枚举一个转折点(第二个转折点),前两段的结果丢在set里;
二分就OK了。
但是为了不影响二分的结果,做了一点改动(set不能丢入1,1->2,x1->2,x2)。应丢入1,1->2,x1->2,n 的和
前缀和表示为 s2[n]+s1[x1]-s2[x1-1];
二分的值变为((p-1)-(s3[n]-s3[x2-1])+((s2[n]-s2[x2]))+p)%p,每次更新答案就OK了
再观察一下发现插入和查询的时候都加了s2[n]
所以我们把s2[n]去掉=。=
然后s3[]用的一直是x2->n的和 这里应该用个后缀和的
写的时候手残读入错误,导致以为思路不对 --- 浪费了很多时间 (被自己气笑
PS:啊现在的我们是多么幸福,现成的STL啦啦啦;
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#include <set>
using namespace std;
const int maxn = 1e5+;
typedef long long ll;
inline void r(ll&num){
num=;ll f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
inline void r(int &num){
num=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
ll s1[maxn],s2[maxn],s3[maxn];
int main()
{
int n;
ll p;
r(n),r(p);
for(int i=;i<=n;i++)
{
r(s1[i]);
s1[i]=(s1[i]+s1[i-])%p;
}
for(int i=;i<=n;i++)
{
r(s2[i]);
s2[i]=(s2[i]+s2[i-])%p;
}
for(int i=;i<=n;i++)
{
r(s3[i]);
s3[i]=(s3[i]+s3[i-])%p;
}
set<ll>s;
ll ans = -;
set<ll>::iterator it;
ll sum;
ll cnt;
for(int i=;i<=n;i++)
{
s.insert(((s1[i]-s2[i-])%p+p)%p);
sum = (s3[n]-s3[i-]+s2[i])%p;
cnt = ((p-sum)%p+p)%p;
it = s.lower_bound(cnt);
if(it!=s.begin()) it--;
ans = max(ans,((((*it)+sum)+p)%p));
}
cout<<ans<<endl;
return ;
}
有漏洞
这里有一个小技巧 我们如果想找出小于等于X的最大值 我们只需lower_boundX+1 得到大于等于X+1的区间[it,end) 那么 [begin,it) 就是小于等于X的区间;
if it == begin 不存我们要的值
else *(--it)就是我们要的值辣
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#include <set>
using namespace std;
const int maxn = 1e5+;
typedef long long ll;
inline void r(ll&num){
num=;ll f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
inline void r(int &num){
num=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
ll s1[maxn],s2[maxn],s3[maxn];
int main()
{
int n;
ll p;
r(n),r(p);
for(int i=;i<=n;i++)
{
r(s1[i]);
s1[i]=(s1[i]+s1[i-])%p;
}
for(int i=;i<=n;i++)
{
r(s2[i]);
s2[i]=(s2[i]+s2[i-])%p;
}
for(int i=;i<=n;i++)
{
r(s3[i]);
s3[i]=(s3[i]+s3[i-])%p;
}
set<ll>s;
ll ans = -;
set<ll>::iterator it;
ll sum;
ll cnt;
for(int i=;i<=n;i++)
{
s.insert(((s1[i]-s2[i-])%p+p)%p);
sum = (s3[n]-s3[i-]+s2[i])%p;
cnt = ((p-sum)%p+p)%p;
it = s.lower_bound(cnt);
if(it!=s.begin()) it--;
else it = --s.end();
ans = max(ans,((((*it)+sum)+p)%p));
}
cout<<ans<<endl;
return ;
}
AC代码
C题意(比大小):
有两个数列A和B 已知A_0,a,b,N A_n=A_(n-1)*a+b (n>=1) B数列满足 B_n=2*B_(n/2) + 1 (n为偶数) B_n=2*B_((n-1)/2) + (n+1)/2 (n为奇数)
现在问B数列的第A_N项和第(A_N)+1项的关系
T组数据 A_0,a,b,N<=1e15
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#include <set>
using namespace std;
typedef long long ll;
inline void r(ll&num){
num=;ll f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
inline void r(int &num){
num=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
ll a,b,N;
ll A0,AN,A;
bool flag = false;
ll B[];
void check()
{
if(flag)
{
A+=;
}
if(B[A]==B[A+])
{
puts("=");
}
else{
if(B[A]<B[A+])
{
puts("<");
}
else{
puts(">");
}
}
}
int main()
{
int T;
r(T);
B[] = -;
//cout<<"-1"<<endl;
for(int i=;i<;i++)
{
B[i] = B[i/]*+;
if(i&)
{
B[i]+=i/;
}
//cout<<B[i]<<endl;
}
while(T--)
{
flag = false;
r(A0),r(a),r(b),r(N);
A = A0;
for(ll i=;i<=N;i++)
{ if(A>)
{
flag = true;
break;
}
A = A*a+b;
//A%=4;
}
A = A0%;
N = N > ? N % + : N;
for(int i=;i<=N;i++)
{
A = A*a+b;
A%=;
}
check();
}
return ;
}
AC代码
算法马拉松13 A-E解题报告的更多相关文章
- 51nod算法马拉松13
A 取余最长路 不难发现路径可以拆成三条线段,只要知道两个转折点的位置就能计算出答案. 设sum(i,l,r)表示第i行从l到r元素的和,则答案可以表示为sum(1,1,x)+sum(2,x,y)+s ...
- Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...
- LeetCode :1.两数之和 解题报告及算法优化思路
最近开始重拾算法,在 LeetCode上刷题.顺便也记录下解题报告以及优化思路. 题目链接:1.两数之和 题意 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode206 反转链表,内含7种语言答案
206.反转链表 1.题目描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1-> ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...
- ACM -- 算法小结(七)Phone list解题报告
HDOJ -- Phone list解题报告 问题描述:给出一些电话号码,如果有共同前缀则输出NO,如果没有则输出YES. 解题关键:将电话号码进行字符串排序,相邻的电话号码进行比较 Sa ...
- 杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告
杭州电子科技大学Online Judge 之 "确定比赛名次(ID1285)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozh ...
- USACO Section1.4 Arithmetic Progressions 解题报告
ariprog解题报告 —— icedream61 博客园(转载请注明出处)-------------------------------------------------------------- ...
- 2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告
2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...
随机推荐
- Flask_restful 插件实战笔记——基本概念与使用
最近在Resetful接口设计上想法还是挺多的,也实现了一些需求!想着整理下Flask_restful插件的基本知识,方便日后的复习! 官方地址:https://flask-restful. ...
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">详解
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 138. Copy List with Random Pointer (not do it by myself)
A linked list is given such that each node contains an additional random pointer which could point t ...
- 3D max模型导入unity 3D中注意事项
一.单位,比例统一 在建模型前先设置好单位,在同一场景中会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序需要缩放也可以统一调整缩放比例.统一单位为米. ...
- uoj#282. 长度测量鸡(构造)
传送门 打表题--只有\(n\leq 3\)有解否则无解→_→ 或者严格证明的话是这样,因为算上端点一共\(n+1\)个点,共\(\frac{n(n+1)}{2}\)个点对,所以点对之间两两距离不相等 ...
- PUSH 和 远程推送
1. UIApplacation向 APNS 注册 push notification 服务 (1) 应用程序要支持推送服务, 在网页里面配置 http://developer.apple.com/ ...
- Hackintosh
条件:Mac环境(也可在Windows电脑上用虚拟机建立).两只(一只亦可)16G及以上优盘.一块64G以上SSD固态(机械)硬盘.一台待折腾的Windows电脑 1.创建安装盘: ·app stor ...
- adb server version (39) doesn't match this client (40); killing...
在启动RN项目的时候也报错,上面的错误是在adb的环境变量中的位置和android studio的sdk不是一个位置.adb是在sdk中的,所以他们应该是一致的位置 android studio的sd ...
- EDAS提交论文字体未嵌入
一.深夜更一波,刚刚在EDAS提交论文,提示格式不通过,说我有字体未嵌入.但是之前一直都没有问题,这次只是在LaTeX中嵌图的时候把eps换成PDF了.所以问题应该是出在我的PDF图里,里面有字体未被 ...
- linux分配文件文件夹所属用户及组
ls -l 可以查看当前目录文件.如:drwxr-xr-x 2 nsf users 1024 12-10 17:37 下载文件备份分别对应的是:文件属性 连接数 文件拥有者 所属群组 文件大小 文件修 ...