20190303集训队选拔赛1补题报告

今天嘛,打得很糟糕,糟糕到什么程度呢,rank40

一共才55个人,我写了2题,总共尝试了5题,总共8题

写了3题及以上的有27个,剩下的都是2道和1道

小西瓜啊!!!

外因就不找了(其实也没有)

但是我知道有个原因非常重要:刷题量太少了

其他的不说了,再接再厉吧,刚才已经消沉了很久了,也放空了一会,所以开始补题吧

对了,集训队讲座补选上了(因为有的同学觉得太难退课了,感谢颜学长的劝退讲座,让我有机会一边修学分一边被虐)

这也意味着我要有一篇总结报告和三篇解题报告

解题报告要正儿八经地写

不能像平时一样

意识流解题报告

上次球球学姐说要多刷题,我还傻fufu地问刷多少

今天颤抖着点开了赵学长的南理工OJ账号

话不多说,我要使劲刷题了

AC300祭以前,挡我者被我胖揍

......赶紧补题

这题我是要吐槽的

其实我也没有资格吐槽

但是好巧啊,前几天正好写了拦截导弹那题

你懂的,我用了好久

琢磨出了dp+快速幂做法

但是n*n能过吗?你自己说?

还快速幂

我看你快速去明苑吃饭吧

气死我了

我还不太会分析时间复杂度,今天一直WA的两题也跟不会分析有关,所以,要学会分析啊!!!

其实我还是挺喜欢今天的这场比赛的,我个人觉得比cf好

起码是基于数据结构和算法的,并且单纯敲板子是不可能给你过

但是cf前三题全都是思维,思维就算了,一查题解,所有人的解题报告都几乎一个思维,对此我是很有意见的

小灯泡都亮一起去了

不现实

好的

第一题

这题的做法是树状数组

之前我是不喜欢用树状数组的,因为我感觉线段树能解决单点更新

但是仔细想想,树状数组用起来还是很爽的

是时候和这类题目做一个了断了!!!!!!!!!!!!!!!!!!!!!!!

搞了好几天的逆序对,今天遇到这题,还是搞错了,唉

其实这题跟以前的那个方法是一样的,甚至和dp的思路也是差不多的

离散化+树状数组

来分析一组数据吧

1  2  3  4  1  4

这一组数据

排序之后变成 1 1 2 3 4 4

离散化之后变成 2 3 4 6 1 5

现在让我们画好几个数组,把这些数一个一个的放进去

最后我们的sum就求出来了

每一个小格子里标的是:与前面的子序列不重复,我们能找到几个新的

比如说第6个格子:是1+2+4+1

+1是rank2的那个数字和rank6的那个数字组成的新序列:2 6

+2是rank3的那个数字(以及它的子序列)与rank6的数字组成的新序列:3 6,2 3 6

+4是rank4的那个数字(以及它的子序列)与rank6的数字组成的新序列:4 6,2 4 6,3 4 6,2 3 4 6

+1是ran6数字自己:6

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
#define re register
const int maxn = 1e5 + 100;
const int mod = 1e9 + 7;
inline int read(){
    re int x=0,f=1;char c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘) x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
struct node{
    int id;
    int val;
} a[maxn];
int c[maxn << 2], n, b[maxn];
bool cmp1(node a,node b){
    if(a.val!=b.val)
        return a.val<b.val;
    return a.id>b.id;//****
}
int lowbit(int x){
    return x & (-x);
}
int getsum(int x){
    int res = 0;
    while(x>0){
        res += c[x];
        res %= mod;
        x -= lowbit(x);
    }
    return res;
}
void update(int x,int d){
    while(x<=n){
        c[x] += d;
        c[x] %= mod;//***************
        x += lowbit(x);
    }
}
int sum(int l,int r){
    return getsum(r) - getsum(l - 1);
}
int32_t main(){
    int t;
    t = read();
    while(t--){
        n = read();
        memset(b, 0, sizeof(b));
        memset(c, 0, sizeof(c));
        for (int i = 1; i <= n;i++){
            a[i].val = read();
            a[i].id = i;
        }
        sort(a + 1, a + 1 + n,cmp1);
        for (int i = 1; i <= n;i++)
            b[a[i].id] = i;
        for (int i = 1; i <= n;i++){
            update(b[i], getsum(b[i]-1)+1);
        }
        printf("%lld\n", getsum(n));
        //for (int i = 1; i <= n;i++){
        //    cout << getsum(b[i]) << " ";
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}

可能真的是 当你开始把一个东西放在心上的时候,就会发现老是看到那个东西

比如最近看题解 到处都是快读

所以我也开始用快读啦!!!

下个星期还去活动室嘛?

去啊!!!!!!!!!!!!!!!!!!!!!!!!!

本人性别女属性脸皮厚啊

原文地址:https://www.cnblogs.com/guaguastandup/p/10468484.html

时间: 2024-08-29 20:10:23

20190303集训队选拔赛1补题报告的相关文章

2020-3-14 acm训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019 解题报告+补题报告

2020-3-15比赛解题报告+2020-3-8—2020-3-15的补题报告 2020-3-15比赛题解 训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019  A建筑(模拟) 耗时:3ms 244KB 建筑 你哥哥在最近的建筑问题突破大会上获得了一个奖项 并获得了千载难逢的重新设计城市中心的机会 他最喜欢的城市奈梅根.由于城市布局中最引人注目的部分是天际线, 你的兄弟已经开始为他想要北方和东方的天际线画一些想法

2020.4.12 个人rating赛 解题+补题报告

A. Balloons  1.题意 有n包气球,每包气球有ai个,将这n包气球以包为单位全部分给两个人,要求每人至少有一包气球且两人气球总个数不能相等.  2.题解 用结构体将n包气球的编号和气球数存起来,按每包气球个数排序后,如果第一包气球的个数不为总个数的一半,满足题意.  3.代码 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 struct node{ 5 int id,x; 6 }a[15]; 7 bool cm

2020年3月14日 BAPC2019 比赛补题报告

Inquiry I 题意: 给定一个数列, 求公式的最大值 思路: 可以维护一个前缀和 与 后缀和, 扫描一次数组, 即可求出最大值 代码: n = int(input()) lst = [*map(int, input().split())] # left 记录数组元素平方的前缀和, right 记录数组元素后缀和 left, right = 0, sum(lst) res = 0 for i in lst: left += i**2 right -= i res = max(res, lef

2020/3/14 Preliminaries for Benelux Algorithm Programming Contest 2019 部分补题报告和解题报告

A. Architecture 比较行列最大值相同则possible 不同则impossible #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std; int main(){ int r,c,x,y,i; int maxx=0,maxy=0; cin>>r>>c; for(i=1;i<=r;i++)

集训队寒假集训第二场补题题解

补题什么的待填坑... A - Generous Kefa (语法基础) 直接开桶看看有没有超过三个的,因为题目明确提出没有气球也是可以的 代码 #include <bits/stdc++.h> using namespace std; int bk[123213]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,k; cin>>n>>k; string a; cin>&g

2014 UESTC 暑前集训队内赛(1) 解题报告

A.Planting Trees 排序+模拟 常识问题,将耗时排一个序,时间长的先种,每次判断更新最后一天的时间. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Mod 1000000007 #define INT 2147483647 #define pi acos(-1.0)

HDU2010省赛集训队选拔赛(校内赛) H

#define is unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 287    Accepted Submission(s): 178 Problem Description Have you used #define in C/C++ code like the code below? #include <stdio

初步了解--状态压缩dp---poj1185炮兵布阵结题报告

好吧,借助poj1185炮兵布阵这题,仔仔细细的了解了一下状态压缩动态规划 首先,借助题目,我们来看看状态压缩是个虾米东西..Ok follow me 一,所谓状态压缩 根据题意,我们得在长度为M 的地图上放置一些大炮(后面简称"放炮",应该不会被和谐吧),那么,首先不考虑山地,我们得把所有的放置方法都找出来,并且注意,这里只对于一行且长度为M(好吧,你可能要问考虑一行,左右互相隔2,互相不在攻击范围,那么上下呢?这里先不急,一步步来) 1,找出所有放炮的方法 假设长度为7,那么看下图

hdu1217Arbitrage--解题报告

题意:套利,一个US币换取0.5 British pound,而1 British pound 换取10.0 French francs,同一时候 1 French franc buys 0.21 US dollar. 那么1 US dollar 能够换取 0.5 * 10.0 * 0.21 = 1.05 US dollars ,通过一系列换取得到1.05US币,那么就能够从中获取利润,问:给出一些货币,以及兑换率,问能否够从中获利 题解:这里能够用最短路的方法解决:我们在边的结构体 加入兑换率