码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-03-03 23:58:39      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:组成   不能   基于   ret   更新   span   ||   cout   单点更新   

今天嘛,打得很糟糕,糟糕到什么程度呢,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;
}

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

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

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

 下个星期还去活动室嘛?

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

本人性别女属性脸皮厚啊

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

标签:组成   不能   基于   ret   更新   span   ||   cout   单点更新   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!