題意:給定n c k 和序列ai(1-n) 求最長的區間長度 使得 該區間中所有出現的元素 的個數為0或》=k 所有數字都在1-c的範圍內
題解:畫個圖思路就很清晰了 非常好的線段樹題
注意維護最值下標的方式
#includeusingview codenamespace
std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ri(n) scanf("%d",&(n))
#define rii(n,m) scanf("%d%d",&n,&m)
#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define rs(s) scanf("%s",s);
#define ll long long
#define lson l,m,pos<<1
#define rson m+1,r,pos<<1|1
#define pb push_back
#define rep(i,n) for(int i=0;i
#define clr(a,v) memset(a,v,sizeof a)
/////////////////////////////////
/#define inf 0x3f3f3f3f
const
int n=1e5+5
;int t[n<<2],col[n<<2],x[n<<2
];int
c,k,n,m;
vector
v[n];
void up(int
pos)
void down(int
pos)
}void build(int l,int r,int
pos)
int m=(l+r)>>1
;build(lson);build(rson);up(pos);
}void upsum(int l,int r,int v,int l,int r,int
pos)
int m=(l+r)>>1
;down(pos);
if(l<=m)upsum(l,r,v,lson);
if(r>m)upsum(l,r,v,rson);
up(pos);
}int qsum(int l,int r,int l,int r,int
pos)
int m=(l+r)>>1
;down(pos);
if(l<=m)//
這裡一定要注意細節
if(r>m)return
qsum(l,r,rson);
return0;
}int
c;int
main()
cout
}return0;
}
多校聯訓2
將前 n 個正整數,分成 m 個集合裡,應該是按照第二類斯特林數的類別分的 然後乙個劃分是好的,當且僅當存在 m 的圓排列。然後求好的劃分的數量,我們考慮乙個問題的轉化,我們乙個集合 a 可以向另乙個集合連邊 b 當且僅當,max a min b 容易發現這樣的邊至少是單向的。也就是說,如果我們把所...
2016多校聯賽2
d.題意 給2組資料a和b陣列,每次有2種操作 l,r,x 把a陣列第l個到第r個元素全置為x,l,r 查詢 l,r 之間哪些位置滿足a i b i i l i r 並把這些位置的數量統計 一直想很久,沒想到什麼有效的方案,直到看到題解才明白過來,原來線段樹套平衡樹還有這種情況 裡面其實不是平衡樹,...
2018多校聯合訓練2
打的慘不忍睹,就過了3題 1004 水題,直接輸出yes就過了,solved by lyy include using namespace std define ll long long int n int main return 0 1010 逆序對 min x,y 隊友一開始wa了4發,給了他模...