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 ...
随机推荐
- String StringBuffer StringBuilder 三者之间的区别
今天被公司骗去面试,好糟心...... 这个问题不管去哪里面试,基础问题基本上都会问到这个问题.网上好多大神都总结,这里自己也总结一下. 首先我们最开始学的就是String字符串常量,这里有行代码 S ...
- Linux init 系列一 System V风格
传统的Linux init有两种风格,System V风格和BSD风格,本文主要介绍System V风格. System V风格init的主要流程是, 1. 内核执行init进程. 2. Init 运 ...
- (转)Java经典设计模式(3):十一种行为型模式(附实例和详解)
原文出处: 小宝鸽 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J ...
- ansible操作模块相关
1. 查看模块可用参数命令 ansible-doc -s module_name
- Android studio 添加assets文件夹
我们知道Eclipse创建的工程默认是有个assets文件夹的,但是Android studio默认没有帮我们创建,那么我们就自己创建一个就好啦. (1)手动创建 在项目的顶部有个下拉,默认选择的是A ...
- Opencv— — Color Gradient
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- 「HNOI2004」「LuoguP2292」L语言(AC自动机
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- 十五、事务(Transaction)
1.事务是什么? 2.示例 查询事务的隔离级别, 1>会话级(select @@tx_isolation或select @@session.tx_isolation) 2>全局级(sele ...
- 爬虫库之BeautifulSoup学习(三)
遍历文档树: 1.查找子节点 .contents tag的.content属性可以将tag的子节点以列表的方式输出. print soup.body.contents print type(soup. ...
- 1 python----pycharm本地部署spark
下图相关工具连接 链接:https://pan.baidu.com/s/115XWf_Fc1yMiJytKJQXnFQ 密码:3jvr 好了,加油哟!