然後再線段樹分治一下
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最大值 考慮如何...