首页 > 其他分享 >CSP_J 暑假清北学堂集训 第一天

CSP_J 暑假清北学堂集训 第一天

时间:2023-07-11 18:56:24浏览次数:32  
标签:sort int top 集训 tail heap 清北 CSP size

数据结构 :
数据结构:1.怎么写;2.怎么用
一、数组
1.负数下标是可以定义的:
1.变量局部开在栈空间里
2.数组全局变量开在堆空间里
3.数组越界会出现一些奇奇怪怪到小问题

处理方法:
int a[1000010];
int *b = a + 500000;
结果:
b[-233] -> a[500000-233];
b[-500000 ~ 500000]; 
栈:stack(简单一些)
queue<int> name
priority_queue<int> q;
priority_queue<int> heap_l;
priority_queue<int> heap_r;
map:
第一个int代表下标类型 
第二个int代表元素类型 
实现:
map<int,int> name;
操作:
map<string,int> 强过结构体呀
algorithm:


max(a,b); max(max(a,b),c)
min(a,b); min(min(a,b),c)
int c;
long long d;
min(c,d) 错误!必须同样类型 
swap(a,b)换 


sort排序(好东西):
typename (int) a[100];
cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
sort(z + 1, z + n + 1); //把a[1] 到 a[n] 从小到大排序 (nlogn)
从大到小: 
bool cmp(int a,int b)//返回ab后a是否应该排在b前面 
{
    return a > b; 
}
sort(a + 1, a + n + 1,cmp);//从大到小 (相反数排序)
reverse(a + 1, a + n + 1);//翻转数组 
unique:
unique(a + 1, a + n + 1) ; 把a[1] ~ a[n] 去重 but必须把数组排完序才能使用 
int m = unique(a + 1, a + n + 1) - a - 1;去重完有几个数 

 



random_shuffle:
random_shuffle(a + 1, a + n + 1) 把a[1] ~ a[n] 随机打乱 

merge_sort: 
归并排序根本思想: 分治,切几刀,分别排序,直到只剩一个数字,停下 (分)  比较两数列的最小值:min(a1,b1) min(a1,b2) ……(治) 


merge_sort(int l, int r){
    long long ans = 0;
    if(r == l) return;啥也不用干 
    int m = (l + r) / 2;
    ans += merge_sort(l , m);左边部分 
    ans += merge_sort(m + 1 , r);右边部分
    int pl = l;左边第一个数的下标 
    int pr = m + 1;右边第一个数的下标 
    for(int i = l; i <= r; i++){
        if(pl > m) b[i] = a[pr],pr++;左边没数了 
        else if(pr > r) b[i] = a[pl],pl++;右边没数了 
        if(a[pl] < a[pr]) b[i] = a[pl],pl++;左边少 
        else b[i] = a[pr],pr++,ans += m - p + 1;右边少 
    }
    for(int i = l; i <= r; i++) a[i] = b[i];抄回来 
    return ans;
}
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    merge_sort(1,n);
} 

前缀和:
sum[i] = a1 + a2 + a3 + …… + ai
       = a1 + a2 + …… + ar - a …… - al-1 
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i];
cin >> m;
for(int i = 1; i <= m; i++){
    int l , r;
    cin >> l >> r; 
    cout << sum[r] - sum[l - 1];
}
注意:
1.用“\n”不用endl 差距真的很大(4s多)
2.快读代码实现:
int read(){
    int x = 0;
    char c = '?';
    while(c < '0' || c > '9') c = getchar();
    while(c > '0' && c < '9'){
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x;
} 

 

3.不用快输,用cout就行 
4.scanf用来 格式化: scanf("%d-%d-%d", &year, &month,&day);
5.速度排序:/ %  <   x   <  + -  <  & | ^ << >>   <  <= >= == != 
6.x << y == x * 2 ^ y
7.x >> y == x / 2 ^ y
map<string,string> b; 
map当无限大数组用就行啦 /se
a[1] = 2; log级别速度 
a[-2333] = 9 log级别速度 (所有) 
b["hello"] = "world";
想怎么用就怎么用 
慢! 
不同类型间的关系可以用
 
线性结构:
struct shouxie_queue{//队列 
    int z[1000000]; 
    int tail;
    int head;
    shouxie_queue(){//构造函数 
        tail = 1;
        head = 0;
        memset(z,0,sizeof(z));
        //memset(z,-1,sizeof(z))
        //memset(z,0x3f,sizeof(z))
    }
    void pop(){
        head++;
    }
    void push(int x){
      /*while(head <= x && x < z[tail])    单调递增 
            tail --;
        while(head <= x && x > z[tail])
            tail --;*/ 
        tail++;
        z[tail] = x;
    }
    int front(){
        return z[head];
    }
    int size(){
        return tail - head + 1;
    }
};
struct heap{//大根堆(二叉树) 
    int a[100000];
    int n;
    int top(){
        return a[1];
    }
    int size(){
        return n;
    }
    void push(int x){
        n++;
        a[n] = x; 
        int p = n;
        while(p != 1){//根节点为一 不等于才需要换 
            int f = p / 2;
            if(a[f] < a[p]){
                swap(a[f], a[p]);
                p = f;
            }
            else break;
        }
    }
    void pop(){//弹出 每个节的值 都要大于子点的值  
        a[1] = a[n];
        n--;
        int p = 1;
        while(p * 2 <= n){
            int pp = 2 * p;//左儿子 
            if(pp + 1 <= n && a[pp + 1] > a[pp]) pp = pp + 1;
            if(a[p] < a[pp]){
                swap(a[p], a[pp]);
                p = pp;
            }
            else break;
        } 
    }
};//每个节的值 都要大于子点的值 
//题目:给出序列,求每个区间的中位数 ll a[100000];
int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int l = 1; l <= n; l++){
        heap_l.push(a[l]);
        cout << 中位数 << endl;
        int median = a[l];//当前中位数 
        for(int r = l + 1;r <= n; r++){
            if(a[r] > median) heap_r.push(-a[r]);
            else heap_l.push(a[r]);
            while(heap_l.size() > heap_r.size() + 1){
                int v = heap_l.top();
                heap_l.pop();
                heap_r.push(-v);
            }
            while(heap_r.size() > heap_l.size() + 1){
                int v = heap_r.top();
                heap_r.pop();
                heap_l.push(-v);
            }
            if(heap_l.size() > heap_r.size()) median= heap_l.top();
            else if(heap_l.size() < heap_r.size()) median= heap_r.top();
            else median = (heap_l.top() - heap_r.top) / 2;
            cout << median;
        }
    }

 

 

标签:sort,int,top,集训,tail,heap,清北,CSP,size
From: https://www.cnblogs.com/wan169961/p/17545667.html

相关文章

  • CSP_J 暑假清北学堂集训 第二天
    倍增算法:(只往上和)f[i][j]:从ai开始的2的j次方个数的最大值=max(ai+ai+1+......+ai+2^j-1)f[i][0]=ai//切一刀:f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1])Q:一个区间内的最大值n<=100000思路:l=2,r=5f[2][2];如果恰好是2的次方......
  • 202307 成都集训游记
    题单内容总结:20230708数据结构-金天Treasure-HDU7144Fightandupgrade-HDU7181长存不灭的过去、逐渐消逝的未来-LGP5067DataStructureQuiz-Baekjoon18756小球进洞-LOJ578DuffisMad–CF587FBreadboardCapacity-CF1368H2BearandBowling-CF......
  • CSP_J 暑假清北学堂集训
    图论:图的概念由点和边构成的元素边:如果边都有方向我们叫它有向图没方向叫无向图一、图的一些基本概念:1.度:一个顶点连了几条边就是它多少度2.有向图里的入度和出度:连向自己的度就是入度往外连得就是出度3.有向图里的自环:既是入度又是出度4.路径:只要沿着边走叫做路径如:1->2......
  • PMP®证书增持 CSPM-2证书,到这办理真便捷
    2023年6月起,持有PMP®证书的朋友可以直接增持一个同等级证书CSPM-2,不用重新考试,不用重新学习,原PMP®证书不影响正常使用,相当于多了一个国标项目管理领域的证书。 第一步·准备资料 1、填写能力评价表2、提供2张2寸蓝底彩照(电子版另外收10元打印费)3、提供PMP®证书电子版1份4、快......
  • 二中集训游寄
    Day0书接上回休业式,退役寄。upd:复活了。Day1(7.4)模拟赛,\(100+10+20+20=150\),总共\(45\)位巨佬,我\(10/46\),单调队列了\(35\)人,好耶!今天比较符合NOIP2022,老师说1=线120左右,我1=了?!今天没有数据结构,好耶!这次似乎不止QZ的,还有CX、YW的,有新高二,有新高一,有新初三......
  • CW暑假集训
    集训模拟赛的题解应该都在CWOI杂题里。主要就是题目的记录?不太想写游记。简单题不会写。7.7考试,考得依托。7.8很趣味的数据结构!感觉很有集训那味啊,就是前面讲一会简单的东西然后突然上强度。gym100739E.LifeasaMonster还是挺简单。套路地把切比雪夫距离转成曼哈顿......
  • 20230710巴蜀暑期集训测试总结
    T1打个不太暴的暴力但是爆了。只对了subtask1,不清楚发生了什么。先建出Kruscal重构树,对每个询问二分答案,判断就用暴力启发式合并T2打了一个\(20pts\)dp。第一步没有想到,每怎么见过这种题。将问题转化为满足\(\foralli,x_i\leA_i,x_i\leB_i\)的序列\(x\)个数。枚......
  • UOJ #37. [清华集训 2014] 主旋律
    UOJ传送门考虑dp。设\(f_S\)为点集\(S\)构成强连通分量的方案数。容易想到容斥。设\(ed_S\)为\(S\)内部连边数,那么\(f_S\)就是总的方案数\(2^{ed_S}\)减去构成的不是强连通分量的方案数。我们考虑如果整个图不是一个强连通分量,那么缩点后一定有\(>1\)个分量,并......
  • 暑假QBXT集训01
    Day1有向无环图一种特殊的有向图,没有任何环,简写为DAG。对于这种图,我们就有“拓扑序”。拓扑序不是唯一解。拓扑排序流程:每次删去一个没有入度的点加入拓扑序中,如此重复下去即可。P1807最长路题目描述:设\(G\)为有\(n\)个顶点的带权有向无环图,\(G\)中各个顶点的编......
  • CSP - J 训练营
    Day1数据结构含义:拿来存储数据的结构常见形式:1.变量只能存一个数。2.数组所有数组都开在全局变量。堆空间全局变量在堆空间。空间为$256M$,可以存$6.4×10^7$个int。栈空间局部变量在栈空间。空间为$64KB$,只能存$1.6×10^5$个int。......