第一题:签到
#include
using namespace std;
const int N=1010;
int a[N];
int main(){
int n;scanf("%d",&n);
for(int i=0;i
第二题:二维差分,暴力也可做
#include
using namespace std;
const int N=105,M=105;
int b[N][N];
//1~101
void insert(int x1,int y1,int x2,int y2){
b[x1][y1]+=1;
b[x2+1][y1]-=1;
b[x1][y2+1]-=1;
b[x2+1][y2+1]+=1;
}
int main(){
int n;scanf("%d",&n);
for(int i=0;i
第三题: 字符串简单模拟
#include
using namespace std;
string get(string s){
for(int i=0;i='A'&&s[i]<='Z') s[i]=s[i]-'A'+'a';
}
return s;
}
int main(){
string s;cin>>s;
int type;scanf("%d",&type);
int n;scanf("%d",&n);
while(n--){
string ss;cin>>ss;
if(type&&ss.find(s)!=-1) cout<
第四题:bfs
#include
#define ll long long
using namespace std;
const int N=1010;
int dis[N][N];
bool g[N][N];
int n,m,k,d;
struct point{
int x,y;
};
vector target;
vector v;
queue q;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
void bfs(){
while(q.size()){
point fs=q.front();
q.pop();
for(int i=0;i<4;i++){
int x=fs.x+dx[i];
int y=fs.y+dy[i];
if(x<=0||x>n||y<=0||y>n||g[x][y]) continue;
if(dis[x][y]>dis[fs.x][fs.y]+1){
dis[x][y]=dis[fs.x][fs.y]+1;
q.push({x,y});
}
}
}
}
int main(){
memset(dis,0x3f,sizeof dis);
scanf("%d%d%d%d",&n,&m,&k,&d);
for(int i=0;i
第五题:状压dp+dfs暴搜建表+矩阵快速幂
#include
#define ll long long
using namespace std;
const int N=130,mod=1e9+7;
ll n;
int m;
int w[N][N];
int res[N][N];
void dfs(int x,int y,int u){
if(u==m) w[x][y]++;
else if(x>>u&1) dfs(x,y,u+1);
else{
if(u&&!(y>>u&1)&&!(y>>u-1&1)) dfs(x,y+(1<>u&1)&&!(y>>u+1&1)) dfs(x,y+(1<>u+1&1)){
if(!(y>>u&1)) dfs(x,y+(1<>u+1&1)) dfs(x,y+(1<>=1;
}
printf("%d\n",res[0][(1<