bzoj4059 [Cerc2012]Non-boring sequences && bzoj5200 [NWERC2017]Factor-Free Tree
https://konnyakuxzy.github.io/BZPRO/JudgeOnline/4059.html
https://cn.vjudge.net/problem/Gym-100624D
根本不会。。。
似乎有很高妙的分治做法啊!https://www.cnblogs.com/forever97/p/bzoj4059.html
就是说,如果当前区间为[l,r],存在一个i满足pre[i]<l&&nxt[i]>r,那么任意一个[l,r]的子区间,只要包含i点就不无聊,因此只需要再检验[l,i-1]和[i+1,r]即可
复杂度n*log就是因为倒过来就是启发式合并的过程。。。
以前代码很奇怪不知道怎么回事也A掉了。。。
if(i==j) break;
i++;
if(pre[i]<l&&nxt[i]>r) return solve(l,i-)&&solve(i+,r);
if(i==j) break;
j--;
if(pre[j]<l&&nxt[j]>r) return solve(l,j-)&&solve(j+,r);
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int n,T,a[];
int pre[],nxt[];
map<int,int> ma;
bool solve(int l,int r)
{
if(l>=r) return ;
int i,j;
for(i=l,j=r;;)
{
if(pre[i]<l&&nxt[i]>r) return solve(l,i-)&&solve(i+,r);
i++;
if(i>j) break;
if(pre[j]<l&&nxt[j]>r) return solve(l,j-)&&solve(j+,r);
j--;
if(i>j) break;
}
return ;
}
int main()
{
int i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=;i<=n;i++) scanf("%d",&a[i]);
ma.clear();
for(i=;i<=n;i++)
{
pre[i]=ma.count(a[i])?ma[a[i]]:;
ma[a[i]]=i;
}
ma.clear();
for(i=n;i>=;i--)
{
nxt[i]=ma.count(a[i])?ma[a[i]]:n+;
ma[a[i]]=i;
}
puts(solve(,n)?"non-boring":"boring");
}
return ;
}
也有很高妙的扫描线做法啊!https://blog.csdn.net/PoPoQQQ/article/details/46380617
https://konnyakuxzy.github.io/BZPRO/JudgeOnline/5200.html
https://cn.vjudge.net/problem/Gym-101623F
做法跟上面那题几乎是一样的
仍然不会。。。
做法是类似的,卡在”区间内有多个可作为根的位置时,如何选择“上了
上网查了一下,发现怎样选择并不会影响答案。。。
证明很简单:假设已经得到了区间内一组以a为根的合法解,b也是一个合法根,直接把这棵树的根改为b,那么显然只有a到b的链上的所有边的两个端点的父亲-祖先关系反了一下,显然这条链上端点的值两两互质,因此这样子换根之后也是合法解
还有一点:我自己想的是每次分治直接分解质因数然后怎么怎么样,很慢,可能被卡常(质因数分解n^(1/4)吧?)
然而,可以直接线筛出1e7内每个数的最小质因子。。。然后分解质因子复杂度只要一个log
而且,只需要预处理每个数的上一个和下一个与其不互质的数位置即可。。。感觉常数要小不少啊
错误记录:
1.已经发现了需要单独记录f[t],然后while才能除以的是同一个数(就是需要69行),但是只改了一半(没改81行)
2.LA上有多组数据,但是我没有完整地清空(WA了很多发,包括61行,87行(需要fa[..]=0))
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
bool nprime[];
int prime[],len,f[];
int n,a[];
int pre[],nxt[];
map<int,int> ma;
bool fl;
int fa[];
int solve(int l,int r)
{
if(l>r) return ;
if(l==r) return l;
int i,j;
for(i=l,j=r;;)
{
if(pre[i]<l&&nxt[i]>r)
{
fa[solve(l,i-)]=i;
fa[solve(i+,r)]=i;
return i;
}
i++;
if(i>j) break;
if(pre[j]<l&&nxt[j]>r)
{
fa[solve(l,j-)]=j;
fa[solve(j+,r)]=j;
return j;
}
j--;
if(i>j) break;
}
fl=;
return ;
}
int main()
{
int i,j,t,q;
for(i=;i<=;i++)
{
if(!nprime[i]) prime[++len]=i,f[i]=i;
for(j=;j<=len&&i*prime[j]<=;j++)
{
nprime[i*prime[j]]=;f[i*prime[j]]=prime[j];
if(i%prime[j]==) break;
}
}
while(scanf("%d",&n)==){
fl=;
for(i=;i<=n;i++) scanf("%d",&a[i]);
ma.clear();
for(i=;i<=n;i++)
{
t=a[i];pre[i]=;
while(t!=)
{
q=f[t];
pre[i]=max(pre[i],ma.count(q)?ma[q]:);
ma[q]=i;
while(t%q==) t/=q;
}
}
ma.clear();
for(i=n;i>=;i--)
{
t=a[i];nxt[i]=n+;
while(t!=)
{
q=f[t];
nxt[i]=min(nxt[i],ma.count(q)?ma[q]:n+);
ma[q]=i;
while(t%q==) t/=q;
}
}
fa[solve(,n)]=;
if(fl) puts("impossible");
else
{
for(i=;i<=n;i++)
{
printf("%d",fa[i]);
if(i!=n) putchar(' ');
}
puts("");
}}
return ;
}
bzoj4059 [Cerc2012]Non-boring sequences && bzoj5200 [NWERC2017]Factor-Free Tree的更多相关文章
- 【启发式拆分】bzoj5200: [NWERC2017]Factor-Free Tree
和bzoj4059: [Cerc2012]Non-boring sequences非常相似 Description 一棵Factor-Free Tree是指一棵有根二叉树,每个点包含一个正整数权值,且 ...
- bzoj4059 [Cerc2012]Non-boring sequences
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题解] 考虑分治.定义过程solve(l,r)为判断全在[l,r]范围内的所有连续子 ...
- 【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences
这个做法名字是从武爷爷那里看到的…… Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子 ...
- BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)
这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...
- dp题目列表
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
- Mango DS Training #48 ---线段树2 解题手记
Training address: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=38966#overview A.Count Color ...
- poj 动态规划题目列表及总结
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
- poj 动态规划的主题列表和总结
此文转载别人,希望自己可以做完这些题目. 1.POJ动态规划题目列表 easy:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, ...
- A1119. Pre- and Post-order Traversals
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...
随机推荐
- Ubuntu环境下配置Android Studio【转】
本文转载自:https://www.jianshu.com/p/1f6295f9c955 之前学习Android开发的时候,一直跟各种教程一样,使用的是Eclipse+ADT,主要是比较方便,容易上手 ...
- 异步模式模式Future(结合Callable可以获取线程返回结果)
submit 和 excute是有啥区别 如果有这样的需求: 多线程实现下载,提高效率. 不论是Thread类还是Runnable接口重写run方法,有个特点就是没有返回值~~~~~~ 我都主线程 如 ...
- 牛逼的This使用
今天看到一个很不错的this使用demo: package com.toov5.Reordering; class Message1{ private Channel channel; private ...
- Program received signal SIGSEGV, Segmentation fault.
GDB调试的时候出现了: Program received signal SIGSEGV, Segmentation fault.(程序收到信号SIGSEGV,分段故障) SIGSEGV:在POSIX ...
- Git基本用法1
二.git的初始化 在使用git进行代码管理之前,我们首先要对git进行初始化. 1.Git 配置 使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名,每次提交记录 ...
- IOS微信禁用分享跳转页面返回BUG修复
fresh(); function fresh() { let isPageHide = false; window.addEventListener('pageshow', function () ...
- codeforces 450B B. Jzzhu and Sequences(矩阵快速幂)
题目链接: B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input ...
- flask logger
Flask uses standard Python logging. All Flask-related messages are logged under the 'flask' logger n ...
- c语言里如何调用汇编里的变量?
c语言里如何调用汇编里的变量? 汇编语言:是声明全局变量 .globl _end_ofs _end_ofs: .word _end - _start c语言:声明这个变量,然后再调用这个变量 void ...
- php字符编码转换中的iconv与mb_convert_encoding用法
iconv ( 'UTF-8' , 'GBK' , $str ); //将$str字符串 utf-8 编码转换成 gbk: 另外,5.4.0 这个版本起,字符非法时候会返回 FALSE,除非在输出字符 ...