Codeforces 197

197 A

题意

给一张长为a,宽为b的桌子。设有无数张半径为r的圆形纸片。有两个人在桌子上放纸片,之前已放好的纸片不能挪动位置,纸片在放的时候不能相交但可以外切且不能超过桌子的边界,谁放不了谁就输了。问先放的人是否一定能赢,若是输出“First”,否则输出“Second”。所有数 \(\le 100\)

Examples

Input
3
1 3
2 3
0 0
1 1
2 0
Output
1 3 2
Input
4
1 2
2 3
1 4
-1 -2
3 5
-3 3
2 0
Output
4 2 1 3

197 D

题意

去掉“多组测试数据”

Examples

Input

5 4
##.#
##S#
#..#
#.##
#..#

Output

Yes

Input

5 4
##.#
##S#
#..#
..#.
#.##

Output

No

如果出现一个点使得vis[x%n][y%m]==true&&!(x==x%n&&y==y%m),就Yes;否则No

197 E

题意

平面上有 \(n\) 个点,现在有一棵树,要求在平面上画出这棵树,边不能相交。保证有解。(1\le n\le 1500)

Examples

Input
3
1 3
2 3
0 0
1 1
2 0
Output
1 3 2
Input
4
1 2
2 3
1 4
-1 -2
3 5
-3 3
2 0
Output
4 2 1 3

在dfn序列上分治。
对于一段区间,选定根节点所在的点为这些点中最左端的点。(重要)
然后按极角将剩余点排序,“按需(子树大小)分配”给当前根节点的所有子节点。
极角排序方法:叉积<0

Code

#include<bits/stdc++.h>
#define maxn 1503
using namespace std;
struct edge{
    int to,next;
}e[maxn<<1];
int head[maxn],cnte;
void add(int u,int v){
    e[++cnte].to=v;
    e[cnte].next=head[u];
    head[u]=cnte;
}
int n,dfn[maxn],cntdfn,rig[maxn],ans[maxn];
struct point{
    long long x,y;
    int num;
    point(){}
    point(long long _x,long long _y,int _num=0):x(_x),y(_y),num(_num){}
    point operator -(const point& pnt)const{return point(x-pnt.x,y-pnt.y,num);}
    long long cross(const point& pnt)const{return x*pnt.y-y*pnt.x;}
    bool operator <(const point& pnt)const{return cross(pnt)>0;}
}a[maxn];
bool cmp(const point& pnt1,const point& pnt2){
    return pnt1.x==pnt2.x?pnt1.y>pnt2.y:pnt1.x<pnt2.x;
}
void init(int u,int last){
    dfn[u]=++cntdfn;
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(v==last)continue;
        init(v,u);
    }
    rig[u]=cntdfn;
}
void dfs(int u,int last,int l,int r){
    sort(a+l,a+r+1,cmp);
    ans[a[l].num]=u;
    for(int i=l+1;i<=r;i++)a[i]=a[i]-a[l];
    sort(a+l+1,a+r+1);
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(v==last)continue;
        dfs(v,u,dfn[v],rig[v]);
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i].x,&a[i].y),a[i].num=i;
    init(1,0);
    dfs(1,0,1,n);
    for(int i=1;i<=n;i++)printf("%d ",ans[i]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/BlogOfchc1234567890/p/10369735.html
今日推荐