标签:组成 不能 基于 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; }
可能真的是 当你开始把一个东西放在心上的时候,就会发现老是看到那个东西
比如最近看题解 到处都是快读
所以我也开始用快读啦!!!
下个星期还去活动室嘛?
去啊!!!!!!!!!!!!!!!!!!!!!!!!!
本人性别女属性脸皮厚啊
标签:组成 不能 基于 ret 更新 span || cout 单点更新
原文地址:https://www.cnblogs.com/guaguastandup/p/10468484.html