算法马拉松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 ...
随机推荐
- 15.oauth2 + oidc 实现 server部分
OAuth主要做授权. OpenIdConnect简历在OAuth2.0基础之上的,相结合 客户端.授权中心.Resource Owner用户本身(资源的拥有者).Resource Server 通过 ...
- UVaLive 3902 Network (无根树转有根树,贪心)
题意:一个树形网络,叶子是客户端,其他的是服务器.现在只有一台服务器提供服务,使得不超k的客户端流畅,但是其他的就不行了, 现在要在其他结点上安装服务器,使得所有的客户端都能流畅,问最少要几台. 析: ...
- 阻塞调用ShellExecute函数
SHELLEXECUTEINFO si;ZeroMemory(&si, sizeof(si));si.cbSize = sizeof(si);si.fMask = SEE_MASK_NOCLO ...
- Unity3d的批渲染 batch rendering
http://blog.csdn.net/leonwei/article/details/41942157 批渲染(Batch) batch render 是大部分引擎提高渲染效率的方法,基本原理就是 ...
- IT兄弟连 JavaWeb教程 JSTL常用标签
1.条件标签 条件标签能够实现Java语言中的if语句以及if-else语句的功能,它包括以下几种: <c:if>:用于实现Java语言中的if语句的功能. <c:choose> ...
- Java的理解
研发的工作就是写代码,我们通常写的都是java的类.这个东东计算机是无法识别的,所以需要需要一个东东帮我们做转化,这个就是编译器, 将java转换成class,但是class文件还不是二进制文件不是0 ...
- jvm 字节码查看
javap -c -v HelloWorldDemo.class >HelloWorld.txt
- TCP长链接调试利器nc
最近做了不少TCP长链接的开发,包括服务端和客户端.本人感觉服务器端与客户端通信时最好采用字符串形式,这样可以做要平台无关,跨语言.如果采用对象序列化机制通用性会较差.另外采用字符串形式用nc调试很方 ...
- bat脚本启动Burp
我的burp点击之后并不会直接打开,需要用命令启动,所以在网上找了一下快捷启动的方法. ①新建一个文本文档,输入start javaw -jar “burp路径”, ②另存为***.bat,文件类型选 ...
- 改变滚动条的原始样式: chrome 可以改变, IE只能变相关颜色,firfox好像也不好改。最好是自己写一个或是用插件
相关作者链接地址: https://www.lyblog.net/detail/314.html 问题: 1.我在项目中遇到的问题: 在设置了::-webkit-scrollbar 后,滚动条不见了! ...