#include<iostream>#include<cstdio>#include<cstdlib>#include<iomanip>#include<cstring>#include<algorithm>#define int long longusingnamespace std;constint N =3e5+17;int a[300050];int n;int cnt =0;int prime[N];int mark[N];voidpre(){
mark[1]=1;for(int i =2; i <100050; i ++){if(!mark[i]) prime[cnt++]= i;for(int j =0; prime[j]*i <100050; j ++){
mark[prime[j]*i]=1;if(i%prime[j]==0)break;}}}signedmain(){int t;
cin>>t;while(t--){int w,h,n;
cin>>w>>h>>n;int ans =1;while(w && w%2==0){
w /=2;
ans *=2;}while(h && h%2==0){
h /=2;
ans *=2;}
ans = ans >= n;puts(ans ?"YES":"NO");}return0;}
#include<iostream>#include<cstdio>#include<cstdlib>#include<iomanip>#include<cstring>#include<algorithm>#define int long longusingnamespace std;constint N =3e5+17;int a[300050];int n;signedmain(){int t;
cin>>t;while(t--){
cin>>n;int sum =0;int cnt =0;for(int i =0; i < n ; i ++){
cin>>a[i];
sum += a[i];if(a[i]==1) cnt ++;}if(sum%2){
cout<<"NO"<<endl;}else{if((sum/2)%2&& cnt ==0){
cout<<"NO"<<endl;}else{
cout<<"YES"<<endl;}}}return0;}
#include<iostream>#include<cstdio>#include<cstdlib>#include<iomanip>#include<cstring>#include<algorithm>#define int long longusingnamespace std;constint N =3e5+17;int a[300050];int sc[300050];int n;int cnt =0;signedmain(){int t;
cin>>t;while(t--){
cin>>n;for(int i =0; i < n ; i ++){
cin>>a[i];
sc[i]=0;}int maxx =0;for(int i = n-1; i >=0; i --){
sc[i]= a[i];if(i+a[i]< n){
sc[i]+= sc[i+a[i]];}
maxx =max(sc[i],maxx);}
cout<<maxx<<endl;}return0;}
#include<iostream>#include<cstdio>#include<cstdlib>#include<iomanip>#include<cstring>#include<algorithm>#define int long longusingnamespace std;constint N =3e5+17;int a[300050];int sc[300050];int n;int cnt =0;signedmain(){int t;
cin>>t;while(t--){
cin>>n;for(int i =0; i < n ; i ++){
cin>>a[i];}sort(a,a+n);int p =1;int al =0;int bo =0;for(int i = n-1; i >=0; i --){if(p && a[i]%2==0){
al += a[i];}elseif(!p && a[i]%2){
bo += a[i];}
p = p^1;}if(al > bo){
cout<<"Alice"<<endl;}elseif(al < bo){
cout<<"Bob"<<endl;}else{
cout<<"Tie"<<endl;}}return0;}
思路:其实就一个分类讨论的题。先对黑块排个序。然后遍历。分很多种情况。先假设 up = 1表示 底下是黑块,而上面放了一个躺着的块。 down = 1表示下面放了一个躺着的块。来表示两种状态。用 last 表示 上一个黑块的位置 如图:
然后分类讨论了。
1. 上下都是黑块。那前面必须 down 和 up 都为0才行。也就是不会能铺满2*k的格子而不会凸出来一个。
2. 上面是黑块。有五种情况,第一种就是down 和 up 都为0,那么必须放一个躺着的,剩下的情况:中间的白块数量只是代表距离的奇偶性。
3. 下面是黑块。有五种情况,第一种同上就是down 和 up 都为0,那么必须放一个躺着的,剩下的情况。 和上面一样分析。 倒过来就行了。
AC代码:
#include<iostream>#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcdusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =1e6+7;int n,m,k,t =1,cas =1;//int a[N],b[N];struct node{int x,y;}a[N];boolcmp(node a1,node a2){return a1.y < a2.y;}signedmain(){
cin>>t;while(t--){
cin>>n>>m;int maxx =0;for(int i =0; i < m ; i ++){
cin>>a[i].x>>a[i].y;
maxx =max(a[i].y,maxx);}
a[m].x =1,a[m++].y = maxx+1;
a[m].x =2,a[m++].y = maxx+1;sort(a,a+m,cmp);int up =0;int down =0;int flag =1;int last =0;for(int i =0; i < m ; i ++){//cout<<a[i].x<<" "<<a[i].y<<" "<<up<<" "<<down<<endl;if((i+1)< m && a[i+1].y == a[i].y){if(up || down){
flag =0;break;}
i ++;}elseif(a[i].x ==1){int dis = a[i].y - last -1;if(dis%2){// 距离为奇数if(down ==0&& up ==0){
down =1;}elseif(down){
flag =0;break;}else{
up =0;
down =0;}}else{// 距离为偶数if(down ==0&& up ==0){
down =1;}elseif(down){
up =0;
down =0;}else{
flag =0;break;}}}else{int dis = a[i].y - last -1;if(dis%2){// 距离为奇数if(up ==0&& down ==0){
up =1;}elseif(up){
flag =0;break;}else{
up =0;
down =0;}}else{// 距离为偶数if(up ==0&& down ==0){
up =1;}elseif(up){
down =0;
up =0;}else{
flag =0;break;}}}
last = a[i].y;}puts(flag ?"YES":"NO");}}
#include<bits/stdc++.h>#include<cstdio>#include<cstdlib>#include<iomanip>#include<cstring>#include<algorithm>#define int long longusingnamespace std;constint N =4e5+17;int inf =1e18;int a[300050];int n,m;int cnt =0;int mark[N];int vis[N];int dis[N];
vector<int> edge[N];voiddfs1(int pos,int sum){
queue<pair<int,int>> que;
que.push(make_pair(1,0));
vis[1]=1;while(!que.empty()){int now = que.front().first;int st = que.front().second;
dis[now]= st;
que.pop();for(int i =0; i < edge[now].size(); i ++){int to = edge[now][i];if(!vis[to]){
vis[to]=1;
que.push(make_pair(to,st+1));}}}}int dp[N];voiddfs2(int pos){
vis[pos]=1;
dp[pos]= dis[pos];for(int i =0; i < edge[pos].size(); i ++){int to = edge[pos][i];if(!vis[to]&& dis[pos]< dis[to]){dfs2(to);}if(dis[pos]< dis[to]){
dp[pos]=min(dp[pos],dp[to]);}else{
dp[pos]=min(dp[pos],dis[to]);}}}signedmain(){int t;
cin>>t;while(t--){
cin>>n>>m;for(int i =1; i <= n ; i ++){
edge[i].clear();
vis[i]=0;
dis[i]= inf;
dp[i]= inf;}for(int i =0; i < m ; i ++){int x,y;
cin>>x>>y;
edge[x].push_back(y);}dfs1(1,0);for(int i =1; i <= n ; i ++){
vis[i]=0;}dfs2(1);for(int i =1; i <= n ; i ++){
cout<<dp[i]<<" ";}
cout<<endl;}return0;}