NC25557. 华华和奕奕学物理
描述
输入描述
输入Q。 接下来Q行。
先输入op,若op==1,输入v,t,m。
若op==2,输入v,t表示一次询问。
1<=Q,t,m<=3e5。
若op==1,1<=v<=3e5。
若op==2,1<=v<=4e6。
t是不严格递增的,即t[1]<=t[2]<=t[3]<=...<=t[Q]
重力加速度取g=10m/s^2
输出描述
对于每次询问输出2*ans%(1e9+7)
示例1
输入:
7 1 1 1 2 2 1 2 2 11 2 1 3 2 5 1 1 4 3 2 20 4 2 30 4
输出:
0 242 3 2648
C++(clang++11) 解法, 执行用时: 243ms, 内存消耗: 37992K, 提交时间: 2021-03-08 09:44:06
#include<bits/stdc++.h> #define int long long using namespace std; const int p=1e9+7; const int N=8e6+10,base=4e6; int q,d[N][3]; inline void add(int x,int v,int k){for(;x<=base*2;x+=(x&(-x))) d[x][k]+=v;} inline int ask(int x,int k){int s=0; for(;x;x-=(x&(-x))) s+=d[x][k]; return s;} signed main(){ cin>>q; while(q--){ static int op,v,t,m; scanf("%lld %lld %lld",&op,&v,&t); if(op==1){ scanf("%lld",&m); v-=10*t; add(v+base,m*v%p*v%p,0); add(v+base,100*m,1); add(v+base,(20*v*m%p+p)%p,2); }else{ v-=10*t; static int res=0; res=ask(v+base,0); res=(res+ask(v+base,1)*t%p*t%p)%p; res=(res+ask(v+base,2)*t%p)%p; printf("%lld\n",res); } } return 0; }