【LGR-049】洛谷7月月赛
Preface
Luogu八月月赛都结束了我才来补七月月赛
这次月赛还是很狗的,在绍一的晚上恰逢刮台风,然后直接打到一半断网了
结果都没有交上去GG
感觉这次难度适中,解法也比较清新自然吧,十分给个九分一分因为没的打
好了下面开始看题。
A Divided Prime
目的:送分,坑罚时
一道比较SB的题目,尤其注意题目中一个信息:
保证对于一个数字,其在\(b_i\)中出现的次数不多于在\(a_i\)中出现的次数。
然后我们发现这个式子的本质就是一些数的乘积,我们讨论一下最后的结果:
- 由两个及以上的数相乘得来,绝对不是质数
- 是一个数的形式,\(O(\sqrt n)\)判断是质数还是合数
当然你不能傻乎乎地直接把一堆数乘起来,你又不是Python
我们离散化一下,然后用类似于桶一样的操作即可实现消去
CODE
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const LL N=100005;
LL a[N],b[N],r[N<<1],t1[N<<1],t2[N<<1],tot,n,m,t,cnt,num;
bool flag;
inline char tc(void)
{
	static char fl[100000],*A=fl,*B=fl;
	return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(LL &x)
{
	x=0; char ch; while (!isdigit(ch=tc()));
	while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void clear(void)
{
	memset(t1,0,sizeof(t1));
	memset(t2,0,sizeof(t2));
	cnt=tot=num=0; flag=1;
}
inline LL find(LL x)
{
	LL L=1,R=cnt;
	while (L<=R)
	{
		LL mid=(L+R)/2;
		if (r[mid]==x) return mid;
		if (r[mid]>x) R=mid-1; else L=mid+1;
	}
}
inline bool is_prime(LL x)
{
	if (x==1) return 0;
	for (register int i=2;i*i<=x;++i)
	if (x%i==0) return 0; return 1;
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	register LL i; read(t);
	while (t--)
	{
		clear(); read(n); read(m);
		for (i=1;i<=n;++i) read(a[i]),r[++cnt]=a[i];
		for (i=1;i<=m;++i) read(b[i]),r[++cnt]=b[i];
		sort(r+1,r+cnt+1); cnt=unique(r+1,r+cnt+1)-r-1;
		for (i=1;i<=n;++i) ++t1[find(a[i])];
		for (i=1;i<=m;++i) ++t2[find(b[i])];
		for (i=1;i<=cnt;++i)
		if (t1[i]-t2[i]==1)
		{
			if (!num) num=r[i]; else { flag=0; break; }
		} else if (t1[i]!=t2[i]) { flag=0; break; }
		if (!flag||!num) puts("NO"); else puts(is_prime(num)?"YES":"NO");
	}
	return 0;
}
B River Jumping
目的:送分,连罚时都骗不到
话说这题问什么蓝了,我觉得黄题都过了
看到题目和陈潇然大佬讨论了一波觉得直接贪心地跳,每次选择一个最近的且大于\(S\)的跳一下即可。
具体的证明感觉真的不需要:
对于一段岩石\(i\in[l,r]\),若\(w_r-w_l<S\),由于来回一次的限制,中间的石块便无法被跳完。
因此若有解,我们只需要按上面的方法做即可。
感觉没什么坑点,5min码完1A当然是赛后
CODE
#include<cstdio>
#include<cctype>
using namespace std;
const int N=100005;
int n,m,s,lst,cnt,ans[N],pre[N],dis,tot,x;
inline char tc(void)
{
	static char fl[100000],*A=fl,*B=fl;
	return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
	x=0; char ch; while (!isdigit(ch=tc()));
	while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(int x)
{
	if (x>9) write(x/10);
	putchar(x%10+'0');
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	register int i; read(n); read(m); read(s);
	for (pre[1]=0,tot=1,i=1;i<=m;++i)
	{
		read(x); if (x-lst>=s) ans[++cnt]=i,lst=x;
		else if (x-dis<s) return puts("NO"),0; else pre[++tot]=i,dis=x;
	}
	if (n-lst>=s) ans[++cnt]=i; else return puts("NO"),0;
	for (puts("YES"),i=1;i<=cnt;++i) write(ans[i]),putchar(' ');
	for (i=tot;i>=1;--i) write(pre[i]),putchar(' ');
	return 0;
}
C True Vegetable
目的:拉分题,考验脑洞和思维
由于数据范围我们想到二分,但不是常规的二分时间,因为这样我们很难直接判断
考虑二分被减的时间点。接下来我们先把题目的菜气减去被打掉的值。
这里忍不住又%一发出题人,把一个细节的数据\(w_i+r_{v_i}\le w_{i+1}\)藏的这么深
所以我们发现菜气被打掉之后总是可以涨回来的,于是直接贪心大力加即可。
考虑当前的这个点不满足,那么尽量向右选择即可。
CODE
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
const int N=5e5+5;
int n,m,k,s,a[N],x,w[N],num[N],v[N],t[N],ans,d[N];
inline char tc(void)
{
    static char fl[100000],*A=fl,*B=fl;
    return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
    x=0; char ch; while (!isdigit(ch=tc()));
    while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline int work(int x)
{
    register int i; int tot=0,step=0;
    memcpy(t,a,sizeof(t));
    memset(d,0,sizeof(d));
    for (i=1;i<=x;++i)
    t[num[i]]-=v[i];
    for (i=1;i<=n;++i)
    {
        if (t[i]+tot<1)
        {
            int dlt=1-t[i]-tot; step+=dlt; tot+=dlt;
            if (d[i+k-1]<=n) d[i+k-1]+=dlt;
        }
        tot-=d[i];
    }
    return step>w[x]?step:w[x];
}
int main()
{
    //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
    register int i; read(n); read(m); read(k); read(s);
    for (i=1;i<=n;++i) read(a[i]);
    for (i=1;i<=s;++i) read(x);
    for (i=1;i<=m;++i)
    read(w[i]),read(num[i]),read(v[i]);
    int l=0,r=m,mid; w[m+1]=1e9;
    while (l<=r)
    {
        mid=l+r>>1;
        if (work(mid)<w[mid+1]) ans=mid,r=mid-1; else l=mid+1;
    }
    return printf("%d",work(ans)),0;
}
D Beautiful Pair
目的:毒瘤数据结构,打压选手的信心
看到题目发现\(O(n^2)\)的暴力是naive的,考虑优化。
由于最近做过类似的题目,我就直接考虑当\(a_i\)为一个区间\(i\in[l,r]\)中的最大值时,对答案的贡献
首先两边是可以直接用单调栈\(O(n)\)搞出来的。
借鉴一下启发式的思想,我们每一次以\(i\)为中心把区间分成左右两边,并挑选数字个数少的一边直接枚举
同时在另一边的记录询问(注意这里的询问相当与求小于某一个数的数的数量)这个可以树状数组存一下
考虑我们把所有的操作都放到最后,渐进意义下期望的时间和空间复杂度都是控制在\(O(n\ logn)\)的范围内的(好像有大佬能证明更少)
所以最后扫一次在树状数组上跑并且统计即可,注意区间计算之后要及时删除
复杂度是很迷的\(O(n\ log^2n)\),结果不吸氧也能过
CODE
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<vector>
#define pb push_back
using namespace std;
const int N=100005;
int n,a[N],b[N],stack[N],top,front[N],back[N],num[N],tot,bit[N];
vector <int> d[N];
long long ans;
inline char tc(void)
{
    static char fl[100000],*A=fl,*B=fl;
    return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
    x=0; char ch; while (!isdigit(ch=tc()));
    while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void insert(int now,int opt)
{
    if (opt)
    {
        d[now].pb(1); d[front[now]-1].pb(-1);
        for (register int i=now+1;i<=back[now];++i)
        d[now].pb(a[now]/a[i]),d[front[now]-1].pb(-a[now]/a[i]);
    } else
    {
        d[back[now]].pb(1); d[now-1].pb(-1);
        for (register int i=front[now];i<now;++i)
        d[back[now]].pb(a[now]/a[i]),d[now-1].pb(-a[now]/a[i]);
    }
}
inline int abs(int x)
{
    return x>0?x:-x;
}
inline int lowbit(int x)
{
    return x&-x;
}
inline void add(int x)
{
    while (x<=n) ++bit[x],x+=lowbit(x);
}
inline int get(int x)
{
    int tot=0; while (x) tot+=bit[x],x-=lowbit(x); return tot;
}
inline int same_find(int x)
{
    int l=1,r=tot;
    while (l<=r)
    {
        int mid=l+r>>1; if (b[mid]==x) return mid;
        if (b[mid]<x) l=mid+1; else r=mid-1;
    }
}
inline int lower_find(int x)
{
    int l=1,r=tot,res;
    while (l<=r)
    {
        int mid=l+r>>1;
        if (b[mid]<=x) res=mid,l=mid+1; else r=mid-1;
    }
    return res;
}
int main()
{
    //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
    register int i,j; read(n);
    for (i=1;i<=n;++i)
    read(a[i]),b[i]=a[i];
    for (i=1;i<=n;++i)
    {
        while (top&&stack[top]<=a[i]) --top;
        front[i]=top?num[top]+1:1;
        stack[++top]=a[i]; num[top]=i;
    }
    for (top=0,i=n;i>=1;--i)
    {
        while (top&&stack[top]<a[i]) --top;
        back[i]=top?num[top]-1:n;
        stack[++top]=a[i]; num[top]=i;
    }
    for (i=1;i<=n;++i)
    if (i-front[i]<=back[i]-i) insert(i,0); else insert(i,1);
    sort(b+1,b+n+1); tot=unique(b+1,b+n+1)-b-1;
    for (i=1;i<=n;++i)
    {
        add(same_find(a[i]));
        for (j=0;j<d[i].size();++j)
        {
            int s=lower_find(abs(d[i][j]));
            ans+=d[i][j]>0?get(s):-get(s);
        }
    }
    return printf("%lld",ans),0;
}
E题凸包弃疗,感觉做不动
总体还可以吧,挺喜欢这次月赛的
希望下次不要断网了
【LGR-049】洛谷7月月赛的更多相关文章
- 洛谷4月月赛R2
		洛谷4月月赛R2 打酱油... A.koishi的数学题 线性筛约数和就可以\(O(N)\)了... #include <iostream> #include <cstdio> ... 
- 洛谷3月月赛 R1 Step! ZERO to ONE
		洛谷3月月赛 R1 Step! ZERO to ONE 普及组难度 290.25/310滚粗 t1 10分的日语翻译题....太难了不会... t2 真·普及组.略 注意长为1的情况 #include ... 
- 【洛谷5月月赛】玩游戏(NTT,生成函数)
		[洛谷5月月赛]玩游戏(NTT,生成函数) 题面 Luogu 题解 看一下要求的是什么东西 \((a_x+b_y)^i\)的期望.期望显然是所有答案和的平均数. 所以求出所有的答案就在乘一个逆元就好了 ... 
- 【LGR-054】洛谷10月月赛II
		[LGR-054]洛谷10月月赛II luogu 成功咕掉Codeforces Round #517的后果就是,我\(\mbox{T4}\)依旧没有写出来.\(\mbox{GG}\) . 浏览器 \( ... 
- 【LGR-051】洛谷9月月赛
		[LGR-051]洛谷9月月赛 luogu 签到题 description 给出\(K\)和质数\(m\),求最小的\(N\)使得\(111....1\)(\(N\)个\(1\))\(\equiv k ... 
- 「LGR-049」洛谷7月月赛 D.Beautiful Pair
		「LGR-049」洛谷7月月赛 D.Beautiful Pair 题目大意 : 给出长度为 \(n\) 的序列,求满足 \(i \leq j\) 且 $a_i \times a_j \leq \max ... 
- 洛谷9月月赛round2
		洛谷9月月赛2 t1 题意:懒得说了 分析:模拟 代码: program flag; var a:..,..]of char; n,i,m,j,x,y,ans,k:longint; begin ass ... 
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
		题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ... 
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
		题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ... 
- 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
		题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0 ... 
随机推荐
- Angular基础(八) Observable & RxJS
			对于一个应用来说,获取数据的方法可以有很多,比如:Ajax, Websockets, LocalStorage, Indexdb, Service Workers,但是如何整合多种数据源.如何避免BU ... 
- Flutter 布局(七)- Row、Column详解
			本文主要介绍Flutter布局中的Row.Column控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Row A widget that displays its children ... 
- Android系统启动流程(二)解析Zygote进程启动过程
			1.Zygote简介 在Android系统中,DVM(Dalvik虚拟机).应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器.它通过 ... 
- Yii1.1.16学习记录
			最近工作中用到Yii框架,为此专门在网上找了些相关教程学一下,尽管教程比较老,但学完后至少对Yii框架有了基本了解,特别是widget的使用,感觉Yii真的很强大. 一.框架介绍与安装 框架源码下载 ... 
- [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt
			[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt --//简单探究12c TABLE ACCESS BY INDEX ROWID BATCH ... 
- Chrome 如何让光标快速定位到地址栏-进行搜索
			我们经常花费大量的时间来进行使用浏览器搜索网页,如何进行高效的搜索,需要掌握一些快捷键: Windows: Ctrl + L 或 Alt + D 或 F6 Mac: Command + L Linux ... 
- Centos7系统如何不重启系统识别新添加的硬盘?
			今天在系统开机后插入三块硬盘,结果没有一块硬盘被系统识别到.后来找到了方法. echo "- - -" > /sys/class/scsi_host/host0/scan 上 ... 
- svg 认识及动画
			svg在线中文教程 https://svg.brucewar.me/ http://www.zhangxinxu.com/wordpress/tag/svg/ http://svgtrick.com ... 
- linux运行apache出现403错误
			1.文档权限问题,这是linux操作系统下经常会遇到的问题,需要使用chmod的指令把网站所在目录的权限提升到755.2.SElinux,开启它也会导致403错误的产生. 查看SELinux状态:1. ... 
- Java设计模式之四  -----  适配器模式和桥接模式
			前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ... 
