省選模擬34

2022-10-09 00:48:14 字數 3017 閱讀 9401

然後再線段樹分治一下

code

#include#define int long long//overflow !!! memory limit !!!

#define rint signed

#define lson rt<<1

#define rson rt<<1|1

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m;

int a[40],siz;

int a[40][40],siz[40];

mapmp;

struct segst[100010*4];

inline bool ins(int x)

return false;

}void ins(int rt,int l,int r,int l,int r,int k)

void dfs(int rt,int l,int r,int k)

signed main()

} for(auto l:mp) ins(1,1,n,l.second,n,l.first);

dfs(1,1,n,1);

return 0;

}

若 \(a\) 操作最後一次,則 \(a\) 必勝

那麼就考慮 \(b\) 獲勝的條件

發現只有最後剩下至少 \(1\) 個奇數時, \(b\) 才能獲勝

又發現奇數的個數只會變少不會變多

於是 \(a\) 的操作策略就是盡可能的消除奇數

於是只用判斷最後能否消完奇數

發現無論如何 \(b\) 都無法將一串連續的 \(1\) 分開

而且 \(b\) 的操作一定不會減少 \(a\) 的操作次數

於是只需要統計出 \(a\) 消完這些連續的 \(1\) 的次數

code

#include#define int long long//overflow !!! memory limit !!!

#define rint signed

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int t,n,m,cnt;

int a[100010];

inline void solve()

if(cnt<=(n-1)/2) puts("a");else puts("b");

}signed main()

先套路的轉化一下,每個聯通塊的點數減去邊數等於 \(1\)

那麼,詢問的答案就是這一段區間覆蓋的點數減去覆蓋的邊數

考慮離線下來做,對於當前維護的右端點 \(r\)

只需要知道有多少點的覆蓋時間大於等於詢問的 \(l\) 就行了

可以用樹狀陣列維護覆蓋時間大於等於 \(i\) 的點的個數

然後再看修改,相當於區間賦值,可以用珂朵莉樹實現

每次修改將原來的減去,再加上新的貢獻

由於只有區間賦值操作,所有複雜度是正確的

對覆蓋的點和邊分別做一次就行了

code#include#define lowbit(x) x&-x

#define int long long//overflow !!! memory limit !!!

#define rint signed

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m,q;

int x[100010],y[100010],ans[100010];

int head[100010],ver[200010],to[200010],tot;

int dfn[100010],top[100010],siz[100010],son[100010],fa[100010],dep[100010],clo;

vector>vec[100010];

inline void add(int x,int y)

void dfs1(int x,int fa,int dep)

}void dfs2(int x,int topf)

}namespace bit

inline void upd(int x,int k)

inline int query(int x)

}namespace odt);}

inline set::iterator split(int pos));

if(iter!=st.end()&&iter->l==pos) return iter;

iter--;data tmp=*iter;st.erase(iter);

st.insert((data));

return st.insert((data)).first;

} inline void upd(int l,int r,int k));bit::upd(k,r-l+1); }}

inline void tupd(int x,int y,int k,bool op)

signed main(){

#ifdef local

freopen("in","r",stdin);

freopen("out","w",stdout);

#endif

freopen("tree.in","r",stdin);

freopen("tree.out","w",stdout);

n=read(),m=read(),q=read();

for(int i=1,x,y;i

省選模擬34

考慮貪心,首先如果某個位置的權值小於0,並且前面能夠抵消掉,那麼他就不會對前面產生影響。所以說,從後向前掃一遍,將負權值塞入堆中,用大根堆維護當前是否可以刪掉堆頂元素。最後將詢問離線,掃一遍即可。似乎是個亂搞題?我的做法是,對於每種權值,維護當前能夠加入聯通塊的所有點,再維護每種權值當前在聯通塊中的...

省選模擬34

t1想到暴力貪心,然後猜了乙個性質,詢問排序繼承刪掉的點,用線段樹優化,肝了好久然後拍偽了。最後快讀還沒有開ll然後爆零。然後乙個小時三道題來回看 最後t2有思路,還剩乙個小時,瘋狂碼碼碼拍拍拍,由於生成的資料k太大過水,以為ac了。t3真的算棄了。t1對於 a i 0 的情況,順序沒有影響,排序後...

省選模擬 19 09 11

ps.博主趁資訊課摸魚考的暴零模擬 看門人憑感覺就知道是長鏈剖分,將路徑查分一下,dis u di sv 2 dis lc adis u dis v 2 dis disu disv 2 disl ca 維護fu,if fu,i 表示u的子樹,深度為 i 的點的 dis disdi s最大值 考慮如何...