思路:我們考慮如果取掉乙個部分,那麼能影響到最優解的只有離它最近的那兩個部分。
我講的貌似不是很清楚。。
還有,蜜汁80分,打死也改不出來。。
1 #include2 #include3 #include4 #include5 #include6struct
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 的點。我...