0%

思路讲解

这种题目就是要多想,多写,想办法去除绝对值。

把式子写下来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    ll dis=ask('U',mod);
sort(all(A),[&](Point a,Point b){
return 2*2*mod-a.x()-a.y() < 2*2*mod-b.x()-b.y();
});
Point a=A[0];
// 知道了x+y是多少
// mod*2+X+mod*2+Y-a.x()-a.()=dis
ll XY=dis-2*2*mod+a.x()+a.y();
// #ifdef LOCAL
// debug(XY);
// #endif
ask('D',mod);
ask('D', mod);
ask('D',mod);
ll dis2=ask('D', mod);
sort(all(A),[&](Point a,Point b){
return 2*2*mod-a.x()+a.y() < 2*2*mod-b.x()+b.y();
});
a=A[0];
// X+2*mod-x+y-(Y-2*mod)=dis2
// dis2+x-y-2*2*mod
ll X_Y=dis2+a.x()-a.y()-2*2*mod;

AC代码

https://codeforces.com/contest/2136/submission/336079080

心路历程(WA,TLE,MLE……)

思路讲解

The Doors 的想法,跑dij。

感觉可以套用这个做法,把距离都变成1,就是要开多少门。

AC代码

https://vjudge.net/solution/63304444

https://vjudge.net/problem/UVA-754

这道题目的UVA版本好像还加了数据,继续测一下。

搞了半天是格式问题,要换两次行。

image

https://vjudge.net/solution/63313110

心路历程(WA,TLE,MLE……)

思路讲解

可以假设顶层木棍不超过1000根。

这句话比较重要。于是我们选择去维护这个顶层木棍,不断用上面的木棍去看这些木棍是不是顶层木棍。

核心代码长这样。

1
2
3
4
5
6
7
8
9
10
11
12
FOR(i,0,N-1){
Line a=A[i];
for(auto it=ans.begin();it!=ans.end();){
Line t=A[*it];
auto nit=next(it);
if(isseginterline(a,t) && isseginterline(t,a)){
ans.erase(it);
}
it=nit;
}
ans.EB(i);
}

AC代码

https://vjudge.net/solution/63275995

心路历程(WA,TLE,MLE……)

思路讲解

image

可以用dij做。搜索做不太了。

先建边,然后再跑dij,会快一些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
auto check=[&](Line a){
int idx=lower_bound(all(A),Line(a.a,Point(INF,INF)))-A.begin();
bool ok=true;
FOR(i,idx,SZ(A)-1){
Line t=A[i];
if(sgn(t.a.x()-a.b.x())>=0) break;
if(isseginterline(t, a)){
ok=false;
break;
}
}
return ok;
};
vb vis(node.size()+5);
vector<vector<pair<ld,int> > > g(SZ(node)+5);
priority_queue<DIS> pq;
pq.EM(0,0);
FOR(i,0,SZ(node)-1){
FOR(j,i+1,SZ(node)-1){
if(node[i].x()==node[j].x()){
continue;
}
Point a=node[i],b=node[j];
if(check(Line(a,b))){
g[i].emplace_back(abs(a-b),j);
}
}
}

AC代码

https://vjudge.net/solution/63271204

心路历程(WA,TLE,MLE……)

思路讲解

image

详细解释了一下这个式子是怎么来的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// p+tv=q+sw
// (p-q) x w+tv x w = 0
// t=-(p-q)x w/(vxw)
// 传入的是方向式
Point getintersect(Point p,Point v,Point q,Point w){
Point u=p-q;
ld t=cross(w,u)/cross(v,w);
return p+v*t;
}
inline void __(){
Point a,b,c,d;
cin>>a>>b>>c>>d;
Point ab=b-a,cd=d-c;
if(!sgn(cross(ab,cd))){
Point bc=c-b,ad=d-a;
if(!sgn(cross(bc, ad))){
cout<<"LINE\n";
return;
}
cout<<"NONE\n";
return;
}
Point res=getintersect(a, ab, c, cd);
cout<<"POINT "<<fsp(2)<<res.real()<<" "<<res.imag()<<"\n";
}

AC代码

https://vjudge.net/solution/63256517

心路历程(WA,TLE,MLE……)