啥也不多说了,重拾坚持题解,不写题解不是人,做一题写一题,不转不是中国人(最后一句纯玩梗,瓜众散了散了
题目链接:在这里

A.BowWow and the Timetable

题意:快A题,主要是注意审题

int main(){
    string a;
    while(cin >>a){
        int f = 0;
        for(int i = SZ(a)-1;i >=1 ;i --){
            if(a[i]=='1')f = 1;
        }
        if(SZ(a)%2 == 1){
            if(f)cout<<SZ(a)/2+1<<endl;
            else cout<<SZ(a)/2<<endl;
        }
        else{
            cout<<SZ(a)/2<<endl;
        }
    }
}

B. Mislove Has Lost an Array

题意:构造1 2 4 8…l和r个不同的数,让你找和最小与最大值
思路:如题意

int main()
{
    int n,l,r;
    cin>>n>>l>>r;
    int sum1=1,sum2=1;
    for(int i=1;i<=l-1;i++) {
        sum1+=(1<<i);
    }
    sum1+=(n-l);
    for(int i=1;i<=r-1;i++) {
        sum2+=(1<<i);
    }
    sum2+=(n-r)*(1<<(r-1));
    cout<<sum1<<" "<<sum2<<endl;
    return 0;
}

C.Anna, Svyatoslav and Maps

本次的重点题,wa了无数次还不过的;
题意:题意确实有点小难懂,结合样例,我们可以看出首先就是给你一个图的二维表,和一个p序列,你需要构造一个长度最短的v序列,他要满足是p序列的子序列(subsequence)并且你按照v走并不会改变p的行走顺序,第一个样例非常典型。

废话:这里的题解思路是阳关大道式的解法,当然也是本题的标程,这里先说说标程,这是后来我才学会的,刚开始的贪心属实是贪懵了,贪了快一个半小时了,cf题真的,找不到正解就是这样的,我还没有彻底懂得及时换思路的重要性,我弱啊,找不到/dk。

思路:首先是Floyd将任意两个联通点的最短距离给算出来
不连通那么我们就inf,另外一定要注意将与自身自环的点的距离初始化为0,这点真的很重要,开头的点一定要加入答案的数组当中,那接下来我们怎么维护呢?我们刚开始的有一点思路一定是这样,我们先这样想因为对于每连续的三个点假设为k1,k2,k3来说,如果,k1 和 k3直接存在一条通路的话,那么k2这个点一定是不能被省略掉的,也就是说k2这个点必须要被加入到v数组里面,否则k1,k3直接相连便会改变原序列的行走顺序,那么既然这样的话,对于每一个上一次被加入到序列里的点,和当前的点在p序列里面的距离如果小于等于他们的最短距离了,那我们是不是可以不动,反过来,如果大于他们的最短距离了,那么我们就要把pi-1加入答案数组了,放i-1大家应该能想明白把,因为放i的话就改变了呀,现在考虑我们最初的一件事,就是当上一次被放入队列中的点和当前的点相同了怎么办,走回原点了?这时候我们的mp[i][i]=0就起到作用了,因为虽然没有自环,但出现连续两个相同的值显然是不合理的,而那样的初始化就可以保证了自环距离更小,会被加入v数组,好了本题就完成了。良心写题解,还有自己的hack样例!

int n,m;
char a[110][110];
int mp[110][110];
int p[N];
int main(){
    while(~scanf("%d",&n)){
        for(int i = 1; i <= n ; i ++){
            scanf("%s",a[i] + 1);
        }
        for(int i = 1;i <= n;i ++){
            for(int j = 1; j <= n;j ++){
                if(a[i][j]=='1')mp[i][j]=1;
                else mp[i][j]=inf;
            }
            mp[i][i]=0;
        }
        for(int i = 1 ; i <= n ; i ++){
            for(int j = 1 ; j <= n ; j ++){
                for(int k = 1 ; k <= n ; k ++){
                    mp[i][j] = min(mp[i][j],mp[i][k] + mp[k][j]);
                }
            }
        }
        scanf("%d",&m);
        for(int i = 1; i <= m ; i ++){
            scanf("%d",&p[i]);
        }
        VI v;
        v.pb(p[1]);
// set<int>s;
        int last = p[1],res = 1;
        for(int i =2; i <= m; i ++){
            if(mp[last][p[i]] < i - res ){
                v.pb(p[i-1]);
                last = p[i-1];
                res = i - 1;
            }
        }
        v.pb(p[m]);
        printf("%d\n",SZ(v));
        for(auto x:v){
            printf("%d ",x);
        }puts("");

    }

}
/*** 4 0101 0010 1000 0000 5 1 2 3 1 4 5 01000 00100 00010 00001 00000 5 1 2 3 4 5 ****/

D2.Kirk and a Binary String (hard version)

占坑待补