bzoj3693 圓桌會議(Hall定理 線段樹)

2021-08-16 04:30:59 字數 1520 閱讀 4144

題解:傳送門

要求任意子集均滿足,我們考慮對於每乙個區間[p,q](顯然只有q=

ri時這個區間才有詢問的意義,同時我們也有p=

lj),所有[l,r]在[p,q]之內的a的和s應滿足s<=q-p+1即s+p-1<=q,否則一定不滿足hall定理。於是我們把所有的區間按r公升序排列,考慮列舉q,維護p=

lj時的答案,我們每次做到區間[l,r]時,所有p=1…l的和s都增大了a,然後我們查詢1…r的最大值是否<=r-l+1,用線段樹維護即可。

把環複製一遍變成鏈的情況,注意特判掉詢問總區間的情況,具體證明可見神犇blog

#include 

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define inf 0x3f3f3f3f

#define n 100010

inline ll read()

while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

return x*f;

}int n,m,a[n<<2];

struct quertr[n<<4];

inline

void pushup(int p)

inline

void build(int p,int l,int r)

int mid=l+r>>1;

build(p<<1,l,mid);build(p<<1|1,mid+1,r);pushup(p);

}inline

void doadd(int p,int val)

inline

void pushdown(int p)

inline

void add(int p,int l,int r,int x,int y,int val)

int mid=l+r>>1;pushdown(p);

if(x<=mid) add(p<<1,l,mid,x,y,val);

if(y>mid) add(p<<1|1,mid+1,r,x,y,val);

pushup(p);

}inline

int qmax(int p,int l,int r,int x,int y)

int main()if(sum>m)n=tot;tot=0;

for(int i=1;i<=n;++i) a[++tot]=q[i].l,a[++tot]=q[i].r;

sort(a+1,a+tot+1);tot=unique(a+1,a+tot+1)-a-1;

build(1,1,tot);sort(q+1,q+n+1);bool flag=1;

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

}puts(flag?"yes":"no");

}return

0;}

1214 圓桌會議

problem description hdu acm集訓隊的隊員在暑假集訓時經常要討論自己在做題中遇到的問題.每當面臨自己解決不了的問題時,他們就會圍坐在一張圓形的桌子旁進行交流,經過大家的討論後一般沒有解決不了的問題,這也只有hdu acm集訓隊特有的圓桌會議,有一天你也可以進來體會一下哦 在一...

HDU 1214圓桌會議

description hdu acm集訓隊的隊員在暑假集訓時經常要討論自己在做題中遇到的問題.每當面臨自己解決不了的問題時,他們就會圍坐在一張圓形的桌子旁進行交流,經過大家的討論後一般沒有解決不了的問題,這也只有hdu acm集訓隊特有的圓桌會議,有一天你也可以進來體會一下哦 在一天在討論的時候,...

hdu 1124 圓桌會議

主題思想 數學題,給乙個串數字組成乙個環,12345 n 經過有限次相鄰作為的對換,變成 1,n,n 1,n 2,2 如果是乙個直線,不是乙個環,根據直線長度n 需要的次數為n 1 n 2 n 3 1.為 n n 1 2 把乙個環盡可能分成長度相等的兩段,分別計算兩段直線的次數,和就是最小的操作。參...