数据结构测试2 on 2019.9.25

又是一天的数据结构,但今天直接爆炸,1题和3题都写挂了200->0。

T1 abnormal

一开始想的是线段树,但是自己感觉维护不来,果断放弃线段树。这时又想到离线的莫队做法,本以为这道题稳了,结果最后还是打炸了。题面意思都搞错了,真的是个傻逼。

这道题对于莫队来讲就是最简单的莫队,用一个数组cnt来维护每个魅力值的出现次数即可,但注意在统计出现次数的时候,还是要加注意,因为题目中定义的不正常团伙是只能出现2次,所以少于两次的和超过两次的都要累加他们的贡献。需要小小的特判。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
struct node{
    int l,r,id;
    long long ans;
}mo[maxn*4];
int belong[maxn];
int block;
bool cmp(node a,node b){
    return (a.l/block)^(b.l/block)?a.l<b.l:(((a.l/block)&1)?a.r<b.r:a.r>b.r);
}
int cnt[maxn];
long long ans;
int a[maxn];
int vis[maxn];
inline void add(int x){
    cnt[a[x]]++;
    if(cnt[a[x]]>3) ans+=a[x];
    else if(cnt[a[x]]==3) ans+=a[x]*cnt[a[x]];
    else if(cnt[a[x]]==2) ans-=a[x];
    else ans+=a[x];
}
inline void del(int x){
    cnt[a[x]]--;
    if(cnt[a[x]]>2) ans-=a[x];
    else if(cnt[a[x]]==2) ans-=3*a[x];
    else if(cnt[a[x]]==1) ans+=a[x];
    else ans-=a[x];
}
int n,m;
long long all[maxn];
int main(){
    scanf("%d%d",&n,&m);
    block=sqrt(n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        belong[i]=(i-1)/block+1;
        mo[i].id=i;
    }
    int l=1,r=0;
    for(int i=1;i<=m;i++) scanf("%d%d",&mo[i].l,&mo[i].r);
    sort(mo+1,mo+1+m,cmp);
    //for(int i=1;i<=m;i++) printf("%d %d\n",mo[i].l,mo[i].r);
    for(int i=1;i<=m;i++){
        while(l<mo[i].l) del(l++);
        while(r>mo[i].r) del(r--);
        while(l>mo[i].l) add(--l);
        while(r<mo[i].r) add(++r);
        all[mo[i].id]=ans;
    }
    for(int i=1;i<=m;i++) printf("%lld\n",all[i]);
    return 0;
}

T2 irregular

待改 dsu on tree

T3 unnormal

中位数?直接大力平衡树。但是最后全wa?为什么,longlong乘的时候不乘1ll见祖宗。

但我唯一会的平衡树就是splay,splay常数又过大,这道题来讲最后一个点卡splay,怎么卡都卡不过。

90分代码如下(加了若干优化还是过不了):

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define Ri register int
#define sswap(x,y) x^=y^=x^=y;
template <class T> T mmin(T x,T y){return(x)<(y)?(x):(y);}
template <class T> T mmax(T x,T y){return(x)<(y)?(y):(x);}
template <class T> T lowbit(T x){return ((x)&(-(x)));}
typedef long long ll;
using namespace std;
namespace io{
    const int MT=5e7;
    char buf[MT];ll c,sz;
    void begin(){c=0;sz=fread(buf,1,MT,stdin);}
    template<class T>
    inline bool read(T &t)
    {
        while(c<sz&&buf[c]!=‘-‘&&(buf[c]<‘0‘||buf[c]>‘9‘))c++;
        if(c>=sz)return false;
        bool flag=0;if(buf[c]==‘-‘)flag=1,c++;
        for(t=0;c<sz&&‘0‘<=buf[c]&&buf[c]<=‘9‘;c++)t=t*10+buf[c]-‘0‘;
        if(flag==1)t=-t;return true;
    }
}
template <typename _TpInt>
inline void write(_TpInt x)
{
    if (x<0){
        putchar(‘-‘);
        write<_TpInt>(~x+1);
    }
    else {
        if (x>9)write<_TpInt>(x/10);
        putchar(x%10+‘0‘);
    }
}
const int maxn=1e6+7;
const int inf=0x7fffffff;
const int mod=1e9+7;
int ch[maxn][2],fa[maxn],siz[maxn],cnt[maxn];
long long key[maxn];
int rt,sz;
long long fi;
long long sum;
int a,b,c,n;
long long min(long long a,long long b){
    return a<b?a:b;
}
bool check(int x){
    return ch[fa[x]][1]==x;
}
void pushup(int x){
    siz[x]=siz[ch[x][1]]+siz[ch[x][0]]+cnt[x];
}
void rotate(int x){
    int y=fa[x],z=fa[y],who=check(x);
    ch[y][who]=ch[x][who^1];
    fa[ch[y][who]]=y;
    ch[x][who^1]=y;
    fa[y]=x,fa[x]=z;
    if(z) ch[z][ch[z][1]==y]=x;
    pushup(y);pushup(x);
}
void splay(int x){
    for(int f;(f=fa[x]);rotate(x)){
        if(fa[f]) rotate((check(x)==check(f))?f:x);
    }
    rt=x;
}
void insert(int x){
    if(!rt){
        rt=++sz;
        key[sz]=x;
        siz[sz]=cnt[sz]=1;
        return;
    }
    int now=rt,f=0;
    while(1){
        if(x==key[now]){
            cnt[now]++;
            pushup(f);
            pushup(now);
            splay(now);
            return;
        }
        f=now,now=ch[now][x>key[now]];
        if(!now){
            sz++;
            fa[sz]=f;
            siz[sz]=cnt[sz]=1;
            ch[f][x>key[f]]=sz;
            key[sz]=x;
            pushup(f);
            splay(sz);
            return;
        }
    }
}
long long rnk(int x){
    int now=rt;
    while(1){
        if(ch[now][0]&&x<=siz[ch[now][0]]) now=ch[now][0];
        else{
            int tmp=siz[ch[now][0]]+cnt[now];
            if(tmp>=x) return key[now];
            x-=tmp;
            now=ch[now][1];
        }
    }
}
int main(){
    scanf("%d%d%d%d",&a,&b,&c,&n);
    insert(1);
    sum=1;
    for(int i=2;i<=n;i++){
        int wz=(i/2);
        long long mi=rnk(wz);
        fi=(long long)(1ll*a*mi+1ll*b*i+c)%mod;
        sum+=fi;
        insert(fi);
    }
    printf("%lld\n",sum);
    return 0;
}
/*
64582 34650 2040 100000
41492359064511
*/

原文地址:https://www.cnblogs.com/LJB666/p/11614644.html

时间: 2024-10-08 12:47:49

数据结构测试2 on 2019.9.25的相关文章

数据结构测试1 on 2019.9.24

T1 union 一开始我被这个题目带进去了,以为真的是并查集,但实际上此题与并查集毫无半毛钱关系. 其实我们可以先离线建好所有的图,然后把建边的时间作为他们的边权.因为两个点什么时候联通取决于它们路径上的点最晚的链接时间,也就是最大边权.而题目明摆了是一棵树,所有考虑树剖维护边权和查询最大值. 代码如下: #include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; struct node{ int nxt,to,val

2019/08/25 leetcode

2019/08/25: L230, L226, L18, L234, L23 1. L230 Kth smallest element in BST 借助 Stack 或 LinkedList inorder traveresal, LinkedList会更快 ArrayList, LinkedList, Vector, Stack  https://blog.csdn.net/iteye_11495/article/details/82618748 2. L226 Invert Binary

2019.5.25 Noip模拟测试2

原文地址:https://www.cnblogs.com/LJB666/p/10921986.html

2019.9.25 初级数据结构——树状数组

一.树状数组基础 学OI的同学都知道,位运算(对二进制的运算)比普通运算快很多.同时我们接触到了状态压缩的思想(即将0-1的很多个状态压缩成十进制的一个数,每一个二进制位表示一个状态).由于在实际做题过程当中,由于数据范围限制,我们必须采用更高效的存储.查询方法,于是树状数组应运而生. 首先我们检查传统的存储状态.对于数组的每一个下标i,其所存储的有效信息只有一个a[i](这是传统数组).而对于树状数组,我们每一位下标可以存储lowbit(i)个有效信息.这个lowbit运算一会再说.所以尽管树

2019.4.25 周四 阴有小雨

今天晚上跟朋友吃了一顿小龙虾和烧烤,然后又看了一把复联四,顺便交流了一波java技术加吹牛,very happy! 周五早上有个去亚信的面试,咨询了在那个部门工作的小伙伴,说用到kalfka和storm.天呐我也有没实际用过,那就随便自学一点点外加背几题面试题吧. 一.kalfka Apache Kafka® is a distributed streaming platform. a few concepts: --Kafka is run as a cluster on one or mor

精准测试白皮书-2019最新版

精准测试白皮书 精准测试诞生的背景 现代社会是建立在各种以计算机为基石的软件技术基础之上的.随着日新月异的需求变化,软件系统越来越复杂.很多人觉得软件开发才是重要环节,但实际上,无法对大型软件进行有效的质量把控,就无法真正构建与维护大型软件.--系统中任何一个错误都可能导致整个系统的崩溃,造成无法弥补的损失,系统的任何一个微小的修改都可能引入新的缺陷导致维护困难重重. 然而,如何从极端庞大复杂的系统中迅速及时地找到故障所在,却是行业的一大难点.目前国内软件测试基本处于两种状态:一是绝大多数企业采

【2019.9.25】Za

容斥 容斥 \(\Big|\bigcup\limits_{i=1}^nS_i\Big|=\sum\limits_{m=1}^n(-1)^{m-1}\ \sum\limits_{a_i<a_{i+1}}\Big|\bigcap\limits_{i=1}^mS_{a_i}\Big|\) 不定方程非负整数解计数 不定方程\(\sum_{i=1}^n\ x_i=m\)和\(n\)个限制条件\(x_i\le b_i\) 没有限制时 其非负整数解为\(C_{m+n-1}^{m-1}\) 相当于有\(m\)个

2019/01/25 低迷的一天

今天不分享技术,也不发表工作事情.主要是因为今天看到的2个事情有感 1.中午和同事下去吃饭,吃饭的地方是一个公共的美食城,所以就有那种吃完了的饭菜要等一会才有人收拾,恰好吃完后,隔壁2个人离去.这时候突然来了一个50岁左右的男人,着装整齐,背了个包,开始以为他是找座位,还特意看了下周围,也瞟了下我,突然他拿起别人吃完的饭菜在那里狼吞虎咽,第一次看到,也是很真实的看到,我没想到一个看起来不像缺钱的人竟然会饭都吃不起,我当时还看了他几眼,他好像知道了有点忐忑那种,手和筷子发抖,于是我马上低头看手机,

[jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)

题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 我们设$f(x)$表示最小循环节长度为x的合法序列数,那么有$ans=\sum_{d|gcd(n,m)}\frac{1}{d}f(d)$ 这是因为最小循环节为d的序列对应的环会被计算d次,比如 0101,最小循环节长度为 2(循环节为 01),其对应的环会被统计 2 次(序列 0101 与 1010)