日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF618F-Double Knapsack【结论】

發(fā)布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF618F-Double Knapsack【结论】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/CF618F


題目大意

給出大小為nnn,值域?yàn)?span id="ozvdkddzhkzd" class="katex--inline">[1,n][1,n][1,n]的兩個可重集合A,BA,BA,B

需要你對它們各求出可重子集使得兩個子集中的數(shù)字和相等

輸出方案。

1≤n≤1061\leq n\le 10^61n106


解題思路

這個值域范圍就很提示性的往鴿籠原理方面考慮。

此題的結(jié)論就是一定有連續(xù)子序列的解。

先搞一個前綴和A,BA,BA,B,假設(shè)An≤BnA_n\leq B_nAn?Bn?
現(xiàn)在我們要求兩個l,rl,rl,r滿足
Ar1?Al1=Br2?Bl2A_{r_1}-A_{l_1}=B_{r_2}-B_{l_2}Ar1???Al1??=Br2???Bl2??
?Ar1?Br2=Al1?Bl2\Rightarrow A_{r_1}-B_{r_2}=A_{l_1}-B_{l_2}?Ar1???Br2??=Al1???Bl2??

現(xiàn)在問題就變?yōu)榱饲髢蓚€相同的Ax?ByA_x-B_yAx??By?.

對于每個AxA_xAx?x∈[0,n]x\in[0,n]x[0,n]),求出一個最大的yyy使得By≤AxB_y\leq A_xBy?Ax?
那么顯然有Ax?By∈[0,n?1]A_x-B_y\in[0,n-1]Ax??By?[0,n?1],也就是Ax?ByA_x-B_yAx??By?一共只有nnn種取值,而我們有n+1n+1n+1個,所以至少有兩個相同的。

開兩個桶記錄一下出現(xiàn)位置就好了。

時間復(fù)雜度O(n)O(n)O(n)


code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e6+10; ll n,a[N],b[N],la[N],lb[N]; signed main() {scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]),a[i]+=a[i-1];for(ll i=1;i<=n;i++)scanf("%lld",&b[i]),b[i]+=b[i-1];bool f=0;if(a[n]>b[n]){for(ll i=1;i<=n;i++)swap(a[i],b[i]);f=1;}ll ala,alb,ara,arb;for(ll i=0,j=0;i<=n;i++){while(b[j]<=a[i])j++;j--;if(la[a[i]-b[j]]){ala=la[a[i]-b[j]];alb=lb[a[i]-b[j]];ara=i;arb=j;}la[a[i]-b[j]]=i+1;lb[a[i]-b[j]]=j+1;}if(f)swap(ala,alb),swap(ara,arb);printf("%lld\n",ara-ala+1);for(ll i=ala;i<=ara;i++)printf("%lld ",i);printf("\n%lld\n",arb-alb+1);for(ll i=alb;i<=arb;i++)printf("%lld ",i);return 0; }

總結(jié)

以上是生活随笔為你收集整理的CF618F-Double Knapsack【结论】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。