出題人用腳造資料系列
只要將\(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 堆石子,每次可以將一堆石子中的...