11.27 模拟赛

并没有人做的模拟赛。。。

出题人hx,,,

T1:就是上一道矩阵乘法 数学题

T2:

一个数列中 一个区间满足,存在一个k(L <= k <= R),并且对于任意的i (L <= i <= R),ai都能被ak整除

这样的一个特殊区间 [L, R]价值为R - L

想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢 这些区间又分别是哪些呢 输出每个区间的L

思路:

用两个ST表分别求一段区间的gcd和最小值

然后可以二分答案

check的时候枚举左端点,判断在这段区间里的gcd和最小值是否相等(正确性请自行脑补)

nlogn搞一搞就好了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<map>
 8 #include<vector>
 9 #include<queue>
10 #define inf 2147483611
11 #define ll long long
12 #define MAXN 10010000
13 using namespace std;
14 inline ll read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
19     return x*f;
20 }
21 int n,a[MAXN],stg[MAXN][20],stm[MAXN][20],st[MAXN],tp;
22 int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
23 int cnt(int a)
24 {
25     for(int i=1;i<=19;i++)  if((1<<i)<=a&&(1<<(i+1))>a) return i;
26 }
27 bool check(int x)
28 {
29     int t=cnt(x);
30     for(int i=1;i<=n-x;i++)
31         if(gcd(stg[i][t],stg[i+x-(1<<t)][t])==min(stm[i][t],stm[i+x-(1<<t)][t])) st[++tp]=i;
32 }
33 int main()
34 {
35     freopen("pair.in","r",stdin);
36     freopen("pair.out","w",stdout);
37     n=read();
38     for(int i=1;i<=n;i++) a[i]=read();
39     for(int i=1;i<=n;i++) stg[i][0]=stm[i][0]=a[i];
40     for(int i=1;i<=19;i++)
41         for(int j=1;j+(1<<i)<=n;j++)
42         {
43             stg[j][i]=gcd(stg[j][i-1],stg[j+(1<<(i-1))][i-1]),stm[j][i]=min(stm[j][i-1],stm[j+(1<<(i-1))][i-1]);
44         }
45     int l=1,r=n,ans=0,mid,tmp;
46     while(r-l>1)
47     {
48         mid=(r+l)>>1,tp=0;
49         check(mid);
50         if(tp) ans=mid,l=mid+1;
51         else r=mid-1;
52     }
53     tp=0;check(l);if(tp) ans=l;
54     tp=0;check(ans);
55     printf("%d %d\n",tp,ans-1);
56     for(int i=1;i<=tp;i++) printf("%d ",st[i]);
57 }

时间: 2024-10-10 06:14:46

11.27 模拟赛的相关文章

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

11.4 模拟赛

终于AK了,虽然第三题主要是搞月想出来的 T1: n个1*1的小方块,把这些小方块拼成一个图形,使这个图形周长最小 思路: 枚举拼成长方形的长为i,宽为n/i 可得面积 (i+n/i+(bool)(n%i))*2 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6 #include<cstr

10.27 模拟赛

这一次终极被吊打 甚至没进前十 T2 最后改错 T3 没写正解 T1 elim 题目大意: n 行 m 列的游戏棋盘,一行或一列上有连续 三个或更多的相同颜色的棋子时,这些棋子都被消除 当有多处可以被消除时,这些地方的棋子将同时被消除 求消除后的棋盘 思路: sb模拟 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cm

2.27模拟赛

pdf版题面 水题赛无题解 sol:可以用权值并查集搞,但感觉还是建图跑bfs比较容易 定义S[i]表示前缀和 读入a,b,c:就是S[a-1] + c=S[b],那就从a-1向b连一条c,b向a-1连一条-c 但这样有可能这张图并不联通,于是每次bfs时给节点染色,颜色不同显然to hard 询问随便处理下就可以了 /* S[3]-S[0]=10 S[3]-S[2]=5 */ #include <bits/stdc++.h> using namespace std; #define int

2017/11/3模拟赛

块(block)[问题描述]拼图达人小 C 手里有 n 个 1*1 的正方形方块, 他希望把这些方块拼在一起, 使得拼出的图形周长最小, 要求方块不能重叠. 擅长拼图的小 C 一下就求出了这个周长, 顺便他想考考你会不会求.[输入格式]多组数据, 第一行一个正整数 T, 表示数据组数.接下来 T 行, 每行一个正整数 n, 表示方块数.[输出格式]输出 T 行, 每行一个正整数, 表示答案.[样例输入]3 4 1122[样例输出]81420[数据范围]对于 20%的数据, n<=20:对于 40

2017/11/1模拟赛

磁星(magnet)[题目描述]在 B 城呆惯了的小 H 决定去外太空溜达一圈.人类现已发现并开发的星球(包括小 H 所在的星球)有 n 个,并且在这 n 个星球之中,人们发现了 m 对两个星球的关系.关系"xy"表示的是星球 x 对星球 y 有 1 一个单位的引导力,由于引导力还具有传递性,如果星球 x 对星球 y 能有恰好 a 个单位的引导力,星球y 对星球 z 能有恰好 b 个单位的引导力,那么星球 x 对星球 z 就能有恰好 a+b 个单位的引导力. 换言之,星球 x 对星球

11.2 模拟赛

T1: tarjan裸不能再裸了 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<vector> 8 #include<queue> 9 #define inf 2147483611 10 #defi

11.3 模拟赛

写了300分得了120 被众多低年级大佬的暴力踩成了弱智 T1 avogadro 题目大意: 3行N列 第一行为N的排列 其余两行的数属于$[1,n]$ 求最少删除多少列使剩下的列中 三行排序后一样 思路: 找到第二行或第三行里没有的 然后像拓扑一样搞就行了 (写的贼丑) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<