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
#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]

浙公网安备 33010602011771号