【题解】【白雪皑皑】
2022/2/16 23:15:46
本文主要是介绍【题解】【白雪皑皑】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题目传送门
题目大意:
给定一个序列,初始全为0,每次区间赋值为一个数,求最终的序列。
Solution:
观察数据范围,nlog n的时间复杂度无法通过此题,考虑线性做法。
可以将操作离线下来,则每个点第一次被覆盖时即为答案。
那么我们需要一个数据结构,能够帮助我们快速跳过已修改过的点。
这是并查集的一个经典操作。
我们对每个点记录一个nxt(相当于并查集中的fa数组),初始nxt[i]=i
每次操作,从nxt[l]不断跳直到超过r,记录答案,并修改nxt[i]=i+1;
Code
#include<bits/stdc++.h> using namespace std; inline int read() { register int x=0,w=1; register char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-') ch=getchar(); if(ch=='-') {ch=getchar();w=-1;} while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} return x*w; } inline void write(int x) { if(x<0) {putchar('-');x=~(x-1);} if(x>9) write(x/10); putchar('0'+x%10); } const int N=1e6+100; int ans[N],nxt[N]; int n,m,p,q; inline int find(int x) { return x==nxt[x]?x:nxt[x]=find(nxt[x]); } int main() { n=read();m=read();p=read();q=read(); for(int i=1;i<=n+1;++i) nxt[i]=i; for(int i=m;i;--i) { int l=(i*p+q)%n+1,r=(i*q+p)%n+1; if(l>r) swap(l,r); while(find(l)<=r) { ans[nxt[l]]=i; nxt[nxt[l]]=nxt[l]+1; } } for(int i=1;i<=n;++i) write(ans[i]),puts(""); return 0; }
这篇关于【题解】【白雪皑皑】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行