scu oj 4445 Right turn 2015年四川省赛J题(模拟题)

一般的模拟题。对于出现过的每一个x建立一个set 集合,对于y也如此。然后查找要走到哪个点即可,主要要对状态记录,判断是否无线循环,否者出现无线循环的情况,就tle了。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<queue>
#include<cmath>
#include<map>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
const int mmax = 500010;
const int inf=0x3fffffff;
struct node
{
    int x,y;
    void read()
    {
        scanf("%d %d",&x,&y);
    }
    node(int x,int y):x(x),y(y) {}
    node() {}
    bool operator < (const node &a) const
    {
        if(x==a.x)
            return y<a.y;
        return x<a.x;
    }

}P[2100];
map<int,int>qx,qy;
set<int> Sx[2100],Sy[2100];
int dir[4][2]={1,0,0,-1,-1,0,0,1};
map<node,int>q;
bool vis[10100][4];
bool fuck(int x,int y)
{
    int cnt=0;
    for(int i=0;i<4;i++)
    {
        int tx=x+dir[i][0];
        int ty=y+dir[i][1];
//        if(x==0 && y==0)
//        {
//            cout<<tx<<" "<<ty<<endl;
//        }
        if(qx.count(tx)  &&  Sx[qx[tx]].count(ty))
        {
            //cout<<tx<<" "<<ty<<endl;
            cnt++;
        }
    }
    //cout<<"fuck"<<endl;
    return cnt==4;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        qx.clear();
        qy.clear();
        for(int i=0;i<1100;i++)
            Sx[i].clear(),Sy[i].clear();
        int cntx=0,cnty=0;
        for(int i=0;i<n;i++)
        {
            P[i].read();
            if(!qx.count(P[i].x))
                qx[P[i].x]=cntx++;
            if(!qy.count(P[i].y))
                qy[P[i].y]=cnty++;
            Sx[ qx[P[i].x]  ].insert(P[i].y);
            Sy[ qy[P[i].y]  ].insert(P[i].x);
            //if(P[i].x==1 && P[i].y==0)
                //cout<<qx [1]<<endl;
                //cout<<Sx[0].count(0)<<endl;
        }
        //cout<<qx[1]<<endl;
        //cout<<"fuck"<<endl;
        int nowx=0,nowy=0,nowdir=0;
        q.clear();
        int cc=0;
        int cnt=0;
        bool fg=1;
        memset(vis,0,sizeof vis);
        while(1)
        {

            //cout<<nowx<<" "<<nowy<<" "<<nowdir<<endl;
            if(!q.count(node(nowx,nowy)))
                q[node(nowx,nowy)]=cc++;
            if(vis[q[node(nowx,nowy)]][nowdir])
            {
                fg=0;
                break;
            }
            else
                vis[q[node(nowx,nowy)]][nowdir]=1;

            if(nowdir==0)
            {
                if(!qy.count(nowy))
                    break;
                set<int>::iterator it;
                if(fuck(nowx,nowy))
                {
                    fg=0;
                    break;
                }
                it=Sy[ qy[nowy] ].upper_bound(nowx);
                if(it!=Sy[ qy[nowy] ].end())
                {
                    int tx=*it;
                    tx--;
                    nowx=tx;
                    nowdir++;
                    nowdir%=4;
                    cnt++;
                }
                else
                    break;
            }
            else if(nowdir==1)
            {
                if(!qx.count(nowx))
                    break;
                set<int>::iterator it;
                if(fuck(nowx,nowy))
                {
                    fg=0;
                    break;
                }
                it=Sx[ qx[nowx] ].lower_bound(nowy);
                if(it!=Sx[ qx[nowx] ].begin())
                {
                    it--;
                    int ty=*it;
                    ty++;
                    nowy=ty;
                    nowdir++;
                    nowdir%=4;
                    cnt++;
                }
                else
                    break;
            }
            else if(nowdir==2)
            {
                if(!qy.count(nowy))
                    break;
                set<int>::iterator it;
                if(fuck(nowx,nowy))
                {
                    fg=0;
                    break;
                }
                it=Sy[ qy[nowy] ].lower_bound(nowx);
                if(it!=Sy[ qy[nowy] ].begin())
                {
                    it--;
                    int tx=*it;
                    tx++;
                    nowx=tx;
                    nowdir++;
                    nowdir%=4;
                    cnt++;
                }
                else
                    break;

            }
            else if(nowdir==3)
            {
                if(!qx.count(nowx))
                    break;
                set<int>::iterator it;
                if(fuck(nowx,nowy))
                {
                    fg=0;
                    break;
                }
                it=Sx[ qx[nowx] ].upper_bound(nowy);
                if(it!=Sx[ qx[nowx] ].end())
                {
                    int ty=*it;
                    ty--;
                    nowy=ty;
                    nowdir++;
                    nowdir%=4;
                    cnt++;
                }
                else
                    break;
            }
        }
        if(!fg)
            puts("-1");
        else
            printf("%d\n",cnt);

    }
    return 0;
}
时间: 2024-10-10 00:42:23

scu oj 4445 Right turn 2015年四川省赛J题(模拟题)的相关文章

scu oj 4437: Carries (2015年四川省程序ACM设计竞赛B题目 )

其实这题只要想到这个结论就简单了.如果2个数a,b的第k位相加要进位,那么必须满足(a%10^k+b%10^k)>=10^k  .有了这个结论就很简单了,枚举没一位就好了. #include<stdio.h> #include<string.h> #include<iostream> #include<string> #include<queue> #include<cmath> #include<map> #inc

SCU 4436 Easy Math 2015年四川省赛题

题目链接:http://acm.scu.edu.cn/soj/problem/4436/ 题意:给你n个整数,求这n个数的平方根和是否是一个整数: 解题思路:如果这题每个数给他算出来,必然费时间,可能还会超精度,所以巧妙的方法就是判断这些整数是否全是完全平方数,如果有一个不是,则他们的平方根和肯定不是一个整数. AC代码: #include <cstdio> #include <cmath> #include <cstring> #include <algorit

hihocoder 1236(2015北京网络赛 J题) 分块bitset乱搞题

题目大意: 每个人有五门课成绩,初始给定一部分学生的成绩,然后每次询问给出一个学生的成绩,希望知道在给定的一堆学生的成绩比这个学生每门都低或者相等的人数 因为强行要求在线查询,所以题目要求,每次当前给定的学生成绩都异或上一次的答案 先将学生按每一门成绩都排一次序 这里将学生分块成sqrt(n)的块数,然后在当前块中用bitset容器来记录含有学生的状态 这里可以记录状态的前缀和,因为比后面成绩好的,必然比前面的学生的成绩也好 查询的时候只要查到正好比他高的学生属于哪一块,这样只要访问sqrt(n

hdu 5446(2015长春网络赛J题 Lucas定理+中国剩余定理)

题意:M=p1*p2*...pk:求C(n,m)%M,pi小于10^5,n,m,M都是小于10^18. pi为质数 M不一定是质数 所以只能用Lucas定理求k次 C(n,m)%Pi最后会得到一个同余方程组x≡B[0](mod p[0])x≡B[1](mod p[1])x≡B[2](mod p[2])......解这个同余方程组 用中国剩余定理 Sample Input19 5 23 5 Sample Output6 1 # include <iostream> 2 # include <

hdu 5288||2015多校联合第一场1001题

http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know ∑i

2015北京网络赛A题The Cats&#39; Feeding Spots

题意:给你一百个点,找个以这些点为中心的最小的圆,使得这个圆恰好包含了n个点,而且这个圆的边界上并没有点 解题思路:暴力枚举每个点,求出每个点到其他点的距离,取第n大的点,判断一下. 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #include<iostream> 5 #include<memory.h> 6 using namespace std; 7 const i

2015北京网络赛 Couple Trees 倍增算法

2015北京网络赛 Couple Trees 题意:两棵树,求不同树上两个节点的最近公共祖先 思路:比赛时看过的队伍不是很多,没有仔细想.今天补题才发现有个 倍增算法,自己竟然不知道.  解法来自 qscqesze ,这个其实之前如果了解过倍增的话还是不是很难,不过这题的数据也不是很给力,极限数据理论上是过不了的.  其他解法有树链剖分?并不是很清楚.就这样水过了吧... 1 #include <iostream> 2 #include <cstdio> 3 #include &l

2015沈阳网络赛1003 Minimum Cut 树链剖分 数组维护前缀和进行区间增减

2015沈阳网络赛1003  Minimum Cut   树链剖分 数组维护前缀和进行区间增减 Minimum Cut Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Given a simple unweighted graph G 

2015北京网络赛 D-The Celebration of Rabbits 动归+FWT

2015北京网络赛 D-The Celebration of Rabbits 题意: 给定四个正整数n, m, L, R (1≤n,m,L,R≤1000). 设a为一个长度为2n+1的序列. 设f(x)为满足x≤ai≤m+x且ai的异或和为0 的序列a的个数. 求 ∑Rx=Lf(x)mod1000000007 思路:因为对于每一个第一次分配后的a序列对应唯一的x,所以我们就枚举x然后在求序列的个数.