杭電多校第六場(IF)

2021-10-08 22:28:38 字數 1455 閱讀 5039

題意:

有命題:將 b 進製數y按位相加,迴圈無窮次,最終結果若%x == 0,則有y % x == 0,反之不然

給出b和x,判斷命題是否成立

……打表發現的b % x == 1時成立,看到有數論大佬推出來的%%%

想看推導的右轉

#includeusing namespace std;

typedef unsigned long long ll;

const int inf = 0x3f3f3f3f;

const int mod = 998244353;

const double pi = acos(-1.0);

const int n = 25;

int main()

return 0;

}

題意:

n個點m條邊,第 i 條邊的長度為2 ^ i,d(i, j) 表示 i、j 之間的最短路,[....]叫艾佛森括號,當括號內條件成立時為1,否則為0,求:

思路:可以發現邊的長度是遞增的,並且任意一條邊大於它之前所有邊之和,所以構造乙個最小的連通圖,也就是樹,樹上兩點距離也就是最短路了。每條邊的貢獻 = 該邊左邊的1節點數 * 右邊的0節點數 * 邊權 + 左邊的0節點數 * 右邊的1節點數 * 邊權

參考:

#includeusing namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const int mod = 1e9 + 7;

const double pi = acos(-1.0);

const int n = 1e5 + 7;

struct node

edge[4 * n];

ll qpow(ll a, ll b)

return ans % mod;

}int fa[n], n, m, head[n], tot, cn1, cn0, vis[n];

ll dp[n][2], ans;

void init()

}void add(int u, int v, int w)

int find(int x)

void union(int x, int y)

void dfs1(int u, int pre)

}void dfs2(int u, int pre)

}int main()

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

dfs1(1, -1);

dfs2(1, -1);

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

}return 0;

}

20190807杭電多校第六場

賽中和隊友一直在搞乙個胡搞做法,艱難優化到本地跑10s,可惜始終過不了。最後只好補了題解做法。倒著刪除,用樹狀陣列求lis,維護一條當前的lis的路徑。若被刪除的數不在當前的lis中,則答案不變 否則,重新做一遍lis。據說因為lis的期望長度為sqrt n 所以被選中的概率是 ac include...

2019 杭電多校(第六場)

1005 snowy smile 線段樹 題意給你n個點 讓你畫個矩形 使矩形內所含點的權值和最大 必須有點 思路離散化 列舉矩形的左右區間 線段樹維護y座標的最大欄位和 複雜度 o n n lgn include using namespace std typedef long long ll c...

杭電多校第六場 snowy white

首先將縱座標離散化。將所有點按照橫座標排序,列舉矩形的上邊界,然後往後依次加入每個點,這樣就確定了 矩形的上下邊界。設 v y 表示矩形內部縱座標為 y 的點的權值和,則答案為 v 的最大子段和,用線段樹維護帶修改的最大子段和即可。時間複雜度 o nlogn include include incl...