Codeforces Round 504
(交互题真神奇,,,我自己瞎写了一发目测样例都没过去就AC了。。。)
(只出了两题的竟然没掉下蓝名真是可怕)
A:我的代码太不美观了,放个同学的(因为我是c++63分的蒟蒻所以根本不知道那些函数怎么用只能手写被hack)
这个题本身不难,坑点太多了,很囍的是我在2:13分的时候被hack了,,GG
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<climits> #include<vector> #include<set> #include<cmath> #include<queue> #include<algorithm> using namespace std; int n,m; signed main() { cin>>n>>m; if (n > m + 1) return puts("NO"), 0; std::string s, t; std::cin >> s >> t; int star = 0; for (auto i : s) if (i == '*') star = 1; if (!star && s != t) return puts("NO"); std::string pre = s.substr(0, s.find('*')), suf = s.substr(s.find('*') + 1); int pres = pre.size(), sufs = suf.size(); if (t.substr(0, pres) == pre && t.substr(m - sufs) == suf) puts("YES"); else puts("NO"); }
B:自认非常优雅
1 #include <bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 ll n,k; 5 int main(){ 6 scanf("%lld%lld",&n,&k); 7 ll ans = 0; 8 if(k>n){ 9 ll tmp = k-n; 10 ans = (n-tmp+1)/2; 11 } else{ 12 ll tmp = k-1; 13 ans = (tmp-1+1)/2; 14 } 15 ans =ans>0?ans:0; 16 printf("%lld\n",ans); 17 }
C:
太困了又刚补了几话狐妖又吸了冰毒 喝了冷藏的维他柠檬茶 导致一开始的思路是错的,,,还wa了两发。。。其实是个大水题
#include <bits/stdc++.h> typedef long long ll; using namespace std; int n,k; char s[200005]; int main() { scanf("%d%d", &n, &k); scanf("%s", s + 1); k/=2; int cnt = 0,cnt2=0; for(int i=1;i<=n;i++){ if(s[i]=='(') cnt++; else cnt2++; printf("%c",s[i]); if(cnt==k) break; } cnt2 = cnt-cnt2; while (cnt2--){ printf(")"); } }
D:旁边哥们吐槽没读懂题,,其实我也没读懂,我是交了两发wa了之后才勉强猜对的题意,GG
题意:我语文不好啊
给你n个数,q次操作,每次操作按照从1到q的顺序 对 任意区间赋值成 那个数,第一次赋值1,第二次赋值2, n个数中为0的数可以自由变成任意数,其他数不能改变, 问 q次操作后能否得到 给定 序列,并输出序列。 自己结合样例好好读读吧,,真的挺难懂的。。
想了很多骚操作还是直接线段树好。。
我觉着只要做了这个题代码是非常好懂的,我就不细说了
#include <bits/stdc++.h> typedef long long ll; using namespace std; const int N = 2e5 + 5; int n, q; int a[N], vis[N],l[N],r[N],flag[N]; int minn[4*N]; void build(int k, int l, int r) { if (l == r) { minn[k] = a[l]; return; } int mid = (l + r) >> 1; build(k << 1, l, mid); build(k << 1 | 1, mid + 1, r); minn[k] = min(minn[k*2],minn[k*2+1]); } void update(int k, int l, int r) { } int query(int k, int lef, int rig, int l, int r) { if (l <= lef && r >= rig) return minn[k]; int mid = (lef + rig) / 2; int ans = 1e9; if (l <= mid) ans = min(ans, query(k * 2, lef, mid, l, r)); if (r > mid) ans = min(ans, query(k << 1 | 1, mid + 1, rig, l, r)); return ans; } int main() { scanf("%d%d", &n, &q); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) { int j = i + 1; while (j <= n && (a[j] == a[i] || a[j] == 0)) { if (a[j] == 0) { a[j] = a[i]; flag[j]=1; } j++; } vis[a[i]] = 1; i = j - 1; } int temp = 0; if(a[1]!=0&&!vis[q]){ for(int i=1;i<=n;i++){ if(flag[i]){ a[i]=q; vis[q]=1; break; } } if(!vis[q]) { printf("NO\n"); return 0; } } if (a[1] == 0) { if (!vis[q]) { temp = q; } else { for (int i = 1; i <= n; i++) { if (a[i] != 0) { temp = a[i]; break; } } } for (int i = 1; i <= n; i++) { if (a[i] == 0) a[i] = temp; } } for(int i=1;i<=n;i++){ if(l[a[i]]==0) l[a[i]]=i; r[a[i]]=i; } build(1,1,n); for(int i=1;i<=q;i++){ if(l[i]==0) continue; if(query(1,1,n,l[i],r[i])<i){ printf("NO\n"); return 0; } } printf("YES\n"); for(int i=1;i<=n;i++){ printf("%d ",a[i]); } }
E : 第一次做交互题,,瞎写一发入魂,,(当然不是昨晚上。。。)
感觉就是个贪心啊,,我也不知道为啥我这么做就是对的
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int n; bool ask(int n,int m,int x,int y){ cout<<"? "<<n<<" "<<m<<" "<<x<<" "<<y<<endl; string s; cin>>s; return s[0]=='Y'; } int main(){ string ans1=""; string ans2=""; scanf("%d",&n); int i=1,j=1; int cnt =0; while (i<=n&&j<=n&&++cnt<=(n-1)){ if(ask(i,j+1,n,n)){ j++; ans1+="R"; } else{ i++; ans1+="D"; } } i=n;j=n;cnt=0; while (i>=1&&j>=1&&++cnt<=n-1){ if(ask(1,1,i-1,j)){ i--; ans2+="D"; } else{ j--; ans2+="R"; } } reverse(ans2.begin(),ans2.end()); printf("! "); cout<<ans1<<ans2; }
讲道理这套题要是放到我状态很好的时候我真有可能5题。。。当然很好这种东西一般不存在。。
我昨晚就出了BC两道题。。。惊了。。。
有个可怜的计科老兄被查重误判skip了。。。我也是第一次听说这种操作。。。
两题竟然还是蓝名,惊了。。。
今中午要好好睡午觉!!!md4点睡的八点多就起来来实验室补题结果没开门。。。(笔记本被我折磨了5个多小时gg了,,没带电源回去)
今晚edu可别再掉了,,,根据我的经验我现在已经达到极小点要开始反弹上紫了(雾
扩了一波学长的好友现在有将近十个好友注册了很开森QwQ