HZOI20190803 A,C题
题目链接:https://www.cnblogs.com/Juve/articles/11295333.html
A:
考场上只有70分。。。
发现几个性质:特殊性质1:在两条链上,看它是fib第几项,同为奇数项或偶数项就输出小的,否则输出1
特殊性质2:a==b,输出a,否则输出1
你就70啦:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 300005
#define int long long
#define re register
using namespace std;
int m,anc[16][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{0,1,2,1,1,2,1,2,1,1,2,1,1,2,1,2},{0,1,1,3,1,1,1,1,3,1,1,3,1,1,1,1},{0,1,1,1,4,1,1,1,1,1,1,1,4,1,1,1},{0,1,2,1,1,5,1,2,1,1,2,1,1,5,1,2},{0,1,1,1,1,1,6,1,1,1,1,1,1,1,1,1},{0,1,2,1,1,2,1,7,1,1,2,1,1,2,1,2},{0,1,1,3,1,1,1,1,8,1,1,3,1,1,1,1},{0,1,1,1,1,1,1,1,1,9,1,1,1,1,1,1},{0,1,2,1,1,2,1,2,1,1,10,1,1,2,1,2},{0,1,1,3,1,1,1,1,3,1,1,11,1,1,1,1},{0,1,1,1,4,1,1,1,1,1,1,1,12,1,1,1},{0,1,2,1,1,5,1,2,1,1,2,1,1,13,1,2},{0,1,1,1,1,1,1,1,1,1,1,1,1,1,14,1},{0,1,2,1,1,2,1,2,1,1,2,1,1,2,1}};
int fib[65];
signed main(){
scanf("%lld",&m);
if(m<=12){
for(re int i=1,a,b;i<=m;i++){
scanf("%lld%lld",&a,&b);
printf("%lld\n",anc[a][b]);
}
return 0;
}
fib[0]=fib[1]=1;
for(re int i=2;i<=60;i++){
fib[i]=fib[i-1]+fib[i-2];
//cout<<fib[i]<<endl;
//if(fib[i]>1e12){
// cout<<i<<endl;
// break;
//}
}
for(re int i=1,a,b;i<=m;i++){
scanf("%lld%lld",&a,&b);
if(a==b) printf("%lld\n",a);
else if(abs(a-b)==1) puts("1");
else{
re int aa=0,bb=0;
for(re int j=1;j<=60;j++){
if(fib[j]==a){
aa=j;
}
if(fib[j]==b){
bb=j;
}
if(aa*bb!=0) break;
}
if((aa&1)==(bb&1)){
printf("%lld\n",fib[min(aa,bb)]);
}else puts("1");
}
}
return 0;
}
然而。。。
打正解:
100 分做法: 我们来研究一下这个神秘的力量: 依次写下兔子们的标号和他们父亲(从 2 开始): 1 1 1 2 1 2 3 1 2 3 4 5 … 发现其实一定是许多连续段的从 1 开始的序列组合到一起,每段长度依次是斐波那契数列里面的每一项。
于是我们发现,对于$fib(i)<=x<=fib(i+1),father(x)=x-fib(i)$
所以我们可以像lca一样,一个一个向上跳
因为$fib(60)>1e12$,所以复杂度可以接受
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define re register
using namespace std;
ll m,fib[];
void get_lca(ll a,ll b){
if(a<b) swap(a,b);
if(a==b){
printf("%lld\n",a);
return ;
}
ll aa=lower_bound(fib+,fib++,a)-fib;
get_lca(b,a-fib[aa-]);
}
signed main(){
scanf("%lld",&m);
fib[]=fib[]=;
for(re int i=;i<=;i++)
fib[i]=fib[i-]+fib[i-];
for(ll i=,a,b;i<=m;i++){
scanf("%lld%lld",&a,&b);
get_lca(a,b);
}
return ;
}
C:
留坑
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<stack>
#define MAXN 131075
#define MAXM 500005
#define re register
using namespace std;
int n,k,a[MAXN],mx=0,v[MAXM],ans=1,x,y,enemy[MAXM];
bool is_sq[MAXM];
stack<int>sta;
int fa[MAXN];
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
signed main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mx=max(mx,a[i]);
}
mx=sqrt(2*mx);
for(int i=2;i<=512;i++)
is_sq[i*i]=1;
if(k==1){
for(int i=n;i>=1;i--){
for(int j=mx;j>=2&&j*j>a[i];j--)
if(v[j*j-a[i]]==ans){
sta.push(i);
ans++;
break;
}
v[a[i]]=ans;
}
printf("%d\n",ans);
while(!sta.empty()){
printf("%d ",sta.top());
sta.pop();
}
puts("");
return 0;
}
for(int i=1;i<=MAXN-3;i++)
fa[i]=i;
for(int i=n;i>=1;i--){
for(int j=mx;j>=2&&j*j>a[i];j--){
if(v[j*j-a[i]]==sta.size()+1){
int p=j*j-a[i];
if(a[i]==p){
if(enemy[a[i]]){
for(int t=i;t<=(sta.empty()?n:sta.top());t++)
fa[a[t]]=a[t],enemy[a[t]]=0;
sta.push(i);
break;
}else enemy[a[i]]=p;
}else{
if((find(a[i])==find(p)&&a[i]!=p)||enemy[p]==p){
for(int t=i;t<=(sta.empty()?n:sta.top());t++)
fa[a[t]]=a[t],enemy[a[t]]=0;
sta.push(i);
break;
}
if(enemy[a[i]]){
x=find(enemy[a[i]]),y=find(p);
fa[x]=y;
}else enemy[a[i]]=p;
if(enemy[p]){
x=find(a[i]),y=find(enemy[p]);
fa[x]=y;
}else enemy[p]=a[i];
}
}
}
v[a[i]]=sta.size()+1;
}
printf("%d\n",sta.size()+1);
while(!sta.empty()){
printf("%d ",sta.top());
sta.pop();
}
puts("");
return 0;
}
HZOI20190803 A,C题的更多相关文章
- HZOI20190803 B题
题目:https://www.cnblogs.com/Juve/articles/11295333.html 话说这题方法挺多 40分:暴力 65:莫队,你会T得飞起 我考场上没打出带修莫队,没有修改 ...
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170105
20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170104
20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170103
20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- SQL面试笔试经典题(Part 1)
本文是在Cat Qi的原贴的基础之上,经本人逐题分别在MySql数据库中实现的笔记,持续更新... 参考原贴:http://www.cnblogs.com/qixuejia/p/3637735.htm ...
- 刷LeetCode的正确姿势——第1、125题
最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的 ...
- AWS的SysOps认证考试样题解析
刚考过了AWS的developer认证,顺手做了一下SysOps的样题.以下是题目和答案. When working with Amazon RDS, by default AWS is respon ...
随机推荐
- python 毫秒时间戳转日期
import time import datetime timestamp = 1570774556514 # 转换成localtime time_local = time.localtime(tim ...
- delphi判断MDI窗体的子窗体是否存在
转]delphi判断MDI窗体的子窗体是否存在//*************************************************************************** ...
- Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄
有了回调函数的概念及上面的例子,我们可以继续了.其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow.其函数原形是:function FindWindow(lpClass ...
- arcmap分类标注问题
在给图层标注的时候,经常出现冲突后有些标注出不来,需要将某些个别的点要素进行标注位置调整,如下图: 处理步骤如下, (1)打开Maplex标注引擎.从ToolBars中打开Labeling工具,勾选U ...
- 更改网卡名称以及重启网卡提示Determining if ip address x.x.x.x is already in use for device eth0
安装系统完成后,在CentOS6.6下网卡名称变为em1,有些不太方便,还是改回eth0 修改grub配置文件,vi /boot/grub/grub.conf,增加如下红色字体 kernel /vml ...
- 17-7-es6作用域
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 机器学习-一对多(多分类)代码实现(matlab)
%% Machine Learning Online Class - Exercise 3 | Part 1: One-vs-all % Instructions % ------------ % % ...
- Linux 下 Nand Flash 驱动主要数据结构说明
s3c2410 专有数据结构 s3c2410_nand_set struct s3c2410_nand_set { int nr_chips; /* 芯片 ...
- Python全栈开发:初识Python
Pythton简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语 ...
- github上创建java项目简单操作
github上创建java项目简单操作 参考L: github上创建java项目简单操作 - CSDN博客http://blog.csdn.net/qq_29392425/article/detail ...