SDOI2019熱鬧又尷尬的聚會

2022-04-05 20:33:49 字數 1974 閱讀 3622

出題人用腳造資料系列

只要將\(p\)最大的只求出來,\(q\)直接隨便rand就能過

真的是我們說說怎麼求最大的\(p\),這個玩意具有很明顯的單調性的吧

直接二分一下\(p\)的值,然後將其和他所以相連的所有度數\(>=p\)加進去,

可能最後有一些的點的實際度數\(<=p\)

我們就把他的貢獻減掉,再出現再減

每個點只會入隊一次

資料太弱,\(q\)直接隨機吧

時間複雜度\(o(t(nlogn+rand)\)

#include#include#include#include#include#include#include#include#include#pragma gcc optimize(2)

#define ll long long

#define mk make_pair

#define pii pairusing namespace std;

const int n = 1e5 + 3;

const int m = 2e5 + 3;

struct edgee[m << 2];

int num[n];

int n,m,t,dis,tot;

int head[n],d[n],need[n];

bool book[n],gg[n];

vector g1,g2;

int p,q;

inline char nc()

return *p1++;

#undef size

}inline int read()

while(isdigit(ch))

if(flag) x = -x;

return x;

}inline void add(int x,int y)

inline bool check(int mid)

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

if(d[i] >= mid) qq.push(i);

while(!qq.empty())

}for(int i = 1;i <= n;++i) if(need[i] < mid) qq.push(i);

while(!qq.empty())

}bool flag = 0;

// cout << mid << endl;

// for(int i = 1;i <= n;++i) cout << need[i] << " ";cout << endl;

for(int i = 1;i <= n;++i) if(!gg[i] && need[i] >= mid) flag = 1;

if(flag)

return flag;

}inline int work()

gg[x] = 1,book[x] = 1;

//ans = 1;

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

}if(ans) ans++;

return ans;

}int main()

//continue;

int l = 1,r = n,ans = 1;

while(l <= r)

// cout << p <= n / (q + 1) && q >= n / (p + 1))

}// printf("p:%d q:%d\n",p,q);

printf("%d ",(int)g1.size());

for(int i = 0;i < (int)g1.size();++i) printf("%d ",g1[i]);printf("\n");

printf("%d ",(int)g2.size());

for(int i = 0;i < (int)g2.size();++i) printf("%d ",g2[i]);printf("\n");

} return 0;

}

移動金幣 SDOI2019

乙個 1 times n 的棋盤上最初擺放有 m 枚金幣。其中每一枚金幣佔據了乙個獨立的格仔,任意乙個格仔內最多只有一枚金幣。alice 和 bob 將要進行如下的一場遊戲。二人輪流操作,且 alice 先行。當輪到乙個玩家的時候,他可以選擇一枚金幣,並將其向左移動任意多格,且至少移動一格。金幣不能...

SDOI 2019 快速查詢

傳送門 day1 t1 給定乙個長度為 n nn 的整數數列 有 q qq 次操作,操作有 6 66 種,分別為 單點賦值,全域性加,全域性乘,全域性賦值,單點查值,全域性求和。操作的讀入有點鬼畜啊,建議仔細讀一下。資料範圍 1 n 109 1 n 10 9 1 n 10 9,1 q 10 71 l...

SDOI 2019 移動金幣 題解

題目傳送門 題目大意 乙個長度為 n nn 的序列上有 m mm 個金幣,兩個人輪流操作,乙個人可以將乙個金幣向左移動任意格,但是不能越過別的金幣,問有多少種局面先手必勝。感覺像這兩題 1,2 的合體,不過合的也很巧妙。轉化一下這個博弈 相當於有 m 1 m 1m 1 堆石子,每次可以將一堆石子中的...