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 ...
随机推荐
- sendevent是使用
按下: sendevent /dev/input/event4 1 254 1 sendevent /dev/input/event4 0 0 0 松开: sendevent /dev/input/e ...
- poj 1363 Rails (【栈的应用】 刘汝佳的写法 *学习)
Rails Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25964 Accepted: 10199 Descripti ...
- html5--6-1 引入外部样式表
html5--6-1 引入外部样式表 实例 学习要点 掌握引入外部样式表方法 插入样式的三种方法 内联样式表(行内) 内部样式表(style中) 外部样式表 创建一个外部样式表 在head中使用lin ...
- hdu 1753 大明A+B(大数)
题意:小数大数加法 思路:大数模板 #include<iostream> #include<stdio.h> #include<string.h> using na ...
- UIButton设置为圆形按钮并增加边框
设置按钮的长和宽尺寸一致(即为正方形),然后将圆角半径设为边长的一半,即形成一个圆形 UIButton *btn = [UIButton buttonWithType:UIButtonTypeSyst ...
- certificate unknown(46) - 中间证书问题排查
因为腾讯云的网站备案迟迟没有批下来,因此使用了朋友在阿里云的域名yk,我则申请了一台阿里云服务器,并将域名解析映射至该服务器.SSL证书则是在腾讯云上申请的,使用了Apache文件夹中的文件,放置在c ...
- java实现EXCEL数据导入到数据库中的格式问题的解决
之前作为项目甲方,加之java接触不多,在java web开发方面都是打下手的份. 对于EXCEL数据导入到数据库这个问题一直老是出现格式原因而导入失败也是未免惆怅,开发团队也是只说回去检查一下格式. ...
- jquery easyui 实战总结
(2012-09-26 10:22:24) 转载▼ 标签: it 分类: Javascript 一.tree 1.根据node id查找对应的node,然后选择该节点: ...
- Google 马来西亚主页被黑
互联网并没有想象中安全,Google 马来西亚主页被黑 | TheVerge 消… 查阅全文 ›
- hue集成各种组件
一.Hue安装 可以编译安装,我这里有已经编译好的,直接解压使用: hue默认端口:8888 http://gethue.com/ https://github.com/cloudera/hue ht ...