[CF]Codeforces Round #534 (Div. 2)

没想到都打过这么多场cf了,居然分还是只能掉掉,基本只能过过语法基础,被d题交互卡得有点自闭orz,感觉自己实力真的好菜啊,明天把cfr 532 补了 Codeforces Round #534 (Div. 2)

A

水题
#include<iostream>
#include<algorithm>
#include<cstdio>

using namespace std;

int n;
int main() {
    cin>>n;
    cout<<n<<endl;
    for(int i=1;i<=n;i++) cout<<1<<' ';
}

B

给你一个字符串,两人轮流行动,每次行动可以消除两个相邻并且相同的字符。不能行动者输 做法比想象中暴力,就是一轮一轮搜,一轮里面遇到一个两块连着的,就顺着延展一下,把所有这样的偶回文消掉之后,将剩下的全部合并在一起然后继续下去。 可以考虑到一个2块消在本次没消而在下次消,仅当这两块之间隔着至少两个偶回文串并且全部是偶回文串在本次消除完。这样的话就保证了在log2轮内所有的偶回文块都能被消除完 nlog2n
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>

using namespace std;
const int maxn = 3e5+5;
int n;
char so[maxn];
bool flag[maxn];
int solve(int l,int r) {
    if(l>r) return 0;
    int cnt = 0;
    fill(flag+l,flag+r+1,0); 
    for(int i=l;i<r;i++) {
        if(flag[i]) continue;
        if(so[i]==so[i+1]) {
            int o = 1; cnt++;
            flag[i] = flag[i+1] = 1;
            while(i-o>=l&&i+o+1<=r&&so[i-o]==so[i+o+1]&&(!flag[i+o+1])&&(!flag[i-o])) flag[i+o+1]=1,flag[i-o]=1,cnt++,o++;
        }
    }
    int tp = 0;
    for(int i=l;i<=r;i++) if(!flag[i]) so[++tp] = so[i];
    if(!cnt) return 0;
    return cnt + solve(1,tp);
}
int main() {
    scanf("%s",&so[1]);
    n = strlen(so+1);
    if(solve(1,n)&1) puts("Yes");
    else puts("No");
}

C

给你44的方格,每次给你12的竖格或横格,当一横行满或者一竖行满的时候消除,构造可以摆入4*4方格的方案 简单构造一下,把所有的竖格子安排在24的格子里(竖着摆4个),把所有横格子安排在14的格子里(横着摆2两个),这样就能保证都摆的下了。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int yix[2] = {4,4};
int yiy[2] = {1,3};
int lix[4] = {1,1,1,1};
int liy[4] = {1,2,3,4};
char ss[1005];
int n,li = 0; int yi = 0;
int main() {
    scanf("%s",&ss[1]);
    n = strlen(ss+1);
    for(int i=1;i<=n;i++) {
        if(ss[i]=='0') {
            printf("%d %d\n",lix[li],liy[li]);
            li = (li+1)%4;
        } else {
            printf("%d %d\n",yix[yi],yiy[yi]);
            yi = (yi+1)%2;
        }
    }       
}

D

两个人在玩交互,游戏里有一个数字a(a<=1e9&&a>=1),你询问(x,y),如果x%a>=y%a返回x,否则返回y,询问不超过60次,求a是多少。 其实大致思路明明就已经想到了呀,,不知道为什么最后我居然把他否了orz orz orz,枚举数列(k,2k),(0,1),(1,2),(2,4),(4,8).....可以考虑到,第一次返回x而不是y为a>k&&a<=2k的时候,这时候确定了范围在这个范围内二分查找就可以了。 果然是菜鸡 orz orz orz

\#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; string SX; int main() { while(233) { cin>>SX; if(SX=="end") return 0; int L = 0; int R = 1; for(;;L=R,R*=2) { printf("? %d %d\n",L,R); fflush(stdout); cin>>SX; if(SX=="x") break; } L = L+1; int ans = 0; while(L<=R) { int mid = (L+R)>>1; printf("%? %d %d\n",L-1,mid); fflush(stdout); cin>>SX; if(SX=="x") ans = mid, R = mid - 1; else L = mid+1; } printf("! %d\n",ans); fflush(stdout); } }
posted @ 2019-01-23 00:50  Newuser233  阅读(7)  评论(0)    收藏  举报