今天第一次参加bc,虽然由于运动会耽误了时间,但还是开始做了题目。
第一道题恰巧是最近做的树状数组类型,nlogn 复杂度。规律推算很简单。一个长度的区间累加过程中会消掉中间部分,区间长度的改变会导致减掉加上的部分改变。减掉的是最前面k-1,加上后面n-k+1个
第二题一直没很好明白题意,虽然认为不难。
起初没有用long long 溢出了两次,o(︶︿︶)o 唉 以后看到取模之类的直接ll
#include<cstdio> #include<string> #include<string.h> #include<iostream> #include<algorithm> #include<map> #include<iterator> using namespace std; typedef __int64 ll; #define N 10+447000 #define max(a,b) ((a)>(b)?(a):(b)) #define lowbit(x) (-x)&x #define MOD 1000000007 int n,m; ll a[N]; void update(int l,int n) { while(l<N) { a[l]=(a[l]+n)%MOD; l+=lowbit(l); } } ll sum(int l) { ll ans=0; while(l>0) { ans=(a[l]+ans)%MOD; l-=lowbit(l); } return ans; } int main() { int i,k; int T; //freopen("in.txt","r",stdin); while(~scanf("%d", &T))while(T--) { memset(a,0,sizeof(a)); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&k); update(i,k); } ll ans=0; ll sub=0; ll add=0; for(k=1;k<=n;k++) { sub=(sum(k-1)+sub)%MOD; add=(sum(n-k+1)+add)%MOD; ans=(add-sub+ans+MOD)%MOD; } printf("%I64d\n",ans); } return 0; }
时间: 2024-10-05 23:51:21