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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

【做题记录】构造题

發(fā)布時(shí)間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【做题记录】构造题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CF468C Hack it!

題意:

\(F(x)\) 表示 \(x\) 的各個(gè)位上的數(shù)字之和,如 \(F(1234)=1+2+3+4=10\)

給定 \(a(a\le 10^{18})\) ,請(qǐng)求出任意一組 \(l,r(l,r\le 10^{200})\) ,要求滿足:

\[\sum_{i=l}^{r}F(i)\pmod{a}=0 \]

輸出 \(l,r\)

$\texttt{solution}$

注意到,若 \(F(x)=p\) ,那么 \(F(x+10^{18})=F(x)+1=p+1\)

那么可以發(fā)現(xiàn),若 \(\sum_{i=0}^{10^{18}-1}F(i)=p\) ,那么有:

\[\sum_{i=1}^{10^{18}}F(i)=sum_{i=1}^{10^{18}-1}+F(10^{18})-F(0)=p+1 \]

因此發(fā)現(xiàn) \(l=a-p,r=a-p+10^{18}-1\) 時(shí)恰好能夠成立。

因此考慮求出 \(p\)

\[\begin{aligned}\sum_{i=0}^{10^{18}-1}&=45\times 10^{17}+10\times \sum_{i=0}^{10^{17}-1}f(i)\\&=45\times 10^{17}+10\times (45\times 10^{16})+100\times \sum_{i=0}^{10^{16}-1}f(i)\\&=\dots\\&=18\times 45\times 10^{17}\\&=81\times 10^{18}\end{aligned} \]

之后帶入式子就可以啦!

typedef unsigned long long ll; ll a,l,r,p,inf=1e18; int main() {a=rd(),p=inf%a*9llu%a*9llu%a;printf("%llu %llu\n",a-p,a-p+inf-1llu);return 0; }

CF1491F Magnets

交互、二分。

早苗有 \(n\) 塊磁石,編號(hào)為 \(1,2,\cdots,n\)。每塊磁石的磁極可能是正極,負(fù)極,也可能沒(méi)有磁性。她希望你能幫她找出所有沒(méi)有磁性的磁石。

萬(wàn)幸的是,你有一臺(tái)磁力檢測(cè)儀。你每次可以將每個(gè)磁石放在這臺(tái)機(jī)器的左托盤(pán),右托盤(pán)或者不放。

機(jī)器將會(huì)返回此時(shí)的磁力強(qiáng)度。設(shè)托盤(pán)左邊有 \(n_1\) 個(gè)磁石為正極,\(s_1\) 個(gè)磁石為負(fù)極,托盤(pán)右邊中有 \(n_2\) 磁石為正極,\(s_2\) 個(gè)磁石為負(fù)極,則返回的磁力強(qiáng)度為 \(n_1n_2+s_1s_2-n_1s_2-n_2s_1\)

如果一次測(cè)試中磁力強(qiáng)度的絕對(duì)值大于 \(n\),這臺(tái)機(jī)器就會(huì)壞掉。

你需要在 \(n+\lfloor\log_2n\rfloor\) 次測(cè)試內(nèi)找到所有沒(méi)有磁性的磁石的編號(hào),同時(shí)不能弄壞機(jī)器。

保證存在至少 \(2\) 塊磁石有磁性且至少 \(1\) 塊磁石沒(méi)有磁性。

$\texttt{solution}$

先化簡(jiǎn)式子發(fā)現(xiàn)交互的返回值就是 \((n_1-s_1)(n_2-s_2)\)

由于正負(fù)極石頭放在一起會(huì)導(dǎo)致 \(n,s\) 會(huì)都大于 \(0\) ,使問(wèn)題變得更為困難。

那么考慮每次查詢只對(duì)一塊石頭與其他一堆石頭之間進(jìn)行詢問(wèn)。

那么如果我們已經(jīng)知道了一塊有磁性的此時(shí),就可以非常容易的知道其他所有的此時(shí)是否有磁性。

之后考慮如何才能找出有磁性的石頭,直接枚舉肯定是不行的,最壞都會(huì)到 \(O(n^2)\)

我們可以從 \(1\)\(n\) 開(kāi)始枚舉 \(i\),詢問(wèn) \([1,i-1]\)\(i\)。若詢問(wèn)結(jié)果不為 \(0\),則 \([1,i-1]\) 中必然有一塊有磁性的石頭,而 \(i\) 也一定是有磁性的。因此可以找出一塊有磁性的石頭。

之后我們是否可以 \(O(n)\) 檢查所有石頭了呢?還是不行。。。

考慮到答案不能超過(guò) \(n+\log n\),所以我們只能將上面第二塊石頭之后,也就是 \([i+1,n]\) 中的石頭判斷一遍。這樣到現(xiàn)在為止總共用了 \(n-1\) 次操作。

\([1,i-1]\) 中只有 \(1\) 快有磁性的石頭,所以我們可以二分出這塊石頭的位置,找出這最后一塊有磁性的石頭。那么我們就做完啦。

int T,n,Last,pos,cnt; int ans[Maxn]; inline int query(int nl,int nr,int k) {printf("? %d %d\n",nr-nl+1,1);for(int i=nl;i<=nr;i++) printf("%d%c",i,(i==nr)?'\n':' ');printf("%d\n",k);fflush(stdout);return rd(); } inline void print() {printf("! %d ",cnt);for(int i=1;i<=cnt;i++) printf("%d%c",ans[i],(i==cnt)?'\n':' ');fflush(stdout); } int main() {T=rd();while(T--){n=rd(),pos=-1,cnt=0;for(int i=2;i<=n && pos==-1;i++)if(query(1,i-1,i)) pos=i;for(int i=pos+1;i<=n;i++) if(!query(i,i,pos)) ans[++cnt]=i;int nl=1,nr=pos-1;while(nl<=nr){int mid=(nl+nr)>>1;if(query(1,mid,pos)) Last=mid,nr=mid-1;else nl=mid+1;}for(int i=1;i<pos;i++) if(i!=Last) ans[++cnt]=i;print();}return 0; }

CF1586F Defender of Childhood Dreams

給定一張競(jìng)賽圖(點(diǎn)數(shù) \(\le 1000\)),對(duì)于所有 \(a<b\),都有一條由 \(a\)\(b\) 的有向邊,并且每一條邊都有一個(gè)顏色。現(xiàn)在要求所有長(zhǎng)度大于等于 \(k\) 的路徑上都有 \(\ge 2\) 中顏色。求出整張圖中出現(xiàn)最少出現(xiàn)顏色的數(shù)量與邊的染色方案。

$\texttt{solution}$

考慮將序列分為許多長(zhǎng)度不超過(guò) \(k\) 個(gè)塊,在塊與塊間連接相同顏色的邊。這樣可以保證在塊與塊間轉(zhuǎn)移的邊不會(huì)形成 \(\ge k\) 長(zhǎng)度的路徑。

在每一個(gè)塊內(nèi)部再進(jìn)行同樣的拆分(但在塊內(nèi)的顏色要與塊外的顏色不同),遞歸進(jìn)行即可。

#define Maxn 1005 int n,k,ans; int col[Maxn][Maxn]; void solve(int l,int r,int c) {if(l==r) return;int len=(r-l+k)/k,tot=(r-l+len)/len;for(int i=1,x,y;i<tot;i++)for(int j=i+1;j<=tot;j++)for(int p=1;p<=len;p++)for(int q=1;q<=len;q++){x=l+(i-1)*len+p-1,y=l+(j-1)*len+q-1;if(y>r) break;col[x][y]=c;}for(int i=1;i<=tot;i++) solve(l+(i-1)*len,min(l+i*len-1,r),c+1); } int main() {n=rd(),k=rd();solve(1,n,1);for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) ans=max(ans,col[i][j]);printf("%d\n",ans);for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) printf("%d ",col[i][j]);printf("\n");return 0; }

CF715D Create a Maze

有一個(gè) \(n\times m\) 的迷宮,每一格都是一個(gè)房間,每?jī)蓚€(gè)相鄰的房間之間有一扇門(mén)。

在所有門(mén)中,有 \(k\) 扇是鎖著的,不能通行,其余沒(méi)有限制。

現(xiàn)在你在 \((1,1)\),需要走到 \((n,m)\),只能向下或向右走。

設(shè)總共的行走方案有 \(T\) 種。

現(xiàn)在給出 \(T\),要求設(shè)計(jì)出一個(gè)迷宮滿足行走方案為 \(T\)

要求:\(n,m\le 50,k\le 500,T\le 10^{18}\)

$\texttt{solution}$

這一題需要按照 \(T\) 的進(jìn)制來(lái)解決問(wèn)題。

首先考慮用二進(jìn)制,那么我們可以這樣設(shè)計(jì)方案:

這樣我們就可以用二進(jìn)制來(lái)表示出任何 \(\le 2^{49}\)\(T\) 啦!

然而我們發(fā)現(xiàn)如果我們將我們的以 \(2\times 2\) 改為 \(3\times 3\),可以將前面的二進(jìn)制變?yōu)榱M(jìn)制!!

之后構(gòu)造就比較類(lèi)似,我們只要改為兩路 \(1\) 和中間的 \(3\times 3\) 即可。

這樣最大可以表示 \(6^{24}>10^{18}\),可以解決這道題啦!

總結(jié)

以上是生活随笔為你收集整理的【做题记录】构造题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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