Codeforces Round 984 (Div. 3)

A. Quintomania

照题意模拟下去即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;
#define ls now<<1
#define rs now<<1|1
#define endl "\n"
#define lowbit(x) ((x)&(-x))
typedef long long ll;
const int N=1e5+7, mod=1e9+7;

int n;
int a[N];

void solve(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<n;i++){
        if(abs(a[i+1]-a[i])!=5&&abs(a[i+1]-a[i])!=7){
            cout<<"NO\n";
            return;
        }
    }
    cout<<"YES\n";
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)solve();
    return 0;
}

B. Startup

记录每种牌子的总价值,排序后从大到小取

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <bits/stdc++.h>
using namespace std;
#define ls now<<1
#define rs now<<1|1
#define endl "\n"
#define lowbit(x) ((x)&(-x))
typedef long long ll;
#define int long long
const int N=2e5+7, mod=1e9+7;

struct Node{
    ll id,val;
    bool operator<(const Node &a){return val>a.val;}
};

int n,k;
int b[N],c[N];
map<int,int>vis;

void solve(){
    cin>>k>>n;
    vis.clear();
    for(int i=1;i<=n;i++)cin>>b[i]>>c[i];
    for(int i=1;i<=n;i++){
        vis[b[i]]+=c[i];
    }
    vector<Node>v;
    for(auto [x,y]:vis){
        v.push_back(Node{x,y});
    }
    sort(v.begin(),v.end());
    ll ans=0;
    for(int i=0;i<min(k, (int)v.size());i++){
        ans+=v[i].val;
    }
    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)solve();
    return 0;
}

C. Anya and 1100

每次修改其实只会对临近的几个位置造成影响,只需要统计附近是否增删了 1100 片段即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <bits/stdc++.h>
using namespace std;
#define ls now<<1
#define rs now<<1|1
#define endl "\n"
#define lowbit(x) ((x)&(-x))
typedef long long ll;
const int N=1e5+7, mod=1e9+7;

string s;
int q;

void solve(){
    cin>>s>>q;
    int n=s.size();
    s=" "+s;
    set<int>st;
    for(int i=1;i<=n-3;i++){
        if(s.substr(i,4)=="1100")st.insert(i);
    }
    while(q--){
        int x,y;
        cin>>x>>y;
        if(n<4){
            cout<<"NO\n";
            continue;
        }
        s[x]=char('0'+y);
        // cout<<s<<endl;
        for(int i=max(1, x-4); i<=min(n-3, x+4); i++){
            if(s.substr(i,4)=="1100")st.insert(i);
            else st.erase(i);
        }
        if(st.size())cout<<"YES\n";
        else cout<<"NO\n";
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)solve();
    return 0;
}

D. I Love 1543

把图一层一层拆分开,对每一层形成的字符串计数即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <bits/stdc++.h>
using namespace std;
#define ls now<<1
#define rs now<<1|1
#define endl "\n"
#define lowbit(x) ((x)&(-x))
typedef long long ll;
const int N=1e3+7, mod=1e9+7;

int n,m,ans;
char mp[N][N];
bool vis[N][N];
char x;

void getString(int x){
    string s="";
    for(int i=x;i<=m-x+1;i++){
        if(vis[x][i])break;
        s+=mp[x][i],vis[x][i]=1;
    }
    for(int i=x+1;i<=n-x+1;i++){
        if(vis[i][m-x+1])break;
        s+=mp[i][m-x+1],vis[i][m-x+1]=1;
    }
    for(int i=m-x;i>x;i--){
        if(vis[n-x+1][i])break;
        s+=mp[n-x+1][i],vis[n-x+1][i]=1;
    }
    for(int j=n-x+1;j>x;j--){
        if(vis[j][x])break;
        s+=mp[j][x],vis[j][x]=1;
    }
    int len=s.size();
    // cout<<s<<endl;
    s=s+s;
    for(int i=0;i<len;i++){
        if(s.substr(i,4)=="1543")ans++;
    }
}

void solve(){
    cin>>n>>m;
    ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>x;
            mp[i][j]=x;
            vis[i][j]=0;
        }
    }
    for(int i=1;i<=min(n,m);i++){
        if(vis[i][i])break;
        getString(i);
    }
    cout<<ans<<endl;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--)solve();
    return 0;
}

E. Reverse the Rivers

两个数按位或,只可能变大,那么每个位置都是一个单调递增的序列,易想到通过二分来查找符合的国家

输出符合条件的最小的国家序号即可

赛时没发现 l 初始设置为 0 了,连 wa 数发

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <bits/stdc++.h>
using namespace std;
#define ls now<<1
#define rs now<<1|1
#define endl "\n"
#define lowbit(x) ((x)&(-x))
typedef long long ll;
#define int long long
const int N=1e5+7, mod=1e9+7;
const ll inf=1e18;

int n,k,q,m;

void solve(){
    cin>>n>>k>>q;
    vector<vector<ll>> a(n+10, vector<ll>(k+10));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            cin>>a[i][j];
            a[i][j]|=a[i-1][j];
        }
    }
    vector<vector<int>> s(k + 1);
    for(int i=1;i<=k;i++)s[i].push_back(0);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            s[j].push_back(a[i][j]);
        }
    }
    while(q--){
        cin>>m;
        int low=1,up=n;
        for(int i=1;i<=m;i++){
            ll r,c;
            char x;
            cin>>r>>x>>c;
            if(x=='>'){
                auto l=upper_bound(s[r].begin(),s[r].end(),c)-s[r].begin();
                low = max(low, l);
            }
            else{
                auto l = lower_bound(s[r].begin(), s[r].end(), c) - s[r].begin();
                l--;
                up = min(up, l);
            }
            // cout<<low<<" "<<up<<endl;
        }
        // cout<<low<<" "<<up<<endl;
        if(low <= up) cout << low << endl;
        else cout << "-1\n";
    }
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--)solve();
    return 0;
}

F. XORificator 3000

异或前缀和有一个性质

$$ f(x)=\begin{cases} x, & x\%4=0 \\ 1, & x\%4=1 \\ x+1, & x\%4=2 \\ 0, & x\%4=3 \end{cases} $$

同时题中另一性质的数: $x≡3\mod2^4$

$x=0000011,0001011,0010011,0011011$

可以看出,后几位是始终不变的,而前面的会递增,也可以使用异或前缀和求出

即可以先对前面的位数求异或和,再对后面的位数求异或和

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <bits/stdc++.h>
using namespace std;
#define ls now << 1
#define rs now << 1 | 1
#define endl "\n"
#define lowbit(x) ((x) & (-x))
typedef long long ll;
const int N = 1e5 + 7, mod = 1e9 + 7;

ll l,r,i,k;

ll fc(ll n){
    if(n%4==0) return n;
    if(n%4==1) return 1;
    if(n%4==2) return n+1;
    return 0;
}

ll fx(ll n,ll i,ll k){
    if(!i){
        if(!k)return fc(n);
        else return 0;
    }
    ll x=1ll<<i;
    if(n<k) return 0;
    ll t=(n-k)/x;
    ll cnt=t+1;
    ll res=fc(t)<<i;
    if(cnt%2)res^=k;
    return res;
}

void solve() {
    cin>>l>>r>>i>>k;
    ll s=fc(l-1)^fc(r);
    ll tmp=fx(r,i,k)^fx(l-1,i,k);
    ll ans=s^tmp;
    cout<<ans<<endl;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    // freopen("..//..//in_out//in.txt", "r", stdin);
    // freopen("..//..//in_out//out.txt", "w", stdout);
    int t = 1;
    cin >> t;
    while (t--) solve();
    return 0;
}
Licensed under CC BY-NC-SA 4.0
最后更新于 Sep 11, 2025 16:27 +0800
发表了95篇文章 · 总计15万2千字
永远相信美好的事情即将发生。
使用 Hugo 构建
主题 StackJimmy 设计