FJ省隊集訓DAY3 T1

2022-05-09 01:33:12 字數 4086 閱讀 1827

思路:我們考慮如果取掉乙個部分,那麼能影響到最優解的只有離它最近的那兩個部分。

我講的貌似不是很清楚。。

還有,蜜汁80分,打死也改不出來。。

1 #include2 #include3 #include4 #include5 #include6

struct

nodea[1200005];9

struct

segment

12 segment(int l0,int r0,int

v0):l(l0),r(r0),v(v0){}

13 }t[5000005

];14

struct

treaptt[5000005

];17

int tag[5000005],vis[1000005

],tcase;

18int len[1000005],next[1500005],before[1500005],pos[1000005],heap[1000005

];19

int o[1500005],p[1000005],sz,id[1000005],pls[1500005

];20

int c[2500005],cnt,sb,rt1[1500005],rt2[1500005],all[500006

];21

inttot,n,len;

22int

read()

25while ('0'

<=ch&&ch<='9')

26return t*f;27}

28bool

cmp(node a,node b)

31void push_up(int

x)37}38

void push_down(int

x)49 x=j;50}

51}52void add_heap(int x,int

v)58

void delete_heap(int

x)66

void modify_heap(int x,int

y)71

void build(int k,int l,int

r)77

int mid=(l+r)>>1

;78 build(k*2

,l,mid);

79 build(k*2+1,mid+1

,r);

80 t[k].v=t[k*2].v+t[k*2+1

].v;

81 t[k].l=std::min(t[k*2].l,t[k*2+1

].l);

82 t[k].r=std::max(t[k*2].r,t[k*2+1

].r);83}

84void pushdown(int k,int l,int

r)92

void modify(int k,int l,int r,int x,int

y)104

int mid=(l+r)>>1

;105

if (y<=mid) modify(k*2

,l,mid,x,y);

106else

107if (x>mid) modify(k*2+1,mid+1

,r,x,y);

108else modify(k*2,l,mid,x,mid),modify(k*2+1,mid+1,r,mid+1

,y);

109 t[k].v=t[k*2].v+t[k*2+1

].v;

110 t[k].l=std::min(t[k*2].l,t[k*2+1

].l);

111 t[k].r=std::max(t[k*2].r,t[k*2+1

].r);

112}

113 segment query(int k,int l,int r,int x,int

y)119

int mid=(l+r)>>1

;120

if (y<=mid) return query(k*2

,l,mid,x,y);

121else

122if (x>mid) return query(k*2+1,mid+1

,r,x,y);

123else

128}

129int find(int

x)137

}138

void

sbpianfen1()

152 len=sz;

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

154 a[i].l=find(a[i].l),a[i].r=find(a[i].r);

155 build(1,1

,len);

156 a[n+1].cnt=0x7fffffff

;157

while (t--)

167}

168}

169void lturn(int &k)

173void rturn(int &k)

177void insert(int &k,int

v)185

if (tt[k].v==v)

186if (tt[k].v

193}

194void del(int &k,int

v)203

if (tt[tt[k].l].rnd

210return

;211

}212

if (tt[k].v

213else

del(tt[k].l,v);

214}

215int find_treap(int

k)219

bool findit(int k,int

x)225

void

gwork()

228void updata(int x,int

id)243

void

sbpianfen3()

255 len=sz;

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

257 a[i].l=find(a[i].l),a[i].r=find(a[i].r),insert(rt1[a[i].l],i),insert(rt2[a[i].r],i);

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

259 pls[a[i].id]=i;

260for (int i=2;i<=n;i++) before[i]=i-1

;261

for (int i=1;i1

;262

int t=n;

263 build(1,1

,len);

264while (t--)

274if (tcase==2872

) gwork();

275 modify(1,1

,len,a[pls[x]].l,a[pls[x]].r);

276if (before[pls[x]]) updata(before[pls[x]],1

);277

if (next[pls[x]]) updata(next[pls[x]],2

);278

int t1=before[pls[x]],t2=next[pls[x]];

279 next[t1]=t2;

280 before[t2]=t1;

281}

282}

283int

main()

286sbpianfen3();

287fclose(stdin);fclose(stdout);

288return0;

289 }

FJ省隊集訓DAY1 T1

題意 有一堆兔子,還有乙個r為半徑的圓,要求找到最大集合滿足這個集合裡的兔子兩兩連邊的直線不經過圓。思路 發現如果有兩個點之間連邊不經過圓,那麼他們到圓的切線會構成一段區間,那麼這兩個點的區間一定會有交集,形如s0 s1 e0 e1 同樣的,如果是n個點,那就是s0 s1 s2.sn e0 e1 e...

FJ省隊集訓DAY3 T2

思路 如果乙個dag要的路徑上只要一條邊去切掉,那麼要怎麼求?很容易就想到最小割,但是如果直接做最小割會走出重複的部分,那我們就這樣 反向邊設為inf,這樣最小割的時候就不會割到了,判斷無解我們直接用tarjan 1 include2 include3 include4 include5 inclu...

NOI2018湖北省隊集訓Day3 T1 貪婪人

題面 得分情況 爆零。正解 我們用dp n m w 表示在n m的網格中,貪心路徑權值為w的方案數,轉移時列舉向右和向下,時間複雜度o h w s2 o h w s 2 能過70 的資料。我們首先可以通過維護字首和去掉乙個s,將複雜度降為o h w s o h w s 然後你還是只能過70 的點。我...