CodeForces - 197D

 

开场连wa三发A题,差点心态崩了,还好坚持打完了,一共A了三题

A题,判断能不能放第一个圆,能放的话,先手比赢

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-7;
const int N=1000+10,maxn=500+100,inf=0x3f3f3f;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int a,b,r;
    cin>>a>>b>>r;
    if(a>=2*r&&b>=2*r)cout<<"First"<<endl;
    else cout<<"Second"<<endl;
    return 0;
}
/*********************

*********************/
A

B题,数学题,模拟一下就好了,注意符号一定要在第一个位置,刚开始用gcd负号在第二个数那里了wa了一发

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-12;
const int N=100000+10,maxn=500+100,inf=0x3f3f3f;

int gcd(int a,int b)
{
    return b ? gcd(b,a%b):a;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m,a,b,a1,b1;
    cin>>n>>m;
    for(int i=0;i<=n;i++)
    {
        cin>>a;
        if(i==0)a1=a;
    }
    for(int i=0;i<=m;i++)
    {
        cin>>b;
        if(i==0)b1=b;
    }
    if(n>m)
    {
        if(a1*b1>0)cout<<"Infinity"<<endl;
        else cout<<"-Infinity"<<endl;
    }
    else if(n<m)cout<<"0/1"<<endl;
    else
    {
        int x=gcd(a1,b1);
        a1/=x;b1/=x;
        if(a1*b1<0)cout<<"-"<<abs(a1)<<"/"<<abs(b1)<<endl;
        else cout<<abs(a1)<<"/"<<abs(b1)<<endl;
    }
    return 0;
}
/*********************

*********************/
B

C题才是最水的题。。。搞一个记录最大的数组从后往前扫一边就出来了

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-12;
const int N=100000+10,maxn=500+100,inf=0x3f3f3f;

int maxx[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    cin>>s;
    maxx[s.size()]=0;
    for(int i=s.size()-1;i>=0;i--)
        maxx[i]=max(maxx[i+1],s[i]-'0');
    string ans="";
    for(int i=0;i<s.size();i++)
    {
        if(maxx[i]==s[i]-'0')ans+=s[i];
    }
    cout<<ans<<endl;
    return 0;
}
/*********************

*********************/
C

D题,dfs,如果一个点能从两个方向到达的话,那就输出yes,用一个数组记录到达的位置

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-7;
const int N=1500+10,maxn=500+100,inf=0x3f3f3f;

char ma[N][N];
int dx[4]= {1,0,-1,0};
int dy[4]= {0,1,0,-1};
bool vis[N][N];
int n,m,sx,sy;
pair<int,int>v[N][N];
bool ok(int x,int y)
{
    if(ma[x][y]=='.'&&!vis[x][y])return 1;
    return 0;
}
void dfs(int x,int y)
{
    int fx=x,fy=y;
    while(fx<0)fx+=n;
    fx%=n;
    while(fy<0)fy+=m;
    fy%=m;
    if(vis[fx][fy]&&(v[fx][fy].first!=x||v[fx][fy].second!=y))
    {
        cout<<"Yes"<<endl;
        exit(0);
    }
    if(!ok(fx,fy))return ;
    vis[fx][fy]=1;
    v[fx][fy]=make_pair(x,y);
    for(int i=0;i<4;i++)
        dfs(x+dx[i],y+dy[i]);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>ma[i][j];
            if(ma[i][j]=='S')
            {
                sx=i;
                sy=j;
                ma[i][j]='.';
            }
        }
    }
    memset(vis,0,sizeof vis);
    dfs(sx,sy);
    cout<<"No"<<endl;
    return 0;
}
/*********************
5 5
##.##
#..##
..###
.#S..
##.##
*********************/
D

 E题,计算几何,极角排序,先dfs一遍预处理出每个节点有多少子节点,然后dfs一遍,每个区间进行极角排序(刚开始以为只需要一遍极角排序就行了,后来

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-12;
const int N=2000+10,maxn=500+100,inf=0x3f3f3f;

struct point {
    double x,y;
    int id;
}p[N];
point p0;
vector<int>v[N];
int sz[N],ans[N];
bool comp(point p1,point p2)
{
    double te=(p2.x-p0.x)*(p1.y-p0.y)-(p2.y-p0.y)*(p1.x-p0.x);
    if(te<0)return 1;
    return 0;
}
void dfs(int u,int fa)
{
    sz[u]=1;
    for(int i=0;i<v[u].size();i++)
        if(v[u][i]!=fa)
        {
            dfs(v[u][i],u);
            sz[u]+=sz[v[u][i]];
        }
}
void dfssort(int u,int fa,int be,int en)
{
    for(int i=be;i<en;i++)
       if(p[i].x<p[be].x||(p[i].x==p[be].x&&p[i].y<p[be].y))
          swap(p[i],p[be]);
    p0=p[be];
    ans[p[be].id]=u;
    sort(p+be+1,p+en,comp);
    int te=be;
    for(int i=0; i<v[u].size(); i++)
    {
        if(v[u][i]!=fa)
        {
            dfssort(v[u][i],u,te+1,te+sz[v[u][i]]+1);
            te+=sz[v[u][i]];
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    for(int i=0;i<n;i++)
    {
        cin>>p[i].x>>p[i].y;
        p[i].id=i+1;
    }
    dfs(1,-1);
   // for(int i=1;i<=n;i++)cout<<sz[i]<<endl;
    dfssort(1,-1,0,n);
    for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
    cout<<endl;
    return 0;
}
/*********************
3
1 3
2 3
0 0
1 1
2 0
*********************/
E

 

发现这样子节点可能会坐标倒回来,有可能相交)

posted @ 2017-07-20 14:35  walfy  阅读(175)  评论(0编辑  收藏  举报