NOI模拟题5 Problem A: 开场题
Solution
注意到$\gcd$具有结合律:
\gcd(a, b, c) = \gcd(a, \gcd(b, c))
\]
因此我们从后往前, 对于每个位置$L$, 找到每一段不同的$\gcd(a_x, a_{x + 1}, \cdots, a_R)$. 我们注意到这样的$R$最多只有$\log$段.
每个位置合并其后面一个位置的信息.
同时我们还维护序列的前缀异或和, 对于每个异或值, 都开一颗线段树来存储其出现的位置. 随便乱搞即可.
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#include <map>
typedef long long LL;
using namespace std;
namespace Zeonfai
{
inline LL getLL()
{
LL a = 0, sgn = 1; char c;
while (! isdigit(c = getchar())) if (c == '-') sgn *= -1;
while (isdigit(c)) a = a * 10 + c - '0', c = getchar();
return a * sgn;
}
}
const int N = (int)1e5, INF = (int)2e9;
int n;
LL a[N + 1], sum[N + 1];
struct record
{
int ed; LL val;
inline record(int _ed, LL _val) { ed = _ed; val = _val; }
};
vector<record> bck[N + 1];
map<LL, int> mp;
struct segmentTree
{
struct node
{
node *suc[2];
inline node() { for (int i = 0; i < 2; ++ i) suc[i] = NULL; }
}*rt;
inline segmentTree() { rt = NULL; }
node *insert(node *u, int L, int R, int pos)
{
if (u == NULL) u = new node;
if (L == R) return u;
if (pos <= L + R >> 1) u->suc[0] = insert(u->suc[0], L, L + R >> 1, pos);
else u->suc[1] = insert(u->suc[1], (L + R >> 1) + 1, R, pos);
return u;
}
inline void insert(int pos) { rt = insert(rt, 1, n, pos); }
int find(node *u, int curL, int curR, int L, int R)
{
if (u == NULL) return INF;
if (curL == curR) return curL;
int res = INF, mid = curL + curR >> 1;
if (L <= mid) res = min(res, find(u->suc[0], curL, mid, L, R));
if (res == INF && R > mid) res = min(res, find(u->suc[1], mid + 1, curR, L, R));
return res;
}
inline int find(int L, int R) { return find(rt, 1, n, L, R); }
}seg[N];
/* inline LL __gcd(LL a, LL b)
{
if (a < b) swap(a, b);
while (b)
{
LL tmp = b;
b = a % b;
a = tmp;
}
return a;
} */
inline vector<record>::iterator getPrevious(vector<record>::iterator p) { return -- p; }
int main()
{
#ifndef ONLINE_JUDGE
freopen("start.in", "r", stdin);
freopen("start.out", "w", stdout);
#endif
using namespace Zeonfai;
n = getLL();
for (int i = 1; i <= n; ++ i) a[i] = getLL();
for (int i = n; i; -- i)
{
bck[i].push_back(record(i, a[i])); int tot = 1;
if (i != n)
{
for (vector<record>::iterator p = bck[i + 1].begin(); p != bck[i + 1].end(); ++ p)
if (__gcd(p->val, a[i]) != bck[i][tot - 1].val)
bck[i].push_back(record(p->ed, __gcd(a[i], p->val))), ++ tot;
else bck[i][tot - 1].ed = p->ed;
}
}
sum[0] = 0; mp.clear(); int tot = 0;
for (int i = 1; i <= n; ++ i)
{
sum[i] = sum[i - 1] ^ a[i];
if (mp.find(sum[i]) == mp.end()) mp[sum[i]] = tot ++;
seg[mp[sum[i]]].insert(i);
}
LL K = getLL();
for (int i = 1; i <= n; ++ i)
{
for (vector<record>::iterator p = bck[i].begin(); p != bck[i].end(); ++ p)
{
if (K % p->val) continue;
int res = INF;
if (mp.find(K / p->val ^ sum[i - 1]) != mp.end())
res = seg[mp[K / p->val ^ sum[i - 1]]].find(p == bck[i].begin() ? i : getPrevious(p)->ed + 1, p->ed);
if (res != INF)
{
printf("%d %d\n", i, res);
return 0;
}
}
}
puts("no solution");
}
NOI模拟题5 Problem A: 开场题的更多相关文章
- fzuoj Problem 2182 水题
http://acm.fzu.edu.cn/problem.php?pid=2182 Problem 2182 水题 Accept: 188 Submit: 277Time Limit: 100 ...
- 【NOIP2017提高A组模拟9.7】JZOJ 计数题
[NOIP2017提高A组模拟9.7]JZOJ 计数题 题目 Description Input Output Sample Input 5 2 2 3 4 5 Sample Output 8 6 D ...
- noip模拟9 达哥随单题
T1.随 看题第一眼,就瞄到最下面 孙金宁教你学数学 ?????原根?目测神题,果断跳过. 最后打了个快速幂,愉快的收到了达哥送来的10分. 实际上这题暴力不难想,看到一个非常小的mod应该就能想到 ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...
- 【2018.12.10】NOI模拟赛3
题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...
- LCT题单(自己的做题情况反馈)(转自Flash)
LCT题单(自己的做题情况反馈)(转自Flash) 随时进Flash Hu的LCT看一发 也可以看一下我自己的风格的板子 开始 维护链信息(LCT上的平衡树操作) [X] 洛谷P3690 [模板]Li ...
- NOI模拟赛Day3
终于A题啦鼓掌~开心~ 开考看完题后,觉得第二题很好捏(傻叉上线 搞到十一点准备弃疗了然后突然发现我会做第一题 于是瞎码了码,就去准备饭票了... 好了,停止扯淡(就我一个我妹子每天不说话好难受QAQ ...
- 经典算法题每日演练——第十七题 Dijkstra算法
原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典 ...
- 经典算法题每日演练——第十一题 Bitmap算法
原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...
随机推荐
- 1026: [SCOI2009]windy数(数位dp)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9016 Solved: 4085[Submit][Sta ...
- js 实现5秒倒计时后跳转页面
<script type="text/javascript"> function countDown(secs, surl) { var jumpTo = docume ...
- 数据库路由中间件MyCat - 源代码篇(10)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3. 连接模块 3.5 后端连接 3.5.2 后端连接获取与维护管理 还是那之前的流程, st=>st ...
- ckeditor添加日历控件
这里日历控件用的是开源的My97DatePicker,先看下效果图: 1.点击左侧自定义的日历控件按钮,弹出日历控件对话框. 2.点击确定,日历控件添加的表单设计器中,同时保留日历的控件样式 3.点击 ...
- xss games20关小游戏附源代码
1. get方式的的值直接输出来了. ?name=<script>alert(1)</script> 2. 同样没有过滤,不过需要闭合前边的双引号和>. "&g ...
- day05_06 continue语句、while循环
输入满3次跳出,然后留一句话 for i in range(3): username = input("Username:") password = input("Pas ...
- WPF TextBlock 调整下划线与文字的距离
<TextBlock Foreground="> <TextBlock.TextDecorations> <TextDecorationCollection&g ...
- uploadify 报http 302错误
uploadify 报http 302错误 原因是系统采用Forms认证,服务端加入匿名认证即可 具体配置如下: <location path="Base/Base/Upload&qu ...
- poj1386 字符串类型的一笔画问题 欧拉回路
Play on Words Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10685 Accepted: 3625 De ...
- 【bzoj3544】[ONTAK2010]Creative Accounting 前缀和+STL-set
题目描述 给定一个长度为N的数组a和M,求一个区间[l,r],使得$(\sum\limits_{i=l}^{r}{a_i})\ mod\ M$的值最大,求出这个值,注意这里的mod是数学上的mod(即 ...