算法马拉松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 ...
随机推荐
- Eigen::aligned_allocator
http://blog.csdn.net/rs_huangzs/article/details/50574141
- 发送邮件小工具(python)
#!/usr/bin/python # -*- coding:UTF- -*- import sys import smtplib import email.mime.multipart import ...
- (水题)Codeforces - 4C - Registration system
https://codeforces.com/problemset/problem/4/C 用来哈希的一道题目,用map也可以强行过,但是性能慢了6倍,说明是在字符串比较的时候花费了接近6倍的时间. ...
- 新浪微博分享出现libc++abi.dylib: terminating with uncaught exception of type NSException微博微信SDK运行编译报错
SDK出现libc++abi.dylib: terminating with uncaught exception of type NSException 的问题: 解决方法 结合 # 监测bug( ...
- 清除display:inline-block元素换行符间隙font-size:0;
font-size:0; 清除display:inline-block元素换行符间隙 看例子: css: .dd {background-color: #ddd;} .dd2 {background- ...
- Unity 2D骨骼动画2:创建真实动画
http://bbs.9ria.com/thread-401781-1-1.html 在这个系列,我们将关注Unity引擎提供的基于骨骼动画工具.它的主要思想是为了把它应用到你自己的游戏来介绍和教基本 ...
- Ionic start 创建项目报错
Installing npm packages... Error with start undefined Error Initializing app: There was an error wit ...
- css 的继承性
目录 css 的继承性是什么? 父元素的属性那些可以被子元素继承,哪些不能呢? css 的继承性是什么? 在面向对象语言都会存在继承的概念,在面向对象语言中,继承的特点:继承了父类的属性和方法. 那么 ...
- XHTML学习笔记 part1
XHTML: 可扩展超文本标记语言 HTML语言最开始是用来描述文档的结构,如标题,段落等标记,后来HTML有增加了一些控制字体,对齐等方面的标记和属性,这样做的结果是HTML既可以用来描述文档的结构 ...
- dom4j的下载 在线文档 创建用户库