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(")");
    }
}
View Code

 

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]);
    }
}
View Code

 

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;
}
View Code

 

讲道理这套题要是放到我状态很好的时候我真有可能5题。。。当然很好这种东西一般不存在。。

我昨晚就出了BC两道题。。。惊了。。。

有个可怜的计科老兄被查重误判skip了。。。我也是第一次听说这种操作。。。

两题竟然还是蓝名,惊了。。。

今中午要好好睡午觉!!!md4点睡的八点多就起来来实验室补题结果没开门。。。(笔记本被我折磨了5个多小时gg了,,没带电源回去)

今晚edu可别再掉了,,,根据我的经验我现在已经达到极小点要开始反弹上紫了(雾

扩了一波学长的好友现在有将近十个好友注册了很开森QwQ

  

 

posted @ 2018-08-18 11:32  MXang  阅读(875)  评论(0编辑  收藏  举报