洛谷10月月赛R2·浴谷八连测R3题解
早上打一半就回家了...
T1傻逼题不说了...而且我的写法比题解要傻逼很多T T
T2可以发现,我们强制最大值所在的块是以左上为边界的倒三角,然后旋转4次就可以遍历所有的情况。所以二分极差,把最大值所能扩展到的(mp[i][j]+mid>=mx)最大倒三角求出来,剩下的数减去最小值判断一下是否小于等于极差,如果是的话答案可行。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
int mn,mx;
int n[],m[],mp[][maxn][maxn];
bool v[maxn][maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void rotate(int x,int y)
{
for(int i=;i<=n[x];i++)
for(int j=;j<=m[x];j++)
mp[y][j][n[x]-i+]=mp[x][i][j];
n[y]=m[x];m[y]=n[x];
}
bool check(int x,int mid)
{
memset(v,,sizeof(v));
int now=m[x];
for(int i=;i<=n[x];i++)
for(int j=;j<=now;j++)
if(mp[x][i][j]+mid<mx){now=j-;break;}
else v[i][j]=;
for(int i=n[x];i;i--)
for(int j=m[x];j;j--)
if(v[i][j])break;
else if(mp[x][i][j]-mid>mn)return ;
return ;
}
int main()
{
read(n[]);read(m[]);mn=inf;
for(int i=;i<=n[];i++)for(int j=;j<=m[];j++)read(mp[][i][j]),mx=max(mx,mp[][i][j]),mn=min(mn,mp[][i][j]);
rotate(,);rotate(,);rotate(,);
int l=,r=mx-mn;
while(l<r)
{
int mid=(l+r)>>;
if(check(,mid)||check(,mid)||check(,mid)||check(,mid))r=mid;
else l=mid+;
}
printf("%d\n",l);
return ;
}
T3超喵的题啊,虽然标程好像出了点小偏差,已经跟管理员反馈了,但是现在暂时还没有更正,还是先水一篇博客要紧...
首先要知道扩展欧拉定理...
我们知道p<=2e7,所以可以先预处理出2e7内的phi(我写个埃式筛怎么比线性筛慢那么多T T)。因为一个数最多经过log次求phi的操作就会变成1,当变成1的时候后面的数就没有意义了,所以对于一个区间的询问,我们可以递归地计算指数,直到1就返回1,或者直到区间扫完就返回当前位置的值,效率O(logP)。但是我们怎么判断当前指数是否大于phi(p)呢,可以发现
,所以我们只要知道后5位的数就可以判断指数是否大于phi(p)了。然后一边递归一边快速幂,用BIT维护区间修改,单点查询,就可以了。
这个代码现在只有90分,等管理员更正数据后就能AC了...
UPD:数据已更正,状态里瞬间只剩下我一个人AC...
UPD:改成线性筛快了好多...
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9,lim=2e7;
int n,m,ty,x,y,z,cnt;
int phi[],v[maxn],prime[];
ll tree[maxn],a[maxn];
bool vis[];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline int lowbit(int x){return x&-x;}
inline void add(int x,int delta){for(;x<=n;x+=lowbit(x))tree[x]+=delta;};
inline ll querysum(int x){ll sum=;for(;x;x-=lowbit(x))sum+=tree[x];return sum;}
inline ll query(int x)
{
if(v[x]==m+)return a[x];
v[x]=m+;return a[x]=querysum(x);
}
inline int power(int a,int b,int mod)
{
if(!a)return ;int ans=;
for(;b;b>>=,a=1ll*a*a%mod)
if(b&)ans=1ll*ans*a%mod;
return ans;
}
int solve(int l,int r,int mod)
{
if(mod==)return ;
ll now=query(l)%mod;if(!now)return ;if(l==r)return now;
int nxt=min(l+,r);
for(int i=l+;i<nxt;i++)if(query(i)==){nxt=r=i;break;}
ll last=query(nxt),x;
if(last>=phi[mod])return power(now,solve(l+,r,phi[mod])+phi[mod],mod);
for(int i=nxt-;i>l;i--)
{
ll mi=last;last=;x=query(i);
for(int j=;j<=mi;j++)
{
last*=x;
if(last>=phi[mod])return power(now,solve(l+,r,phi[mod])+phi[mod],mod);
}
}
return power(now,solve(l+,r,phi[mod]),mod);
}
inline void getphi()
{
phi[]=;
for(int i=;i<=lim;i++)
{
if(!vis[i])prime[++cnt]=i,phi[i]=i-;
for(int j=;j<=cnt;j++)
{
int t=i*prime[j];if(t>lim)break;
vis[t]=;
if(i%prime[j]==){phi[t]=phi[i]*prime[j];break;}
phi[t]=phi[i]*(prime[j]-);
}
}
}
int main()
{
getphi();read(n);read(m);int pre=;
for(int i=;i<=n;i++)read(x),add(i,x-pre),pre=x;
while(m--)
{
read(ty);read(x);read(y);read(z);
if(ty==)add(x,z),add(y+,-z);
else printf("%d\n",solve(x,y,z)%z);
}
return ;
}
洛谷10月月赛R2·浴谷八连测R3题解的更多相关文章
- 洛谷4月月赛R2
洛谷4月月赛R2 打酱油... A.koishi的数学题 线性筛约数和就可以\(O(N)\)了... #include <iostream> #include <cstdio> ...
- 【LGR-054】洛谷10月月赛II
[LGR-054]洛谷10月月赛II luogu 成功咕掉Codeforces Round #517的后果就是,我\(\mbox{T4}\)依旧没有写出来.\(\mbox{GG}\) . 浏览器 \( ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
- 洛谷10月月赛Round.3
Rank11:260=60+100+100 P2409 Y的积木 题目背景 Y是个大建筑师,他总能用最简单的积木拼出最有创意的造型. 题目描述 Y手上有n盒积木,每个积木有个重量.现在他想从每盒积木中 ...
- 洛谷10月月赛Round.1| P3398 仓鼠找sugar[LCA]
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
- 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]
题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...
- 洛谷10月月赛Round.1| P3399 丝绸之路 [DP]
题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲,将那里的香 ...
- 【LGR-060】洛谷10月月赛 I div.1&div.2
Preface 一边打一边写作文打的像shit,T2失智严重特判错了233 Orz Div1 Rank2的foreverlastnig聚聚,顺便说一句显然Luogu的比赛质量比以往显著提高了啊 以下题 ...
- 洛谷 4933 洛谷10月月赛II T2 大师
[题解] f[i][j]表示最后一个数为h[i],公差为j的等差数列的个数.n方枚举最后一个数和倒数第二个数转移即可.注意公差可能为负数,需要移动为正数再作为下标. #include<cstdi ...
随机推荐
- perf + 火焰图用法 小结
要对新服务做性能测试,分析代码热点,初识perf,做下总结 perf + 火焰图用法 perf简介 Perf (Performance Event), Linux 系统原生提供的性能分析工具, 会返回 ...
- 关于scrum敏捷测试
关于scrum的一些定义 敏捷软件开发方法是一种把新增功能通过较小的循环逐步迭代添加到项目中(的项目管理方法),工作是由自我组织的团队以高效合作的方式拥抱和适应变化来保证客户需求被真正满足的方式来完成 ...
- 【转】微信小程序实现自动化测试
山雨欲来风满楼,最近微信小程序相关开发文章吹遍大江南北,亦有摧枯拉朽万象更新之势.问小程序形为何物,直教IT众生怡情悦性高潮迭起.作为一名有着远大理想“包袱”与互联网变革 “使命感”的测试工程师,我再 ...
- TW实习日记:第八天
今天早上主要是接着做昨天的微信端网页预览附件,听同事说当打包代码放入服务器上后,就不存在跨域问题了,也就懒得自己写接口了,那么就希望自己能一次过吧...结果写着写着,发现开发文档中关于预览文件的方法, ...
- Nginx快速入门
本文主要介绍nginx的基本配置和操作,并介绍了一些可以完成的简单任务. 假设您已经学习过并已经安装好了nginx服务器. 如果没有,请参阅安装nginx页面(http://www.yiibai.co ...
- 【Python 开发】Python目录
目录: [Python开发]第一篇:计算机基础 [Python 开发]第二篇 :Python安装 [Python 开发]第三篇:python 实用小工具
- U盘安装OSX
1.插入U盘,磁盘工具,格式化U盘为Mac OS X拓展 (日志式): 2.去网站搜索recovery disk assistant,此文件大约1.1M,直接打开使用它制作启动盘,进度条完毕就完成了. ...
- 基于DPDK的高效数据包捕获技术分析与应用
被NFV的论文折磨了两天,今天上午看了两篇DPDK的综述. 传统的包捕获机制 1. BPF 两个组成部分:转发部分和过滤部分. 转发部分负责从链路层提取数据包并转发给过滤部分. 过滤部分根据过滤规则, ...
- ubuntu16.04卸载火狐,Amazon
一.卸载火狐: . dpkg --get-selections |grep firefox .sudo apt-get purge firefox unity-scope-firefoxbookmar ...
- [pascal入门]数组
一.本节目标 本节我们将要讲述数组.本节目标: 一维数组 二维数组 字符数组 二.一维数组 我们通过一个案例来简单的理解数组.班主任要计算班级里面50个同学数学成绩的平均成绩,道理上讲这是一个比较简单 ...