題意:給出乙個陣列c[
i],求乙個陣列po
s[i]
=d∗x
i+yi
+c[i
] 滿足對於任意
j<
i ,po
s[i]
!=po
s[j]
。並且滿足最小化 yi
的前提下最小化 xi
後面的不說了。
從前到後列舉,如果當前點沒有被訪問過,從當前點
i 開始列舉(i
+d)%
n,這樣會有乙個環。當y
i+1 時會從當前環轉移到其他環,因此如果c[
i]所對應的環上的點還有剩餘那麼從當前環上取乙個點,否則增加 yi
,從其他環上選點。
可以用類似並查集的東西維護一下。
#include
using namespace std;
#define n 110000
#define ll long long
int t,n,s,q,p,m,d;
int c[n],use[n],vis[n],pos[n],cnt[n],bel[n];
int fa[n],done[n];
int find(int
x) return find(fa[x]);
}int main()
fa[s]=(s+d)%n;cnt[bel[s]]--;
for(int i=1,t;ipos[i]=find(c[i]%n);
if(--cnt[bel[pos[i]]])
fa[pos[i]]=find((pos[i]+d)%n);
}for(int i=0;iif(!vis[i])
if(cnt==1)continue;
ans+=cnt+1-flag;
}printf("%d\n",ans);
}return
0;}
奇數階魔方 1998
problem description 乙個 n 階方陣的元素是1,2,n 2,它的每行,每列和2條對角線上元素的和相等,這樣 的方陣叫魔方。n為奇數時我們有1種構造方法,叫做 右上方 例如下面給出n 3,5,7時 的魔方.38 1 6 3 5 7 4 9 2 517 24 1 8 15 23 5 ...
NOIP1998 題解報告
luogu p1011 車站 luogu p1012 拼數 luogo p1013 進製位 luogu p1011 車站題目傳送門 這題看起來就很斐波那契 我們直接推式子即可,設第二站上車下車的人數均為 b 設 f i 為到達第 i 站時的人數,up i 為第 i 站上車的人數,down i 為第 ...
NOI1998 圍巾裁剪
裁縫有一塊非常珍貴的絲綢圍巾。可惜的是,圍巾的某些部分已經被蛀蟲給咬壞了。裁縫當然不願意就這麼把圍巾給丟了,於是,他想把圍巾給裁成兩塊小圍巾送給他的兩個女兒。自然,兩塊小圍巾的面積之和越大越好。這塊圍巾是乙個正三角形,三條邊被均勻地分成了n段,即這個正三角形被均勻地分成了n2個單元,每個單元是乙個面...