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)的常量时间,多么的简洁优美, 但是在特定的场 ...
随机推荐
- RxJava Rxandroid retrofit
其实Retrofit会了.集合RxJava,RxAndroid 就很简单了. 只需要改几个地方. 1.接口里面返回的对象不再是 call,而是Observable public interface A ...
- Excel动画教程50例(三)
Excel动画教程50例(三) 31.Excel自定输入数据下拉列表 32.Excel正确输入身份证号码 33.Excel数据排序操作 34.Excel数据表格中如何将姓名信息按笔画排列 35.Exc ...
- 【Rotate Image】cpp
题目: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwis ...
- ios开发学习笔记001-C语言基础知识
先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...
- day05_10 作业
bug1.0版本 #购物车程序 salary = int(input("请输入你的工资")) item = ['iphone6s','macbook','coffee','pyth ...
- 聊聊、Java 命令 第三篇
这篇随笔主要写启动 jar 时,如果需要依赖其他的 jar 包该怎么处理,我会以 rabbitMQ 客服端启动为例. package com.rockcode.www.rabbitmq; import ...
- PAT——乙级1016
乙级PAT的1016 乙级的题相对比较简单,我也是主要联系写代码的格式,而不是联系算法. 1016 部分A+B (15 point(s)) 正整数 A 的“DA(为 1 位整数)部分”定义为由 ...
- redis设置最大内存上限对置换策略的解读
现在很少服务器还在使用32位的操作系统了,所以服务器的内存可以接近极限2^64的字节.redis配置文件中有限制最大内存的字段maxmemory,当redis的key达到最大值时,redis会有多种策 ...
- web项目中各种路径的获取(复制,为以后好找资源)
web项目中各种路径的获取 1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/"); 这将获 ...
- Unity开发VR——Oculus Rif_将Oculus接入Unity
该文档基于 Unity2018.3.12f1 1. 搭建简单场景 2. 设置,选择 Edit - Project Setting(若已经勾选,就去掉在勾选一次) 完成该步骤之后,可以带上Oculus头 ...