APIO2019簡要題解

2022-04-30 13:18:07 字數 3654 閱讀 2638

看到這種題,我們肯定會想到\((x,y)\)一定有迴圈

我們要找到迴圈節的長度

推一下發現\(x\)的迴圈節長為\(\frac\)。等一下,\(t\)是整數,所以迴圈節長為\(\frac\)

\(y\)的迴圈節長為\(b\)

所以\((x,y)\)的迴圈節長為\(lcm(\frac,b)=\frac\)

對每個時間段對迴圈節長取模進行區間覆蓋即可

**(用了__int128)

#include #define n 1000005

#define ll long long

#define getchar nc

using namespace std;

inline char nc()

inline ll read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

return x*f;

}inline void write(register ll x)

inline ll max(register ll a,register ll b)

vector>v;

int n;

ll a,b;

int main()

else

}} sort(v.begin(),v.end());

ll l=0,r=-1,ans=0;

for(register int i=0;i我們先考慮不帶修改怎麼做——珂以貪心地將橋的承受重量和車的重量從大到小排序,從大往小掃瞄車,用並查集維護邊和答案

考慮有修改操作,我們珂以使用分塊,設塊的大小為\(blk\)

那麼每個塊中的修改操作不超過\(\frac\)個

我們先把沒有修改的邊和所有詢問的點像不帶修一樣從大到小排序,從大往小掃瞄車,對於每輛車,單獨加入被修改的一些邊,加入後通過並查集回退來撤銷,所以並查集不能路徑壓縮,要按秩合併,處理完詢問後要將原圖更新,但是不能直接快排,新邊要和原來已經有序的邊進行合併排序,這個單塊複雜度是\(o(m\alpha+\frac\alpha+m)\)

我blk取的是\(\sqrt\),所以總複雜度是\(o(m \sqrt \alpha)\)

#include #define m 100005

#define getchar nc

using namespace std;

inline char nc()

inline int read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

return x*f;

}inline void write(register int x)

struct edgee[m],e[m],tmp[m];

bool operator < (edge a,edge b)

int fa[m],sz[m],top;

struct mstesta[m];

inline int getfa(register int x)

inline void merge(register int u,register int v)

int lastop=top;

for(register int j=1;j<=t1;++j)

d[tmp1[j].b]=e[id[tmp1[j].b]].w;

for(register int j=1;j<=t1;++j)

if(tmp1[j].id=tmp2[i].b)

merge(e[id[tmp1[j].b]].u,e[id[tmp1[j].b]].v);

ans[tmp2[i].id]=sz[getfa(tmp2[i].r)];

while(top>lastop)

cancel();

} for(register int i=1;i<=t1;++i)

e[id[tmp1[i].b]].w=tmp1[i].r;

t1=t2=0;

for(register int i=1;i<=m;++i)

if(vis[e[i].i])

e[++t1]=e[i];

else

e[++t2]=e[i];

sort(e+1,e+1+t1);

merge(e+1,e+1+t1,e+1,e+1+t2,tmp+1);

for(register int i=1;i<=m;++i)

e[i]=tmp[i];

}int main()

; }

else

; }

if(tot==blk)

work(),tot=0;

} if(tot)

work();

for(register int i=1;i<=q;++i)

if(ans[i])

write(ans[i]),puts("");

return 0;

}

這道題珂以暴力資料結構

我們用樹狀陣列套主席樹

每個點開個主席樹,每個位置表示假如之後再也不修改,能到那個位置的次數(包括修改前的次數)

樹狀陣列維護主席樹的和

這樣就珂以方便的進行差分

上**(不想說了,自己看,簡單易懂)

#include #define n 300005

#define getchar nc

using namespace std;

inline char nc()

inline int read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

return x*f;

}inline void write(register int x)

int n,q,c[n];

setst;

set::iterator now,pre,nxt;

struct nodetr[n*40];

int tot,rt[n];

inline void change(register int &x,register int l,register int r,register int pos,register int val)

inline int querys(register int x,register int l,register int r,register int l,register int r)

inline int lowbit(register int x)

inline void modify(register int x,register int pos,register int val)

inline int query(register int x,register int pos)

int main()

st.insert(0),st.insert(n+1);

modify(1,1,q);

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

while(q--)

if(c[x]==0)

st.erase(x);

c[x]^=1;

} else

}return 0;

}

題解 APIO2019路燈

mathtt 題意概要 一條直線上有 n 1 個點和 n 條道路,每條道路連通相鄰兩個點。在 q 個時刻內,每個時刻有如下兩種操作之一 n,q leq 3 times 10 5 時限 5s 切了前兩題讓我還以為今年apio能ak的說,這題沒切主要是因為沒有想到可以將若干段區間的和變為所有右端點的座標...

CCF關於APIO2019(中國區)的報名通知

2019亞洲和太平洋地區資訊學奧林匹克 asia and pacific informatics olympiad,簡稱apio2019 將於5月11日 週六 舉行。中國區選手測試活動將由中國計算機學會 ccf 主辦,於5月9日 13日在首都師範大學附屬中學進行。測試日為5月11日 週六 除測試外,...

題解 APIO2007 風鈴

你需要選乙個滿足下面兩個條件的風鈴 1 所有的玩具都在同一層 也就是說,每個玩具到天花板之間的杆的個數是一樣的 或至多相差一層。2 對於兩個相差一層的玩具,左邊的玩具比右邊的玩具要更靠下一點。風鈴可以按照下面的規則重新排列 任選一根杆,將杆兩頭的線 交換 也就是解開一根杆左右兩頭的線,然後將它們綁到...