Codeforces Round 984 (Div. 3)

D. I Love 1543

积累网格方法
一圈,L,R,D,U
要把n-1个加上,substr

#include<iostream>
using namespace std;

const int N=1010;
int n,m;
int a[N][N];


int main(){
    int T;cin>>T;
    while(T--){
        cin>>n>>m;int ans=0;
        for(int i=1;i<=n;i++){
            string s;cin>>s;
            for(int j=1;j<=m;j++){
                a[i][j]=s[j-1];
            }
        }
        
        
        for(int idx=1;;idx++){
            int U=idx;int D=n-idx+1;int L=idx;int R=m-idx+1;
            if(U>D||L>R)break;
            string tem="";
            
            for(int j=L;j<=R-1;j++){
                tem+=a[U][j];
            }
            for(int i=U;i<=D-1;i++)tem+=a[i][R];
            for(int j=R;j>=L+1;j--)tem+=a[D][j];
            for(int i=D;i>=U+1;i--)tem+=a[i][L];
            

            //开始跳的三个
            if(tem.size()>=3)
           tem+=tem.substr(0,3);else continue;

           //cout<<"get"<<tem<<endl;
            for(int j=0;j+3<=tem.size()-1;j++){
                if(tem.substr(j,4)=="1543")ans++;
            }
        }
        cout<<ans<<endl;
    }
}

E

vector<vector> a(k+1,vector<n+1>)

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
const int N=100010;
int n,k,q;int m;



int main(){
    cin>>n>>k>>q;
    vector<vector<int>> a(k+1,vector<int>(n+1));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            scanf("%d",&a[j][i]);
        }
    }
    //这样每一列是一个国家

    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            a[j][i]=a[j][i-1]|a[j][i];
        }
    }

    while(q--){
        scanf("%d",&m);
        int ansl=1;int ansr=n;
        while(m--){
            int r,c;char o;
            cin>>r>>o>>c;
            if(o=='<'){
                int t=lower_bound(a[r].begin(),a[r].end(),c)-a[r].begin();
                //int t=lower_boundd(r,c);
                t--;ansr=min(ansr,t);//最后一个小于
            }else if(o=='>'){
                
                int t=upper_bound(a[r].begin(),a[r].end(),c)-a[r].begin();
               
               // int t=upper_boundd(r,c);
                ansl=max(ansl,t);//第一个大于
            
            }
        }
        if(ansl>ansr){
            printf("-1\n");
        }else {
            printf("%d\n",ansl);
        }
    }
}

F. XORificator 3000

积累这个性质,每四个异或0
[
f(n) =
\begin{cases}
0 & n \bmod 4 = 3\
n & n \bmod 4 = 0 \
1 & n \bmod 4 = 1 \
n + 1 & n \bmod 4 = 2
\end{cases}
]

求[l,r]的异或和即f[r]^f[l-1]

posted @ 2025-06-28 00:54  arin876  阅读(14)  评论(0)    收藏  举报