社区讨论

【CSP2020】贪吃蛇求卡常?

学术版参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mj3qcql5
此快照首次捕获于
2025/12/13 11:22
2 个月前
此快照最后确认于
2025/12/14 20:35
2 个月前
查看原帖
写的带 log\text{log} 做法,怎么卡过去
C
#include<bits/stdc++.h>
using namespace std;
int T , n , ans;
int a[2000005] , dead[2000005] , now[2000005] , dep[2000005] , eaten[2000005];
inline void snake(){
    priority_queue<pair<int , int> , vector<pair<int , int> > , greater<pair<int , int> > > pq1;
    priority_queue<pair<int , int> > pq2;
    for(int i = 1 ; i <= n ; i++){
    	pq1.push({a[i] , i});
        pq2.push({a[i] , i});
        now[i] = a[i];
        dead[i] = 0;
    }
    for(int i = 1 ; i < n ; i++){
    	eaten[i] = pq1.top().second;
        dep[i] = pq2.top().second;
        pq1.pop() , pq2.pop();
        now[dep[i]] -= now[eaten[i]];
        now[eaten[i]] = -1;
        pq1.push({now[dep[i]] , dep[i]});
        pq2.push({now[dep[i]] , dep[i]});
    }
    for(int i = n - 1 , pos = n - 1 ; i >= 1 ; i--){
        if(dead[dep[i]]){
            for(int j = pos ; j >= i ; j--) dead[eaten[j]] = 0;
            pos = i - 1;
        }
        else dead[eaten[i]] = 1;
    }
    ans = 0;
    for(int i = 1 ; i <= n ; i++){
        if(dead[i] == 0) ans++;
    }
    cout << ans << "\n";	
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0) , cout.tie(0);
    cin >> T >> n;
    for(int i = 1 ; i <= n ; i++) cin >> a[i];
    snake();
    while(T-- > 1){
	    int k , x , y;
        cin >> k;
        for(int i = 1 ; i <= k ; i++){
            cin >> x >> y;
            a[x] = y;
        } 
        snake();  	
    }
    return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...