XJ10.23模拟赛。
题面
思博推柿子,随便推就能搞出$O(N)$。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #define ll long long using namespace std; int N,D; ll A[1000005]; ll S[1000005],T[1000005]; int inline (){ int num=0,neg=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();} while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar(); return num*neg; } ll tmp,ans; ll inline cS(int i){if(i<=0) return 0;if(i>N) return S[N];return S[i];} ll inline cT(int i){if(i<=0) return 0;if(i>N) return T[N];return T[i];} int main(){ N=read(),D=read(); for(int i=1;i<=N;i++){ A[i]=read(); S[i]=S[i-1]+A[i];T[i]=T[i-1]+1LL*i*A[i]; } for(int i=1;i<=D;i++) tmp+=1LL*(D-i+1)*(D-i+1)*A[i]; ans=tmp; for(int i=1;i<=N;i++){ tmp=tmp -2*(cT(i-1)-cT(i-1-D))+(2*i-2*D-1)*(cS(i-1)-cS(i-1-D)) -2*(cT(i+D)-cT(i))+(2*i+2*D+1)*(cS(i+D)-cS(i)); ans=max(ans,tmp); } printf("%lldn",ans); }
|
T2
$K$很小,考虑状压。
显然,对于一个未扑灭的初始着火点集合$s$,任意一个节点$u$被点燃的时间是
那么什么时候$u$被点燃的时间晚于原来整个图被点燃的时间$maxT$呢?必须是:
于是这样的$s$必须是$S[u]={v|dis[u,v]>maxT}$的子集。
只要一个$u$晚于$maxT$,整张图就会被推迟,所以$s$只需要是任意一个$S[u]$的子集即可。显然可以做到$k2^k$。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #define ll long long 大专栏
|
标签:tmp,10.23,return,int,ll,讲坛,ans,cS,模拟
来源: https://www.cnblogs.com/lijianming180/p/12433051.html