【学长虐学弟欢乐赛系列】Round2

第二套题

出题人:Lavender

神犇地址:Lavender学姐的blog

试题下载地址

数据下载地址

T1 matrix

**主要题干:**Neo 会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩

和用鼠标乱点之类的事,甚至会一脚踢掉电源……这些事有的会让做

这件事的这段时间内 CPU 使用率增加或减少一个值;有的事还会直

接让 CPU 使用率变为一个值。

当然 Neo 会询问:在之前给出的事件影响下, CPU 在某段时间内,

使用率最高是多少。有时候 Neo 还会好奇地询问,在某段时间内 CPU

曾经的最高使用率是多少。

为了使计算精确,使用率不用百分比而用一个整数表示。 不保

证 Neo 的事件列表出了莫名的问题,使得使用率为负……………… (也

就是说序列中的数可能为负数)

Q X Y:询问从 X 到 Y 这段时间内 CPU 最高使用率

A X Y:询问从 X 到 Y 这段时间内之前列出的事件使 CPU 达到过的最高

使用率

P X Y Z:列出一个事件这个事件使得从 X 到 Y 这段时间内 CPU 使用率增

加 Z

C X Y Z:列出一个事件这个事件使得从 X 到 Y 这段时间内 CPU 使用率变

为 Z

详情请见COGS1904CPU监控

姿势奇怪的线段树

5小时全都拿来写这一个题

别的题连暴力都没写

甚至这个题暴力也没写

结果最后还是挂了

不想说什么了…

虽然感觉所有题就会第一题标算但是还是没写出来

直接贴代码

//std by Lavender
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define maxn 100001
#define inf -1<<31
using namespace std;
struct node{int maxx,pmaxx,add,padd,c,pc;} a[maxn*4];
int b[maxn],n,m,l,r,z;char st[5];
inline int read()
{
    char c=getchar();int bj=1,result=0;
    while (c!=‘-‘&&!(c<=‘9‘&&c>=‘0‘)) c=getchar();
    if (c==‘-‘) bj=-1,c=getchar();
    while (c<=‘9‘&&c>=‘0‘) result=result*10+c-‘0‘,c=getchar();
    return result*bj;
}
inline void update(int now)
{
    a[now].maxx=max(a[now*2].maxx,a[now*2+1].maxx);
    a[now].pmaxx=max(a[now*2].pmaxx,a[now*2+1].pmaxx);
}
inline void build(int now,int left,int right)
{
    a[now].c=a[now].pc=inf;
    a[now].add=a[now].padd=0;
    if (left==right) {a[now].maxx=a[now].pmaxx=b[left];return;}
    int mid=(left+right)>>1;
    build(now*2,left,mid);
    build(now*2+1,mid+1,right);
    update(now);
}
inline void pushdown(int now,int left,int right)
{
    for (int i=0;i<=1;i++)
    {
        int k=now*2+i;
        a[k].pmaxx=max(max(a[k].pmaxx,a[k].maxx+a[now].padd),a[now].pc);
        if(a[k].c==inf)
        a[k].padd=max(a[k].padd,a[k].add+a[now].padd);//!
            else a[k].pc=max(a[k].c+a[now].padd,a[k].pc);
        if (a[now].add)
        {
            if (a[k].c!=inf) a[k].c+=a[now].add;
                else a[k].add+=a[now].add;
            a[k].maxx+=a[now].add;
        }
        if (a[now].c!=inf)
        {
            a[k].maxx=a[k].c=a[now].c;
            a[k].add=0;
        }
        a[k].pc=max(a[k].pc,a[now].pc);
        a[k].pc=max(a[k].pc,a[k].c);
        a[k].padd=max(a[k].padd,a[k].add);
    }
    a[now].c=a[now].pc=inf;a[now].add=a[now].padd=0;
}
inline int query(int now,int left,int right)
{
    if (left!=right) pushdown(now,left,right);
    if (l<=left&&r>=right)
        return st[0]==‘Q‘?a[now].maxx:a[now].pmaxx;
    int mid=(left+right)>>1,result=inf;
    if (l<=mid) result=query(now*2,left,mid);
    if (r>mid) result=max(result,query(now*2+1,mid+1,right));
    return result;
}
inline void  change(int now,int left,int right)
{
    if (left!=right) pushdown(now,left,right);
    if (l<=left&&r>=right)
    {
        if (st[0]==‘P‘)
        {
            a[now].add+=z;a[now].padd+=z;
            a[now].maxx+=z;
        }
        else a[now].pc=a[now].maxx=a[now].c=z;
        a[now].pmaxx=max(a[now].pmaxx,a[now].maxx);
        return;
    }
    int mid=(left+right)>>1;
    if (l<=mid) change(now*2,left,mid);
    if (mid<r) change(now*2+1,mid+1,right);
    update(now);
}
int main()
{
    freopen("matrix.in","r",stdin);
    freopen("matrix.out","w",stdout);
    n=read();
    for (int i=1;i<=n;i++) b[i]=read();
    build(1,1,n);
    m=read();
    while (m--)
    {
        scanf("%s",st);l=read();r=read();
        if (st[0]==‘Q‘||st[0]==‘A‘)     printf("%d\n",query(1,1,n));
        if (st[0]==‘P‘||st[0]==‘C‘)
        {
            z=read();
            change(1,1,n);
        }
    }
}

T2

主要题干:在未来, 地球已经不适合人类居住,唯有通过虫洞进入未知的世

界寻找新的宜居星球。机智幽默的机器人 tars 勇敢的穿越了黑洞得到

了可以拯救人类的重要数据。 这些数据是由二进制存储的。不幸的是,

五维空间生物为了考验库珀,要求 tars 将数据加密。加密后的数据仍

旧是一组 n 个二进制数。 定义

//std by Lavender
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define  LL long long
using namespace std;
const int  maxn=12010,maxb=120;
const int  maxbit=31;
const int  maxm=12010*32+10;
int  a[maxb][maxn],root[maxn],b[maxb],size[maxm],son[maxm][2],sum[maxn];
int  block,tot=0,n,m,bn;
inline int  query(int  left,int  right,int  value)
{
    int  ans=0;
    left=root[left+1];right=root[right+1];
    for (int  i=maxbit;i>=1;i--)
    {
        int  k=(value>>(i-1)&1)^1;
        if(size[son[right][k]]-size[son[left][k]]==0) k^=1;
            else ans+=1<<(i-1);
        right=son[right][k];left=son[left][k];
    }
    return ans;
}
inline void add(int  now,int  value)
{
    int  old=root[now-1];root[now]=++tot;now=root[now];
    for (int  i=maxbit;i>=1;i--)
    {
        int  k=(value>>(i-1))&1;
        size[now]=size[old]+1;
        son[now][k^1]=son[old][k^1];
        son[now][k]=++tot;
        now=son[now][k];old=son[old][k];
    }size[now]=size[old]+1;
}
inline int  read()
{
    char c=getchar();int  bj=1,result=0;
    while (c!=‘-‘&&!(c<=‘9‘&&c>=‘0‘)) c=getchar();
    if (c==‘-‘) bj=-1,c=getchar();
    while (c<=‘9‘&&c>=‘0‘) result=result*10+c-‘0‘,c=getchar();
    return result*bj;
}
inline int  pos(int  x)
{
    return (x-1)/block+1;
}
int main()
{
    int  i,j,k,lastans=0,l,p,x,y,ans,bx,by,tx,ty;
    freopen("intersteller.in","r",stdin);
    freopen("intersteller.out","w",stdout);
    n=read();m=read();
    add(1,0);
    for (i=1;i<=n;i++)
    {
        sum[i]=sum[i-1]^read();
        add(i+1,sum[i]);
    }
    block=floor(sqrt(n)); bn=ceil(n/(double)block);
    for (i=1;i<=bn;i++) b[i]=(i-1)*block+1;
    for (i=1;i<=bn;i++)
        for (a[i][b[i]-1]=1<<31,j=b[i];j<=n;j++)
            a[i][j]=max(a[i][j-1],query(b[i]-2,j-1,sum[j]));
    while (m--)
    {
        tx=read();ty=read();
        x=(int)((tx+(LL)lastans)%n+1);
        y=(int)((ty+(LL)lastans)%n+1);
        if (x>y) swap(x,y);
        bx=pos(x);by=pos(y);
        ans=a[bx+1][y];
        for (i=x;i<=min(bx*block,y);i++)
            ans=max(ans,query(i-1,y,sum[i-1]));
        lastans=ans;
        printf("%d\n",(int)ans);
    }
}

T3 Lord

这是官方防AK题= =

完全不会题解也听不懂

主要题干: Legolas 不仅颜好, 而且是一只聪明的精灵。他在做一道题 w

一个数 n 被称为半完美数当且仅当存在三个整数 a、 b、 c,使得

b>1,1≤c<a,n=c×ab.对于给定的 L,R,求区间[L,R]中半完美数的个数。

相信不等他开口求助你就能把他做出来.

请直接暴力枚举或者搜索骗分.(我没写但是别人写了能40分= =)

官方题解太长了QAQ各种化简什么的完全不会OTZ

还用到了莫比乌斯反演QAQ

官方题解请看学姐的blog…

标程能看懂请随便看

看懂之后请务必在联系蒟蒻 求教ingQAQ

//std by Lavender
#include <cstdio>
#include <vector>
#include <cstring>
#include<iostream>
#define sz(c) (int)(c).size()
#define rep(i,j,k) for (int i=j;i<=k;++i)

using namespace std;

typedef long long LL;

const LL N=(LL)1e18;
const int N2=1e9,N3=1e6,N4=31622;

LL gcd(LL a,LL b){
    return b?gcd(b,a%b):a;
}

int sqrt2(LL x){
    int l=1,r=N2,ans=-1;
    while (l<=r){
        int mid=l+r>>1;
        if ((LL)mid*mid<=x) ans=mid,l=mid+1;
        else r=mid-1;
    }
    return ans;
}

int sqrt3(LL x){
    int l=1,r=N3,ans=-1;
    while (l<=r){
        int mid=l+r>>1;
        if ((LL)mid*mid*mid<=x) ans=mid,l=mid+1;
        else r=mid-1;
    }
    return ans;
}

class SemiPerfectPower{
    private:
        int *cnt[N4+10];
        vector<int> fac[N4+10];
        bool p2[N3+10],p3[N4+10];
        LL calc(LL n){
            LL ans=0;
            for (int c=1;(LL)c*c*c<n;++c)
                if (p2[c]) ans+=sqrt2(n/c)-c;
        //  cout<<ans<<endl;
            for (int b=1;(LL)b*b*b*b<n;++b)
                if (p3[b])
                    for (int k=1;k*k*k<=b;++k){
                        int g=gcd(b,k*k),b_=b/g,k_=k*k/g;
                        if (!p2[b_]) continue;
                        int miny=b,maxy=sqrt3(n/b),size=sz(fac[b_]),all=1<<size;
                        rep(i,0,all-1){
                            int d=1,mu=1;
                            rep(j,0,size-1) if (i>>j&1) d*=fac[b_][j],mu*=-1;
                            ans+=mu*(cnt[d][maxy/k_/d]-cnt[d][miny/k_/d]);
                        }
                    }
            return ans;
        }
    public:
        SemiPerfectPower(){
            memset(p2+1,true,sizeof p2);
            memset(p3+1,true,sizeof p3);
            for (int i=2;i*i<=N3;++i){
                int t=i*i;
                for (int j=t;j<=N3;j+=t) p2[j]=false;
            }
            for (int i=2;i*i*i<=N4;++i){
                int t=i*i*i;
                for (int j=t;j<=N4;j+=t) p3[j]=false;
            }
            rep(i,1,N4){
                int l=N3/i;
                cnt[i]=new int[l+1];
                cnt[i][0]=0;
                rep(j,1,l) cnt[i][j]=cnt[i][j-1]+p2[i*j];
            }
            rep(i,2,N4) if (fac[i].empty())
                for (int j=i;j<=N4;j+=i) fac[j].push_back(i);
        }
        LL count(LL l,LL r){
            return calc(r)-calc(l-1);
        }
}solve;
int main(){
    freopen("lord.in","r",stdin);
    freopen("lord.out","w",stdout);
    LL l,r;
    scanf("%I64d%I64d",&l,&r);
    printf("%I64d\n",solve.count(l,r));
    return 0;
}

这次比赛告诉我们不要老是盯着一个题搞标算请老老实实写暴力QAQ

我以后一定要好好写暴力QAQ

时间: 2024-08-04 01:52:43

【学长虐学弟欢乐赛系列】Round2的相关文章

【学长虐学弟欢乐赛系列】Round4

第四套题 出题人:Bakser 神犇地址:Bakser学长的blog 试题下载地址 数据下载地址 T1 LICS 有一天 Bakser 在做数学题,对于一道题他验算了 n 遍,得到了 n 个结果.无聊的他将这 n 个结果排成了一个圆环,无聊的他又想求这 个环的最长上升子序列. 请你回答这个无聊的问题. 所谓环的上升子序列,指的是从某个位置开始, 按照顺时针顺序 读这个环,得到一个线性序列,它的上升子序列也是这个环的上升子 序列.最长上升子序列是它们中最长的一个. 输入格式: 第一行一个数 n,表

【学长虐学弟欢乐赛系列】Round1

第一套题 出题人:Time-Machine 目标地址:Time-Machine学长的blog 试题下载地址 数据下载地址 据说题目难度T3<T1<T2 这不科学QAQ 光荣爆零QwQ奇怪的错误是说不尽的 T1 Hope 主要题干:首先你列出了两个长度为 n 的数表 a[],b[],其中每个数 a[i]用二进制表示一个集合.例如数字 5=( 101) 2 就代表集合{1,3}.第 i 次实验会准备一个小盒子,里面装着集合 a[i]所有非空子集的纸条,然后苗木诚会从中摸一张纸条.如果满足他摸的这张

【学长虐学弟欢乐赛】Round3

第三套题 出题人:faebdc 金牌爷的题这么神竟然还有学长AK了QAQ 题目全都是CF上的 T1 D T2 E T3 D 神犇地址:faebdc学长的blog 试题下载地址 数据下载地址 话说题解的ppt用色果然还是faebdc神犇的常用配色= = 虚化色块喷涂拼接 T1 CF305D Olya ans Graph 原题可以自己去CF找 学长给的是翻译后题面 [问题描述] Olya 有一张 n 个点. m 条边的有向无权图, 所有点从 1 到 n 标号. 现在 Olya 想知道 有多少种添加有

2014考研复试漫谈 --致考研刚刚结束的学弟学妹

回忆1( 成绩出来前): 去年考完研的时候,自己对于考上没有多大的把握,所以,考完研决定要做两手准备:一边准备复习,一边为找工作而准备着. 好像大学过的最紧张的日子莫过于此,因为眼看着周围的同学都纷纷出去找工作,并且有的同学还找到了不错的工作.自己现在考研占据了大量的时间,已经错过了所谓的找工作的黄金期,同时觉得自己的专业技能也不是很强,所以很担心自己万一考不上了,工作也不好找.那就真成了没人要的孩子了.没有什么比前途未卜更令人担忧了...所以,大过年的,我还在看王道新出的一本面试宝典,在巩固自

欢乐赛解题报告

~~一场不欢乐的欢乐赛 时间分配::T1做的时候还可以,大约三十分钟写了个深搜(鬼知道我为啥不用广搜,大概是因为快半个月没写了)写完后去研究第二题,刚开始以为是贪心,很快写了出来,但是自己推了一会举出了反例.于是自己想了很多方法,但是都是基于贪心,写了一个多小时,写炸了,没办法又改成了贪心.第三题并不会,然后搜索大法过了一个点,(输出-1也是一个点) 整体感觉::还是太弱,T1是会的,但是还是没做对,大概是独立做题少的缘故吧,平常做题都没有思考太多时间.T2贪心T3暴力,貌似自己啥都不会.到现在

程序员的奋斗史(四十六)——大学断代史(十)——给学弟学妹们的忠告——终结篇

文/温国兵 「写在前面」 大学断代史终于要完结了,就像一条再长的路总有终点一样.该系列文章前前后后写了一两个月,也该收尾了,至于收尾的文章,想了想,决定写写自己对学弟学妹的忠告.本篇文章以话题的形式呈现. 「关于专业」 我相信大多数的读者在高考填志愿都不知道软件工程或者计算机专业是做啥的,稀里糊涂就踏上了这条IT不归路.身处小乡村,消息相对闭塞,能使用电脑都是奢侈的事情,这就是当初我高考后的境况,相信现在有很大的改变.如果你对IT行业抱有一番热情,恭喜你,选对了好专业,好好学,今后的路错不了.如

对学弟学妹的建议

在大学这四年我感觉自己是个失败者,在大学即将结束时留下了许多的遗憾.希望学弟学妹们能利用好大学四年,不能说没有遗憾,遗憾尽量的少一些吧. 学会利用大学里的资源. 老师.图书馆.身边的同学以及师兄.师姐他们都是你大学期间有形的宝贵资源.老师.师兄和师姐他们是你的长辈,能为你指导未来的方向和解决你大部分的学习和生活上的一些困惑.图书馆是你课下学习.扩展眼界.阅读各种杂书的好地方.身边的同学和你有着很多的相似点,他们也许和你有着相同的困惑,在大学期间把握和同学在一起的时光,因为他们有可能是你一辈子的朋

写给即将毕业的学弟学妹们!

1.Spring Security 目前支持认证一体化如下认证技术: HTTP BASIC authentication headers (一个基于IEFT  RFC 的标准) HTTP Digest authentication headers (一个基于IEFT  RFC 的标准) HTTP X.509 client certificate exchange  (一个基于IEFT RFC 的标准) LDAP (一个非常常见的跨平台认证需要做法,特别是在大环境) Form-based auth

11th 回忆整个学期——告学弟学妹

告诉后来的学弟学妹,不要因为艰难而却步,坚持下去才知道,山的对面是什么.很多东西或许一开始看起来是无用,甚至无意义的,但是努力去做,你才知道价值所在.不要等一切结束了,才懂得自己错过了什么.