2019正睿CSP-S模拟赛十连测day8
这场题做的体验一般,没有“探索中求进步”的思考快感,会做的直接做,不会做的一点思路都没有,晚了半个小时开始,提早一个小时结束操作
$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\n",ans); 71 return 0; 72 }
这场的题都挺有意思,一定不能咕!