T1 字符串
$Catalan$数裸题,非常裸。
公式$C_{n+m}^m-C_{n+m}^{m-1}$。
做了俩小时,真傻逼。
T2 乌鸦喝水
不会做,思路挺好想,但是不好实现。
最重要的一点:TM看题看错了!!
排一下序,用树状数组维护其前缀和,然后挨个处理就好。
小弟不才。
1 #include2 #include 3 #define LL long long 4 #define HZOI std 5 using namespace HZOI; 6 const int N=5e7+3; 7 struct node{ 8 LL w,a,c,id; 9 friend bool operator < (node a,node b) 10 { 11 return a.c<b.c; 12 } 13 }t[N]; 14 LL n,m,k; 15 LL num,cnt; 16 LL ans,lst; 17 LL sz[N]; 18 inline LL read(); 19 inline LL Ask(LL ); 20 inline void Add(LL ,LL ); 21 int main() 22 { 23 n=read(),m=read(),k=read(); 24 for (int i=1; i<=n; ++i) t[i].w=read(),t[i].id=i; 25 for (int i=1; i<=n; ++i) t[i].a=read(); 26 for (int i=1; i<=n; ++i) t[i].c=(k-t[i].w)/t[i].a+1,Add(i,1); 27 sort(t+1,t+n+1); 28 for (int i=1; i<=n; ++i) 29 { 30 LL l=0,r=m; 31 while (l^r) 32 { 33 int mid=(l+r>>1)+1; 34 if ((n-i+1)*mid+lst>=t[i].c) r=mid-1; 35 else l=mid; 36 } 37 if (cnt+l>=m) { ans+=(n-i+1)*1ll*m; break; } 38 num=l+cnt; 39 if (Ask(t[i].id)+lst+(n-i+1)*1ll*l<=t[i].c) ++lst,++num; 40 lst+=l*1ll*(n-i+1); cnt+=l; 41 ans+=num; 42 Add(t[i].id,-1); 43 } 44 printf("%lld\n",ans); 45 } 46 inline LL Ask(LL x) 47 { 48 LL res=0; 49 while (x) 50 { 51 res+=sz[x]; 52 x-=x&-x; 53 } 54 return res; 55 } 56 inline void Add(LL x,LL data) 57 { 58 while (x<=n) 59 { 60 sz[x]+=data; 61 x+=x&-x; 62 } 63 } 64 inline LL read() 65 { 66 LL nn=0; char cc=getchar(); 67 while (cc<'0' || cc>'9') cc=getchar(); 68 while (cc>='0' && cc<='9') nn=(nn<<3)+(nn<<1)+(cc^48),cc=getchar(); 69 return nn; 70 }
T3 所驼门王的宝藏
这道题说难也难,说简单也挺简单。
其实就是数据出的太水了。
本人用的思路简单的$vector$$+$$map$,但$map$太慢了容易被卡,但是我还是没有抵制住map强大功能的诱惑,但$A$了之后发现数据真的水。
思路:给能到达的点连上有向边,然后跑$Tarjan$缩点,最后拓扑序$dp$求最长链(权值最大的一条链,权值是这个方点内的点数)。
挺好想的,不过调也得半天。
然而考试的时候我弃了。
小弟不才。
1 #include2 #include 3 #include