題意:n*m的矩陣 每次可以固定乙個格仔或者解除固定乙個格仔 詢問全圖網格是否是穩定的 那麼分析可得 是否穩定我們可以先列出方程 考慮針對乙個四個格仔觀察他們交接的那個點 他們四個角角度相加一定是360° 所以可以列出方程 那麼針對每個這樣的點都去列方程 然後用其他變數來表示可以得到乙個關係式 可以感性的理解到乙個點同時會控制該行該列的角度的聯動性 那麼 把圖的行和列提取出來看成乙個二分圖 每次看是否穩定只要看全圖中是否只有乙個連通塊即可驗證是否穩定
考慮網格圖 左上+右下-左下-左上 可以恰好等於0 那麼如果將該方程在每個格仔中寫出並且互相消去可以發現 在網格圖中任意的四個角都滿足這樣的性質那麼假如控制了其中兩個 那麼剩下兩個一定是互為相反數只要把這樣的也控制住 那麼整個圖就穩定了 考慮這是個二分圖 從式子上理解也可以 感性理解也可以 可以認為 是我控制了 這個點 相當於控制了這一行這一列都要和我這個的角有關 所以每次放乙個x 那麼我就把這個行和列連起來 統計圖中的連通塊個數 如果==1那麼說明圖是穩定的了
可以按照這條邊出現的時間建立最大生成樹用lct維護 連通塊個數
#include
#include
#define n 3300
#define n1 220000
using namespace std;
inline char gc()
return
*s++;
}inline int
read()
while(ch<='9'&&ch>='0') x=x
*10+ch-'0',ch=gc();
return
x*f;
}inline void read_s(char *s)
char s[n][n];bool rev[n1];
int mm[n][n],v[n1],c[n1][2],fa[n1],q[n1],top,n,m,q,sum,tot,b[n1],mark[n1];
inline bool isroot(int
x)inline void update(int
x)inline void pushdown(int
x)inline void rotate(int
x)inline void splay(int
x)rotate(x);
}}inline void access(int
x)inline void makeroot(int
x)inline int find(int
x)inline void link(int
x,int
y)inline void cut(int
x,int
y)struct nodeqr[110000];
struct node1eg[n1];
int main()
}int
last=tot;
for (int i=1;i<=q;++i)else
}for (int i=1;i<=tot;++i) if(!v[i]) v[i]=q+1,b[i]=i;
for (int i=tot+1;i<=tot+n+m;++i) v[i]=0x3f3f3f3f,b[i]=i;
for (int i=1;i<=last;++i) else
}if (sum==1) puts("s");else puts("u");
for (int i=1;i<=q;++i)else
}else
if (!mark[id]) cut(id,x+tot),cut(id,y+tot+n),++sum;
if (sum==1) puts("s");else puts("u");
}return
0;}
BJ 集訓測試10 城市
圓上均勻分布n 個點 然後 在這n個點中連n 3條邊 且這些邊不相交 有q次詢問每次詢問兩點間的最短距離 因為原圖是平面圖所以可以考慮轉成對偶圖 然後點分治 不想寫對偶圖 點分治可以考慮邊分治 每次選擇一條邊 將這條邊左右的邊的數量盡量平均分布 因為這題比較特殊是在乙個圓環上 所以考慮 我給所有點標...
BJ 集訓測試13 鋼琴
題意給乙個序列 1e6 給乙個字符集大小為n且 100 每次1 n的概率生成其中乙個字元 求每個字首生成的期望 公式 dp i dp next i n i 證明 include define rep i,x,y for register int i x i y i define repd i,x,y...
BJ 集訓測試12 coin
題意 有n種貨幣,每種貨幣有乙個價值vi,並且滿足任意兩種貨幣的價值成倍數關係。即對於第i種貨幣和第j種貨幣,有vi整除vj,或者vj整除vi。現在給出這n種貨幣的價值,請你計算有多少種方案能湊出價值為m的貨幣組合。假設每種貨幣的數量是無限的,貨幣的價值互不相同。為了保證有解,我們約定存在一種貨幣的...