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 ...
随机推荐
- Opencv— — Circle Filter
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- Learning Android ActionBar
PART1:Make Android2.1 Support ActionBar Last evening I learnt how to make android2.1 support actionb ...
- CQOI2017 部分题解
部分题解是指没写那道算几. BZOJ上目前没有day2的题面D2T2的图. BZOJ4813 小Q的棋盘 显然可以$O(n^2)$DP,然而可以$O(n)$贪心:只有一条从根出发的一条链上的边可以只经 ...
- P4147玉蟾宫——最大子矩阵
悬线法裸题. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace ...
- Winform安装包出现无法访问网络位置
1.原因:安装包的安装路径出现了问题 2.如下图:错误路径 3.如下图:正确路径
- su命令,sudo命令,visudo命令
一.命令su 语法 : su [-] username后面可以跟 ‘-‘ 也可以不跟,普通用户su不加username时就是切换到root用户,当然root用户同样可以su到普通用户. ‘-‘ 这个字 ...
- Notice:Array to string conversion的问题
如果后台或者前端输出这样的提示: Notice: Array to string conversion 原因是:用 echo 来输出数组,当然会报错,数组应该用print , print_r , 或 ...
- How Many Boyfriends
知乎上看到一个问题,如果一个女人说自己集齐了12个星座的男朋友,那么她已经搞过多少男人了. 先考虑这个问题的最简单版本,如果说该女人每一次和12个星座的男人交往的概率相同. 考虑$dp$ 注意到这个问 ...
- Quartz实现定期运行程序(Java)
package Quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; imp ...
- UVA - 11987 Almost Union-Find 并查集的删除
Almost Union-Find I hope you know the beautiful Union-Find structure. In this problem, you're to imp ...