2021.10.7 NKOJ周赛总结
Ⅰ. 自描述序列
问题描述:
序列 1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,...
看似毫无规律,但若我们将相邻的数字合并 : 1,22,11,2,1,22,1,22,11,2,11,22,1,...
再将每组替换为组内数字的个数,可以得到: 1,2,2,1,1,2,1,2,2,1,2,2,1,...
可以发现,这就是原序列,因此,这个序列可以无限生成下去。 现在你需要求这个序列的第 n 项(下标从 1 开始计算)。
输入格式:
本题有多组测试数据,第一行输入数据组数 T ,每组数据仅包含一行一个正整数 n 。
输出格式:
对每组数据,输出该序列的第 n 项。
数据范围:
1≤T≤10 , 1≤n≤10e7
这个就是一道模拟题,没有什么可以多说的。
Code:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
int n,head,tail,lst,A[15],f[10000005];
#define gc (p1==p2&&(p2=(p1=buf)+fread(buf,1,65536,stdin),p1==p2)?EOF:*p1++)
char buf[65536],*p1,*p2;
inline int read()
{
char ch;int x(0);
while((ch=gc)<48);
do x=x*10+ch-48;while((ch=gc)>=48);
return x;
}
int main()
{
n=read(),f[1]=1,f[2]=f[3]=head=lst=2,tail=3;
for(register int i=1;i<=n;++i) A[i]=read(),A[0]=max(A[0],A[i]);
while(tail<A[0])
{
int k=f[++head];if(lst&1) lst=2;else lst=1;
for(register int i=1;i<=k;++i) f[++tail]=lst;
}
for(register int i=1;i<=n;++i) printf("%d\n",f[A[i]]);
return 0;
}
自描述序列
Ⅱ. 极限
问题描述:

输入格式:
第一行输入 1 个整数 n 。 第二行输入 n 个整数,f(1)、f(2)、...、f(n) 。
输出格式:
输出 n 个数 g(1)、g(2)、...、g(n) ,每个数一行。 可以证明在题目条件下,答案是有限的数值,且都能写成 p/q 的形式,其中 gcd(p,q)=1。因此输出格式为 p/q。
数据范围:
1≤n≤10e5 , 1≤f(i)≤n
首先,很显然,进行多次操作后 f( ) 是肯定会成周期的,即 成环,但会存在不在环上的点,由于 k 趋于无穷,所以不在环上的点形成的链是可以忽略其贡献的,所以直接搜就可以了。
离谱的是,在考试时,搜索居然没有记忆化,等于打了个 n2 纯暴力啊!
离谱的是,考完之后,听见同学说是基环树,恍然发现这不是基环树吗?
离谱的是,考前一天,我们刚刚学的基环树,这...这......这............
基环树看这里
Code:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
int n,lst,tot,A[100005],B[100005],Mark[100005];
long long C[100005],gcd,a,b,Ans1[100005],Ans2[100005];
#define gc (p1==p2&&(p2=(p1=buf)+fread(buf,1,65536,stdin),p1==p2)?EOF:*p1++)
char buf[65536],*p1,*p2;
inline int read()
{
char ch;int x(0);
while((ch=gc)<48);
do x=x*10+ch-48;while((ch=gc)>=48);
return x;
}
inline long long Gcd(long long x,long long y)
{
long long z=x%y;
if(!z) return y;
return Gcd(y,z);
}
int main()
{
n=read();
for(register int i=1;i<=n;++i) A[i]=read();
for(register int i=1,cnt;i<=n;++i)
{
if(Mark[i]) {printf("%lld/%lld\n",Ans1[Mark[i]],Ans2[Mark[i]]);continue;}
C[1]=lst=A[i],B[lst]=cnt=1,++tot;
while(1)
{
lst=A[lst];
if(Mark[lst]==tot) {a=C[cnt]-C[B[lst]-1],b=cnt-B[lst]+1,gcd=Gcd(a,b),Ans1[tot]=a/gcd,Ans2[tot]=b/gcd;;break;}
if(Mark[lst]) {Ans1[tot]=Ans1[Mark[lst]],Ans2[tot]=Ans2[Mark[lst]];break;}
++cnt,B[lst]=cnt,C[cnt]=C[cnt-1]+lst,Mark[lst]=tot;
}
printf("%lld/%lld\n",Ans1[tot],Ans2[tot]);
}
return 0;
}
极限
Ⅲ. 最大三角形
问题描述:
果果有一些木棍,长度分别为 a1,a2,...,an。 果果想知道,仅使用 al,al+1,...,ar 这些木棍,每根木棍只能使用一次,能够组成的三角形中周长最长是多少。
输入格式:
第一行输入 2 个整数 n、q。 第二行输入 n 个整数 a1,a2,...,an 。 接下来 q 行,每行有两个整数 li、ri 。
输出格式:
对每组询问,输出最大的周长,一行一个。如果无法组成三角形,输出 −1 。
数据范围:
1≤n、q≤10e5 , 1≤ai≤10e9 , 1≤li≤ri≤n
对于三角形大家一定不陌生,小学生一定都知道:三角形 任意两边之和大于第三边,任意两边之差小于第三边。
当然,其实三角形只需满足:最大边小于另两边之和。
那么,如果最大边确定,要构成三角形的话,我们一定会选择剩下的边中最大的两条,且同时满足了周长最大。
由此观之,对于一个区间,我们从最大的开始判断,随后,次大等等。
区间 k 大,这个明显主席树了。
最后发现一下复杂度:一段区间无法构成三角形,最长的区间一定是斐波那契数列,在该数据范围下最多 44 个,即每次询问在主席树中最大查询 44 次 ,所以是 O( 44 * n * log(n) ),并且,44次是远远跑不满的。
Code:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
int n,m,k,tot,cnt,A[100005],B[100005];
struct node {int L,R,Sum,Id;}Tr[2000005];
#define gc (p1==p2&&(p2=(p1=buf)+fread(buf,1,65536,stdin),p1==p2)?EOF:*p1++)
char buf[65536],*p1,*p2;
inline int read()
{
char ch;int x(0);
while((ch=gc)<48);
do x=x*10+ch-48;while((ch=gc)>=48);
return x;
}
inline void Update(int x,int &y,int L,int R,int pos)
{
y=++cnt,Tr[y].L=Tr[x].L,Tr[y].R=Tr[x].R,Tr[y].Sum=Tr[x].Sum+1;
if(L==R) return;
int M=(L+R)>>1;
if(pos<=M) Update(Tr[x].L,Tr[y].L,L,M,pos);
else Update(Tr[x].R,Tr[y].R,M+1,R,pos);
}
inline int Get(int x,int y,int L,int R)
{
if(L==R) return B[L];
int M=(L+R)>>1,Tmp=Tr[Tr[y].L].Sum-Tr[Tr[x].L].Sum;
if(Tmp>=k) return Get(Tr[x].L,Tr[y].L,L,M);
k-=Tmp;return Get(Tr[x].R,Tr[y].R,M+1,R);
}
int main()
{
n=read(),m=read();
for(register int i=1;i<=n;++i) A[i]=B[i]=read();
sort(B+1,B+n+1),tot=unique(B+1,B+n+1)-(B+1);
for(register int i=1;i<=n;++i) A[i]=lower_bound(B+1,B+tot+1,A[i])-B;
for(register int i=1;i<=n;++i) Update(Tr[i-1].Id,Tr[i].Id,1,tot,A[i]);
for(register int i=1,kk,x,y;i<=m;++i)
{
x=read(),y=read();if(y-x<2) {printf("-1\n");continue;}
int t1,t2,t3,t4(2);
k=y-x+1,t1=Get(Tr[x-1].Id,Tr[y].Id,1,tot),
k=y-x,t2=Get(Tr[x-1].Id,Tr[y].Id,1,tot),
k=kk=y-x-1,t3=Get(Tr[x-1].Id,Tr[y].Id,1,tot);
while(t3+t2<=t1&&kk) t1=t2,t2=t3,kk=k=y-x-t4,++t4,t3=Get(Tr[x-1].Id,Tr[y].Id,1,tot);
if(!kk) printf("-1\n");
else printf("%lld\n",1LL*t3+t2+t1);
}
return 0;
}
最大三角形
Ⅳ. 彩色的树
问题描述:

第 1 行输入 1 个整数 n 。 第 2 行输入 n 个整数 c1、c2、...、cn 。 接下来 n−1 行,每行输入 2 个整数 ui、vi,表示一条树边。
输出格式:
输出题目要求的答案。
数据范围:
1≤n≤2×10e5 , 1≤ci≤n
美其名曰思维题,实则是道乱搞题。对于每一个点分别求贡献,最后加起来。
(这道题实在不好讲清楚,~qwq~)
Code:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
bool Mark[200005];
int n,tot,C[200005],Size[200005],Cnt,Head[200005],Next[400005],To[400005];
long long Sum[200005],Ans;
#define gc (p1==p2&&(p2=(p1=buf)+fread(buf,1,65536,stdin),p1==p2)?EOF:*p1++)
char buf[65536],*p1,*p2;
inline int read()
{
char ch;int x(0);
while((ch=gc)<48);
do x=x*10+ch-48;while((ch=gc)>=48);
return x;
}
inline void ADD(int x,int y) {Next[++Cnt]=Head[x],Head[x]=Cnt,To[Cnt]=y;}
inline void DFS(int x,int fa)
{
Size[x]=1,++Sum[C[x]];long long Tmp=Sum[C[x]],Temp;
for(register int i=Head[x],j;i;i=Next[i])
{
j=To[i];if(j==fa) continue;
DFS(j,x),Size[x]+=Size[j],Temp=Size[j]-Sum[C[x]]+Tmp,Ans+=(1LL*Temp*(Temp-1))/2,Sum[C[x]]+=Temp,Tmp=Sum[C[x]];
}
}
int main()
{
n=read();
for(register int i=1;i<=n;++i)
{
C[i]=read();
if(!Mark[C[i]]) ++tot,Mark[C[i]]=1;
}
for(register int i=1,x,y;i<n;++i) x=read(),y=read(),ADD(x,y),ADD(y,x);
DFS(1,0);long long Tmp;
for(register int i=1;i<=n;++i)
if(Mark[i]) Tmp=n-Sum[i],Ans+=Tmp*(Tmp-1)/2;
printf("%lld",1LL*tot*n*(n-1)/2-Ans);
return 0;
}
彩色的树
2021.10.7 NKOJ周赛总结的更多相关文章
- 2021.7.17 NKOJ周赛总结
发现自己简直是个智障:T1模数写成1e9+9:T2居然没有考虑刚好一个周期的情况:T4用"%lld"读入"unsigned long long".~qwq~ T ...
- 2021.8.18 NKOJ周赛总结
两个字总结:安详 T1: NKOJ-6179 NP问题 问题描述: p6pou在平面上画了n个点,并提出了一个问题,称为N-Points问题,简称NP问题. p6pou首先在建立的平面直角坐标系,并标 ...
- 2021.1.8 NKOJ 周赛总结
意料之中..... A:nkoj 3900 AC小程序 http://oi.nks.edu.cn/zh/Problem/Details/3900 A题比较简单,单独分析一下A和C,其实就是一个斐波那契 ...
- Noip模拟70 2021.10.6
T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
- Burp Suite Pro 2021.10 Full (macOS, Linux) -- 查找、发现和利用漏洞
申明:底层组件来自网络论坛或开源社区的分享,本站所有软件免费分享,仅供学习和测试使用,严禁用于任何商业用途!!! 请访问原文链接:https://sysin.cn/blog/burp-suite-pr ...
- 2021.10.29 数位dp
2021.10.29 数位dp 1.数字计数 我们先设数字为ABCD 看A000,如果我们要求出它所有数位之和,我们会怎么求? 鉴于我们其实已经求出了0到9,0到99,0到999...上所有数字个数( ...
- 2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS)
2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS) 题意: 给一张n*n的图,起点为A,终点为 B,求从A到B转弯次数最少为多少. 分析: 是否存在 ...
- 每日总结:Number&Math类(2021.10.4)
Java语言为每一个内置数据类型提供了对应的包装类. 所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number的子类 其中Integer 对应的基 ...
随机推荐
- [第八篇]——Docker 容器使用之Spring Cloud直播商城 b2b2c电子商务技术总结
Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. xxx@xxx:~# docker 可以通过命令 docke ...
- MySQL查询结果集字符串操作之多行合并与单行分割
前言 我们在做项目写sql语句的时候,是否会遇到这样的场景,就是需要把查询出来的多列,按照字符串分割合并成一列显示,或者把存在数据库里面用逗号分隔的一列,查询分成多列呢,常见场景有,文章标签,需要吧查 ...
- go新建一个工程
使用go mod 可以在任何地方新建工程 工程目录 main.go //引用子包必须格式"工程目录/子包" go.mod 子包 编译工程: go build
- selenium-ide-2.3.0 组件在foxfire45.0无法安装的问题
楼主在安装selenium-ide组件时,尝试了下面两种方式都无法安装: 1.在forfire浏览器进行拖拽安装,页面无任何跳转.拖拽后回车安装,也没任何效果 2.附件组件-从文件安装添加组件,添加了 ...
- Git - 命令行 常用
一.合并其他分支的commit(A分支中的commit合并至B分支) 切换到A分支,查询commit历史命令行 : $ git log 复制要合并的commit id (如:663802dfb121e ...
- 使用GitHub Pages + docsify快速搭建一个站点
话不多说,先看效果: https://bytesfly.github.io/blog 为什么需要一个站点 肯定有人会问,既然有类似 博客园 这样优秀的平台来写博客,为什么还需要自己搭建站点呢? 放在G ...
- Django学习day13随堂笔记
每日测验 """ 今日考题 1.什么是django中间件,它的作用是什么,如何自定义中间件,里面有哪些用户可以自定义的方法,这些方法有何特点 2.基于django中间件的 ...
- 学习PDO中的错误与错误处理模式
在 PDO 的学习过程中,我们经常会在使用事务的时候加上 try...catch 来进行事务的回滚操作,但是大家有没有注意到默认情况下 PDO 是如何处理错误语句导致的数据库操作失败问题呢?今天,我们 ...
- ecshop刷新页面出现power by ecshop和链接的解决办法
当小伙伴在使用echop模板进行修改的时候,如果你删掉底部自带版权后,再调试程序刷新界面的时候,时不时就会冒出一个power by ecshop,而且是带有链接的,很不舒服,所以需要去掉,下面是最简单 ...
- disruptor笔记之三:环形队列的基础操作(不用Disruptor类)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...