LGR 051 洛谷9月月賽

2022-04-28 19:57:10 字數 3435 閱讀 7963

luogu

給出\(k\)和質數\(m\),求最小的\(n\)使得\(111....1\)(\(n\)個\(1\))\(\equiv k \mod m\)。

\(m\le10^,0 \le k < m\)

把\(n\)個\(1\)寫成等比數列求和的形式,不難推出這個式子:\(10^n\equiv9k+1\mod m\)

所以直接上\(bsgs\)就行了。

應該是不存在無解的情況的,畢竟無解很容易構造而題目中並沒有說無解怎麼處理。

#include#include#include#includeusing namespace std;

#define ll long long

ll k,m,sz;mapm;

ll mul(ll a,ll b)

return res;

}ll fastpow(ll a,ll b)

return res;

}int main(),1\le a_i \le b_i \le n\times m,0 \le b_i-a_i

假設\(1\)填在第一行第一列,求出\(a_i,b_i\)填的原始位置\(l,r\)。\(1\)的位置每往右移動一位,相當於給所有數加上乙個相同的增量\(x\) 。

如果\(l\le r\),那麼\(x\in[0,m-r]\)或\(x\in[m-l+1,m-1]\),否則\(x\in[m-l+1,m-r]\)。

如果\(m\)比較小的話可以直接差分,但現在\(m\le10^\),所以就把差分標記存下來然後掃瞄線。記得空間要開四倍。

#include#include#includeusing namespace std;

#define ll long long

ll gi()

ll n,m,ans,tot,ans;int s,q,cnt;

struct node;

a[++cnt]=(node);

}int main()

sort(a+1,a+cnt+1);a[++cnt]=(node);

for (int i=1,j=0;i<=cnt;++i)

if (!tot) return puts("impossible!"),0;

if (tot>1) return puts("uncertain!"),0;

while (q--)

printf("%lld\n",ans);return 0;

}

一棵帶權樹,有\(m\)組詢問\(a_i,b_i\)。你需要在樹上選乙個點\(x\),最小化\(\max_^m\\) 。

\(n \le 10^5\)

先隨便選乙個點,對每組詢問計算答案。找出那些答案最大的詢問,如果所有滿足使答案最大的詢問都在當前點的同乙個子樹內,那麼把選取的點往這個子樹內移動就有可能使答案更優(注意是有可能,你依然需要對每次計算的答案取\(\min\)),那麼就往這個子樹裡走。

優化一下,往子樹的重心走,複雜度就對了。

#include#include#include#includeusing namespace std;

int gi()

#define ll long long

const int n = 2e5+5;

int n,m,to[n],nxt[n],ww[n],head[n],cnt,root,sum,rt;

int fa[n],dep[n],sz[n],son[n],top[n],w[n],vis[n],a[n],b[n];

ll dis[n],ans=1ll<<60;vector>e[n];

void link(int u,int v,int w)

void dfs1(int u,int f)

}void dfs2(int u,int f)

void getroot(int u,int f)

w[u]=max(w[u],sum-sz[u]);

if (w[u]給你乙個序列\(a_i\)以及常數\(k\),每次詢問區間\(l,r\)內選兩個數使其異或和在二進位制下恰好有\(k\)個\(1\)的方案數。

\(n,m\le10^5,0\le a_i<2^\)

考慮莫隊。

以移動右端點為例。每次移動右端點的時候,我們需要求出這個新增右端點與原區間內多少個數滿足異或和在二進位制下恰好有\(k\)個\(1\)。這個東西可以差分,因為一共只有\(o(m\sqrt m)\)次的移動,所以從前往後、從後往前分兩次預處理一遍,把需要用到的\(o(m\sqrt m)\)個值記下來就行了。

在預處理中需要快速統計個數,因為插入次數是\(o(n)\)而詢問次數是\(o(m\sqrt m)\),所以只要支援\(o(\binom)\)插入,\(o(1)\)詢問即可。

但是這樣空間複雜度過高,不能通過本題,需要考慮更深層次地挖掘莫隊在左右端點移動中的一些性質。

可以發現,每次左右端點移動時會移動連續的一段,而這樣的連續段只會有\(o(m)\)個。那麼我們就可以考慮預處理每一次連續移動的答案。

以左端點\(l\)不動,右端點從\(r\)移動到\(r'(r為例。根據差分,這裡對答案的增量是\(\sum_^s_-s_\),其中\(s_\)表示\(a_i\)與前\(j\)個數中有多少滿足異或和在二進位制下恰好有\(k\)個\(1\)。發現前半部分都是\(s_\)可以直接預處理,後半部分可以掛鏈掛到\(l-1\)上,然後\(o(r'-r)\)地計算。

右端點不動,左端點移動的情況恰好相反,同樣處理即可。

#include#include#include#include#includeusing namespace std;

int gi()

#define ll long long

const int n = 1e5+5;

int n,m,k,blk,a[n],zt[3433],cnt,totl,totr,sum[16384];

ll pre[n],suf[n],ans[n],ans;

struct query

for (int i=1;i<=n;++i) a[i]=gi();

for (int i=1;i<=m;++i) q[i]=(query);

sort(q+1,q+m+1);

for (int i=0;i<16384;++i)

for (int i=1,l=1,r=0;i<=m;++i),l=q[i].l;

if (r>q[i].r) ql[++totl]=(node),r=q[i].r;

if (lq[i].l) ans+=suf[q[i].l]-suf[l]-qr[++totr].res,l=q[i].l;

if (r>q[i].r) ans-=pre[r]-pre[q[i].r]-ql[++totl].res,r=q[i].r;

if (lans[q[i].id]=ans;

} for (int i=1;i<=n;++i) printf("%lld\n",ans[i]);

return 0;

}

洛谷 9月月賽

題目描述 眾所周知,在一些特殊的部門,如果密碼能夠讓乙個人就解開,就會非常不安全。pic pre invoked code,預生成密碼 誕生了。這個密碼比較安全,是因為它必須由三個人保管。系統首先預先生成三個大整數a b c,計算出它們的與and 或or 和sum並儲存,然後將a b c分別告訴這三...

LGR 052 洛谷9月月賽II(加賽)

題解 沒打。ab題滿世界都過了應該沒什麼意思 c題是個比較有意思的思維題 先看了題解才會的。我們考慮這麼一件事情 沒鑰匙的人出門後 門一定是開著的 他進來的時候,門一定是開著的 其他時候,一定門能關著比較好 但是這個東西並不是很好維護,因為可能重複算 我們考慮重新排個序 我們把a在b前面的那個排在他...

LGR 050 洛谷8月月賽

只有比賽現場的暴力 留念,覆盤題解見具體題目 t1 耗時20mins,暴力列舉,複雜度o nq 期望得分50 include include using namespace std define mod 998244353 const int maxn 1e6 10 typedef long lon...