9.5模拟赛

T1 SET

题目背景

你以为真的是模板?

题目描述

输入输出格式

输入格式:

输出格式:

输入输出样例

输入样例#1:

2 10
4 6

输出样例#1:

5

说明

 

题目大意 :一开始给A集合,即为n个数。 为B集合的子集,然后从A集合中任意取出两个数(可以取重复的一个数)相加%p一定的B集合中

求b集合的大小最小是多少

题解:B集合最大为p知道吧;;;

求出N个数的最大公约数gg,在不考虑模p的情况下,随便两个数相加得到的数一定是gg的倍数,

所以0--p-1为gg倍数的一定存在B集合,可怕的是如果相加的数%p,不是gg的倍数,最大公约数改变了,

那么B集合中出现的数就不止gg的倍数了。具体看代码 玄学AC。考试是,我只判断了如果n个数的gcd为1

B的大小就为p水30分。

代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,p,tmp,x;
int gcd(int x,int y){
    return y==0?x:gcd(y,x%y);
}
int main(){
    scanf("%d%d",&n,&p);tmp=p;
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        tmp=gcd(tmp,x);
    }
    printf("%d\n",p/tmp);
    return 0;
}

T2 SEQUENCE

题目描述

有一个长度为nn的序列AA,每个数A_i (1 \leq i \leq n )A?i??(1≤i≤n)都满足1 \leq A_i \leq n1≤A?i??≤n

我们定义这个序列的恶心程度为j-i+1j?i+1的最大值,其中A_iA?i??,A_{i+1}A?i+1??,···,A_jA?j?? 都相等。

现在你最多能操作TT次,每次操作都是把相邻的两个数交换。问该序列的恶心程度最大能到多少。

输入输出格式

输入格式:

第一行两个整数nn,TT

第二行有nn个整数,第ii个数表示A_iA?i??

输出格式:

一个整数,表示该序列最大的恶心程度

输入输出样例

输入样例#1:

7 3
3 2 2 4 3 2 3

输出样例#1:

3

说明

【样例解释】

一种最优方案是,先将最右边的一个22与它左边的33交换,再将这个22与它左边的44交换,这样恶心程度是33

【数据范围】

对于所有测试点,1 \leq T \leq n^21≤T≤n?2??

题目大意: 给出一个序列,n个数。这个序列的开心值(题目扯谈=u=)为最长的连续相等的子序列的长度,

一共给出t此操作,每次操作可以交换相邻的两个数 求最大的开心值。

题解:看数据范围应该是个二分...然而我不会写judge函数...,然后正解是二分,找出每一个数能够在t次操作内形成的最长连续长度。

判断使第i--j个x在一起需要几次操作。

long long cal(int l,int r){
    int m=(l+r)>>1;
    return 1LL*A[m]*(2*m-l-r)+(sum[r]-sum[m])-(sum[m-1]-sum[l-1])-((m-l)*(m-l+1)+(r-m)*(r-m+1))/2;
}

解释一下。使第l--r的x在一起的最小操作怎样求。最小肯定是要往中间聚合。

1LL转成long long

A[m]*(2*m-l-r) 其中(2*m-l-r),当m是中间的那个x时(即我们要聚集到的x)(2*m-l-r)为0,否则为-1.(至于为什么-1,待会。)

(sum[r]-sum[m])-(sum[m-1]-sum[l-1]) 是计算中间x的右边的点到左边的点的距离和 (你随便一一对应就好啦),为聚集到中间那个点的距离。注意到是到中间那个点上。

如果第一个的(2*m-l-r)为-1的话 就默认为中间x左边的点,所以聚集时不是算出的中间的点了 而是 ...比如 。 。 。 。,聚集到第二个和第三个中间。

((m-l)*(m-l+1)+(r-m)*(r-m+1))/2。这个是因为我们聚集时是聚集在一个地方形成了个点。所以我们需要左边的点退1格,退两格...从右边来的点同。

为1+2+3+4....等差序列求和公式。

代码

#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
vector<int>pos[1000006];
int *A;
int n,x,ans;
long long t;
int sum[1000006];

long long cal(int l,int r){
    int m=(l+r)>>1;
    return 1LL*A[m]*(2*m-l-r)+(sum[r]-sum[m])-(sum[m-1]-sum[l-1])-((m-l)*(m-l+1)+(r-m)*(r-m+1))/2;
}

int slove(int n){
    int r=1,s=0;
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+A[i];
    for(int i=1;i<=n;i++){
        if(r<i)r=i;
        while(r<n&&cal(i,r+1)<=t)r++;
        s=max(s,r-i+1);
    }
    return s;
}

int main(){
    scanf("%d%lld",&n,&t);
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        pos[x].push_back(i);
    }
    for(int i=1;i<=n;i++){
        if(!pos[i].empty()){
            A=&pos[i].front()-1;
           ans=max(ans,slove(pos[i].size()));
        }
    }
    printf("%d\n",ans);
    return 0;
}

T3 

题目背景

好吧,这不是模板

题目描述

输入输出格式

输入格式:

输出格式:

输入输出样例

输入样例#1:

a
b
bb
4
4 1 5
4 1 1
4 2 4
6 2 11

输出样例#1:

1
0
1
2

说明

【样例解释】

【数据范围】

我真不会...贴标程吧...

代码

#include <stdio.h>
#include <string.h>
#include <string>
#include <assert.h>
#include <bits/stdc++.h>

#define debug(...) //fprintf(stderr, __VA_ARGS__)

#define MAXN 100005

#define base 313
#define mo 1000000009
using namespace std;
char a[MAXN], b[MAXN], s[MAXN];

int len_s;
int h_s;

inline void init_hash()
{
    int base_pow = 1;
    int i;
    for (i = 0; i < len_s; i++) {
        h_s = (h_s + 1LL * base_pow * s[i]) % mo;
        base_pow = 1LL * base_pow * base % mo;
    }
}

inline int count(const char *a, int len_a, int *sum)
{
    int base_pow = 1;
    int i;
    int h_a = 0;
    for (i = 0; i < len_s; i++) {
        h_a = (h_a + 1LL * base_pow * a[i]) % mo;
        base_pow = 1LL * base_pow * base % mo;
    }
    int ret = h_s == h_a;
    sum[0] = 0;
    sum[1] = ret;
    int tmp_h_s = h_s;
    int base_pow_2 = 1;
    for (i = len_s; i < len_a; i++) {
        tmp_h_s = 1LL * tmp_h_s * base % mo;
        h_a = (h_a + 1LL * base_pow * a[i] - 1LL * base_pow_2 * a[i - len_s]) % mo;
        h_a = (h_a + mo) % mo;
        ret += tmp_h_s == h_a;
        sum[i - len_s + 2] = ret;
        base_pow = 1LL * base_pow * base % mo;
        base_pow_2 = 1LL * base_pow_2 * base % mo;
    }
    return ret;
}

inline int count(const std::string &a, int *sum)
{
    return count(a.c_str(), a.length(), sum);
}

int q;

std::string f[105];
long long f_len[105];

int k;

struct data {
    long long ans;
    int l_id, r_id;
};

int cnt2[2][2];
int sum2[2][2][MAXN*5];

int cnt[2];
int sum[2][MAXN*3];

inline data operator + (const data &a, const data &b)
{
    data ret;
    ret.ans = a.ans + b.ans + cnt2[a.r_id][b.l_id] - cnt[a.r_id] - cnt[b.l_id];
    ret.l_id = a.l_id;
    ret.r_id = b.r_id;
    return ret;
}

data f_data[105];

inline void init()
{
    init_hash();
    cnt[0] = count(f[k - 1], sum[0]);
    cnt[1] = count(f[k], sum[1]);
    cnt2[0][0] = count(f[k - 1] + f[k - 1], sum2[0][0]);
    cnt2[0][1] = count(f[k - 1] + f[k], sum2[0][1]);
    cnt2[1][0] = count(f[k] + f[k - 1], sum2[1][0]);
    cnt2[1][1] = count(f[k] + f[k], sum2[1][1]);

    f_data[k - 1] = (data){cnt[0], 0, 0};
    f_data[k] = (data){cnt[1], 1, 1};
    int i;
    for (i = k + 1; i <= 100; i++) {
        f_data[i] = f_data[i - 1] + f_data[i - 2];
    }
}

int _n[205], _l[205], _r[205];
int _cnt;

inline void push(int n, int l, int r)
{
    debug("push %d %d %d\n", n, l, r);
    ++_cnt;
    _n[_cnt] = n;
    _l[_cnt] = l;
    _r[_cnt] = r;
}

inline void _query(int n, long long l, long long r)
{
    if (n <= k) {
        push(n, l, r);
        return;
    }
    if (l == 1 && r == f_len[n]) {
        push(n, 0, 0);
        return;
    }
    long long t = f_len[n - 1];
    if (r <= t) {
        _query(n - 1, l, r);
    } else if (l > t) {
        _query(n - 2, l - t, r - t);
    } else {
        _query(n - 1, l, t);
        _query(n - 2, 1, r - t);
    }
}

inline long long query(int n, long long l, long long r)
{
    if (n < k - 1) {
        return 0;
    }
    if (n <= k) {
        return sum[n - k + 1][r - len_s + 1] - sum[n - k + 1][l - 1];
    }
    _cnt = 0;
    _query(n, l, r);
    if (_cnt == 1) {
        // assert(_n[1] > k);
        if (_n[1] <= k) {
            assert(_n[1] >= k - 1);
            return sum[_n[1] - k + 1][_r[1] - len_s + 1] - sum[_n[1] - k + 1][_l[1] - 1];
        } else {
            return f_data[_n[1]].ans;
        }
    } else if (_cnt == 2 && _n[1] <= k && _n[2] <= k) {
        return sum2[_n[1] - k + 1][_n[2] - k + 1][_r[2] + f_len[_n[1]] - len_s + 1]
                - sum2[_n[1] - k + 1][_n[2] - k + 1][_l[1] - 1];
    } else {
        long long ret = 0;
        int L = 1, R = _cnt;
        if (_n[1] <= k) {
            // 1, 1-2
            // assert(_n[2] > k);
            ret += cnt2[_n[1] - k + 1][f_data[_n[2]].l_id] - sum2[_n[1] - k + 1][f_data[_n[2]].l_id][_l[1] - 1];
            ret -= cnt[f_data[_n[2]].l_id];
            L = 2;
        }
        if (_n[_cnt] <= k) {
            // (_cnt-1)-_cnt, _cnt
            // assert(_n[_cnt - 1] > k);
            ret += sum2[f_data[_n[_cnt - 1]].r_id][_n[_cnt] - k + 1][_r[_cnt] + f_len[f_data[_n[_cnt - 1]].r_id + k - 1] - len_s + 1];
            ret -= cnt[f_data[_n[_cnt - 1]].r_id];
            R = _cnt - 1;
        }

        int i;
        for (i = L; i <= R; i++) {
            // assert(_n[i] > k);
            ret += f_data[_n[i]].ans;
        }

        for (i = L; i < R; i++) {
            ret += cnt2[f_data[_n[i]].r_id][f_data[_n[i + 1]].l_id];
            ret -= cnt[f_data[_n[i]].r_id];
            ret -= cnt[f_data[_n[i + 1]].l_id];
        }
        return ret;
    }
}

int main()
{
    freopen("str1.in", "r", stdin);
    freopen("str.out", "w", stdout);

    scanf("%s", a);
    scanf("%s", b);
    scanf("%s", s);

    len_s = strlen(s);

    f[0] = a, f[1] = b;

    int i;
    for (i = 2; ; i++) {
        f[i] = f[i - 1] + f[i - 2];
        debug("f %d = %s\n",i,f[i].c_str());
        if ((int)f[i - 1].length() >= len_s) {
            break;
        }
    }

    k = i;

    init();

    f_len[0] = f[0].length();
    f_len[1] = f[1].length();
    for (i = 2; i <= 100; i++) {
        f_len[i] = f_len[i - 1] + f_len[i - 2];
    }

    scanf("%d", &q);
    for (i = 1; i <= q; i++) {
        int n;
        long long l, r;
        scanf("%d%I64d%I64d", &n, &l, &r);
        if (r - l + 1 < len_s) {
//            cout<<l<<" "<<r<<" "<<r-l+1<<" "<<len_s<<endl;
            puts("0");
        } else {
            printf("%I64d\n", query(n, l, r));
        }
    }
    return 0;
}
时间: 2024-10-23 10:54:46

9.5模拟赛的相关文章

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y):

9.14 模拟赛

模拟赛第三弹~ T1 题意:给你一个数列,要求删掉任意一种整数,使得剩下的新数列中连续的相等的数最多 例如 2 7 3 7 7 3 3 7 7 5 7,删掉3以后剩的7有四个连续的,最多 思路:暴力枚举去掉哪个......这算是一道水题吧 代码丢了...... TAT T2 题意:有n本书,每本书有宽度和高度.现在你有无数个书架,每个书架的宽度为w,高度由最高的书决定 问在书本按顺序放的情况下,总的书架高度最小是多少 思路:dp,dp[i]表示做到第i本书时的最小高度和. 每次先找到能以编号j的

2014-9-9 NOIP模拟赛

东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时. T4 Tarjan的板子题,好久没写,中间出现了一些小错误 ①是尽管有双向边,Tarjan函数中也不必排除双向边 ②Tarjan算法有时候不能一步完成,需要做最多n次,用循环解决 ③问题是关于这个题目的虽然输入n代表有n个点,但是下面的连边中有些点根本没出现过,所以设一个数组记录有效点. Pro

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

20161027模拟赛解题报告

20161027模拟赛解题报告 By shenben T1 数学题 模拟即可. 注意开long long T2 技巧题 图片为本题第一张图.(无奈,图传不上来) 首先第一问图中的“Y 字形”的数量,这么简单,在此不细讲. 详见代码 O(n)累加一下就好了 主要说说第二问怎么搞 预处理 每个点分别与其他那些点相连 权值为第1,2,3大(若没有2,3大,就忽略).记录一下权值与对应的点的标号.目的是方便下面的判断. 枚举入度>=3的点,即点B(有多个) 再枚举点B相连的D点(不是点A,C). Ste

[GRYZ]寒假模拟赛

写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优(le)美(se)的文字加工后,有故事有题目有人物有奸情的模拟赛正式呈上. 我是正文 题目名 GRYZ娱乐时刻 GRYZ追击时刻 GRYZ就餐时刻 源文件 hyxzc.cpp/c/pas clikar.cpp/c/pas eat.cpp/c/pas 输入文件 hyxzc.in clikar.in ea

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻