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

#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");
}
}

浙公网安备 33010602011771号