• 2019正睿CSP-S模拟赛十连测day8


    2019正睿CSP-S模拟赛十连测day8

    link to this contest

    这场题做的体验一般,没有“探索中求进步”的思考快感,会做的直接做,不会做的一点思路都没有,晚了半个小时开始,提早一个小时结束操作

    $T1$转化以下题意直接模拟,$T2$完全不会,去看$T3$,看来看去都只会$50$的部分分,感觉也不少了就写完放弃了,回去把$T2$暴力写了就走人了

    最终得分$100+30+50=180 (rank=15)$

    A. 许强强

    • 走完一步后构成一个新区域的充要条件是,这条边第一次走且去到的那个点已经去过
    • 直接用$map$当作$vis$数组做即可,复杂度$O(n log n)$
     1 #include<bits/stdc++.h>
     2 #define FOR(i,a,b) for (register int i=(a);i<=(b);i++)
     3 #define For(i,a,b) for (register int i=(a);i>=(b);i--)
     4 #define mem(i,j) memset(i,j,sizeof(i))
     5 #define fi first
     6 #define se second
     7 #define pb push_back
     8 #define MP make_pair
     9 #define pii pair<int,int>
    10 using namespace std;
    11 typedef long long ll;
    12 const int N=5e5+5;
    13 int n,tot=0,ans=0;
    14 char s[N];
    15 int fx[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
    16 struct point
    17 {
    18     int x,y;
    19 }a[N];
    20 map <pair<point,point>,int> mp;
    21 map <point,int> vis;
    22 bool operator <(point x,point y)
    23 {
    24     if (x.x==y.x) return x.y<y.y;
    25     return x.x<y.x;
    26 }
    27 bool operator ==(point x,point y)
    28 {
    29     if (x.x==y.x&&x.y==y.y) return 1;
    30     else return 0;
    31 }
    32 bool operator <(pair<point,point> x,pair<point,point> y)
    33 {
    34     if (x.fi==y.fi) return x.se<y.se;
    35     return x.fi<y.fi;
    36 }
    37 inline int pt(char x)
    38 {
    39     if (x=='L') return 0;
    40     if (x=='R') return 1;
    41     if (x=='U') return 2;
    42     if (x=='D') return 3;
    43 }
    44 int main()
    45 {
    46 //    freopen("data.in","r",stdin);
    47 //    freopen("myans.out","w",stdout);
    48     mp.clear();
    49     vis.clear();
    50     scanf("%s",s+1);
    51     n=strlen(s+1);
    52     a[++tot]=(point){0,0};
    53     for (register int x=0,y=0,i=1;i<=n;i++)
    54     {
    55         x+=fx[pt(s[i])][0],y+=fx[pt(s[i])][1];
    56         a[++tot]=(point){x,y};
    57     }
    58     sort(a+1,a+tot+1);
    59     tot=unique(a+1,a+tot+1)-a-1;
    60     for (register int x=0,y=0,i=1;i<=n;i++)
    61     {
    62         vis[(point){x,y}]=1;
    63         int nx=x+fx[pt(s[i])][0],ny=y+fx[pt(s[i])][1];
    64         if (vis[(point){nx,ny}]&&!mp[MP((point){x,y},(point){nx,ny})]) ans++;
    65         mp[MP((point){x,y},(point){nx,ny})]=1;
    66         mp[MP((point){nx,ny},(point){x,y})]=1;
    67         x=nx,y=ny;
    68     }
    69     ans++;
    70     printf("%d
    ",ans);
    71     return 0;
    72 }
    View Code

    C. 周队

    • 当关键点个数$geq 2n-1$是任何地方都能降落,抽屉原理,对于每个点都存在两个到它距离相同的点
    • 关键点个数$O(n)$的时候枚举两个关键点,讨论一下这两个点是不是某个正方形的对角线,差分$O(1)$修改
    • 代码就贴个暴力算了,正解大力讨论有点烦
     1 #include<bits/stdc++.h>
     2 #define FOR(i,a,b) for (register int i=(a);i<=(b);i++)
     3 #define fi first
     4 #define se second
     5 #define pb push_back
     6 #define MP make_pair
     7 #define pii pair<int,int>
     8 using namespace std;
     9 typedef long long ll;
    10 const int N=2010;
    11 int n,a[N][N],vis[N];
    12 vector <pii> vec;
    13 char ans[N][N];
    14 inline int ABS(int x) {return (x>0)?x:(-x);}
    15 inline int dis(pii x,pii y) {return ABS(x.fi-y.fi)+ABS(x.se-y.se);}
    16 int main()
    17 {
    18     scanf("%d",&n);
    19     FOR(i,1,n) FOR(j,1,n) 
    20     {
    21         ans[i][j]='N';
    22         scanf("%d",&a[i][j]);
    23         if (a[i][j]) vec.pb(MP(i,j));
    24     }
    25     if (vec.size()>2*n)
    26     {
    27         FOR(i,1,n) {FOR(j,1,n) putchar('Y'),putchar(' ');putchar('
    ');}
    28         exit(0);
    29     }
    30     random_shuffle(vec.begin(),vec.end());
    31     FOR(i,1,n) FOR(j,1,n)
    32     {
    33         FOR(i,0,2*n) vis[i]=0;
    34         FOR(k,0,(int)vec.size()-1)
    35         {
    36             int tmp=dis(vec[k],MP(i,j));
    37             if (vis[tmp]) {ans[i][j]='Y';break;}
    38             vis[tmp]=1;
    39         }
    40     }
    41     FOR(i,1,n) {FOR(j,1,n) putchar(ans[i][j]),putchar(' ');putchar('
    ');}
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    hdu1852 Beijing 2008
    hdu-2582 f(n)---找规律+素数筛法
    hdu-1452 Happy 2004---因子和+逆元
    LightOJ-1028 Trailing Zeroes (I)---因子数目
    hdu1215 七夕节---因子和
    因子和&&因子数
    hdu-1492 The number of divisors(约数) about Humble Numbers---因子数公式
    hdu-2136 Largest prime factor---巧用素数筛法
    欧拉函数
    BZOJ4418: [Shoi2013]扇形面积并
  • 原文地址:https://www.cnblogs.com/C-S-X/p/11746111.html
Copyright © 2020-2023  润新知