zoukankan      html  css  js  c++  java
  • 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) 个点,现在有一棵树,要求在平面上画出这棵树,边不能相交。保证有解。(1le nle 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;
    }
    
  • 相关阅读:
    HDOJ1269 迷宫城堡
    最长公共子序列 nyoj36
    HDU1081 To The Max 求子矩阵最大和
    nyoj20 吝啬的国度
    景观分析工具:arcgis中patch analysis模块
    景观格局动态变化分析方法(基于ArcGIS、Fragstats、ENVI、ERDAS、Patch Analysis for ArcGIS) (20110315 08:07:03)
    从C#到Python —— 谈谈我学习Python一周来的体会
    如何判定多边形是顺时针还是逆时针
    超新星与暗能量的发现--今年诺贝尔物理奖工作的介绍(转)
    怎样把扫描好的身份证打印出实际大小
  • 原文地址:https://www.cnblogs.com/BlogOfchc1234567890/p/10369735.html
Copyright © 2011-2022 走看看