Codeforces Round 965 (Div. 2)

A. Find K Distinct Points with Fixed Center

简单构造

B. Minimize Equal Sum Subarrays

开始想正序倒序
看出来错一位就每个区间都严格比上面大

C. Perform Operations to Maximize Score

相当难写

D. Determine Winning Islands in Race

发现后手必须至少跳一步才能超过先手,这一步必须是从先手之前没走过的地方跳到后面没走到的地方
之前没走过的地方:先手现在走过的一段是一段区间
在这个区间之前?是在先手出发点之前,可以
在这个区间中?不能走到,在先手出发点之后
在这个区间后?走不走也无所谓,可以直接走地上的,在先手出发点之后
所以之前没走过的地方是先手出发点之前

删去在区间后的无所谓的,可能更新答案的桥也就是从出发点之前跳到比先手快的,这一步称为“关键性跳跃”

要求所有位置,用“关键性跳跃”来对数组置0
image

#include<iostream>
using namespace std;
#include<vector>
#include<cstring>
#include<queue>

const int N=200010;
int n,m;
vector<int> G[N];bool vis[N];
int d[N];int a[N];int b[N];

void bfs(){
    memset(d,0x3f,sizeof(d));memset(vis,0,sizeof(vis));
queue<int> q;
d[1]=0;q.push(1);

while(!q.empty()){
int t=q.front();q.pop();
vis[t]=1;
for(auto v:G[t]){
    if(d[v]>d[t]+1){
        d[v]=d[t]+1;q.push(v);
    }
}
}

}

int main(){
int T;cin>>T;
while(T--){
    cin>>n>>m;
    for(int i=1;i<=n;i++){G[i].clear();b[i]=0;}
    for(int i=1;i<=n-1;i++){
        G[i].push_back(i+1);
    }
    for(int i=1;i<=m;i++){
        int u,v;scanf("%d%d",&u,&v);
        G[u].push_back(v);
        /*int l=u+1;int r=v-u;
        if(l<=r){
            modify(1,l,r);
        }*/
    }
    bfs();

    for(int u=1;u<=n-1;u++){
            for(auto v:G[u]){
 int l=u+1;int r=v-d[u]-2;
        if(l<=r){
 b[l]++;b[r+1]--;
        }
            }

    }

    //如果为0,说明没有加过,是没有置0的
    for(int i=1;i<=n-1;i++){
        a[i]=a[i-1]+b[i];
        if(a[i])printf("0");
        else printf("1");
    }
    printf("\n");
}

}
posted @ 2025-07-08 08:45  arin876  阅读(22)  评论(0)    收藏  举报