2020牛客暑期多校訓練營(第三場)D Points Construction Problem 構造思維題
巧妙的思維構造題。
如果直接手畫找規律還是蠻難的。
一般這種題需要先分析一下性質,找出最優最方便的構造方法。
題目要求連線黑白的邊的數量。
顯然上界是4*n;
下面分析下界:
仔細分析可知,若黑點位於不同的r行,c列,則連線邊數量最少為:
2*(a+b),因為每一行至少存在 白(-oo)-黑 黑-白(+oo)
列同理。
所以我們只需要列舉a,b就能找出最小的下界了。
下界構造:從下往上,從左往右填色。
每次把一個點移到很遠的地方,總數量會加2或者加4.
最後如果數量超出m(一定是多了2),則只需要把移走的點移動到任意一個點的旁邊即可+2.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define re register
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(int n){cnt=1;for(int i=0;i<=n;i++)head[i]=0;}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
vector<pair<int,int> >v,pr;
int a[210][210];
int b[310][507];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
int mn=4*n+1;
if(mn<m||m&1){
cout<<"No"<<endl;
continue;
}
memset(a,0,sizeof(a));
v.clear();
pr.clear();
int r=0,c=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i*j>=n && 2*(i+j)<mn){
mn=2*(i+j);
r=i,c=j;
}
}
if(mn>m){
cout<<"No"<<endl;
continue;
}
int sz=0;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
if(sz<n)a[i][j]=1,v.pb({i,j}),++sz;
int nm=0;
while(mn<m){
auto tp=v[v.size()-1];
int x=tp.first,y=tp.second;
if(a[x][y-1])mn+=2;if(a[x-1][y])mn+=2;
if(a[x][y+1])mn+=2;if(a[x+1][y])mn+=2;
a[x][y]=0;
v.pop_back();
pr.pb({300,2+nm*2}),nm++;
}
for(auto x:v)pr.pb({x.first,x.second});
int st=0;
if(mn>m){
auto tp=pr[1];
int x=tp.first,y=tp.second;
pr.pb({x-1,y});
st=1;
}
cout<<"Yes"<<endl;
memset(b,0,sizeof(b));
for(int i=st;i<pr.size();i++){
auto x=pr[i];
b[x.first][x.second]=1;
cout<<x.first<<" "<<x.second<<endl;
}
/*
檢測程式碼:
int ans=0;
for(int i=0;i<=300;i++)
for(int j=0;j<=410;j++)
{
if(b[i][j]){
if(i==0||!b[i-1][j])ans++;
if(!b[i+1][j])ans++;
if(!b[i][j+1])ans++;
if(j==0||!b[i][j-1])ans++;
}
}
if(ans!=m){
cout<<ans<<" "<<"NO!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
break;
}*/
}
return 0;
}
/*
11
1111
1111
1111
*/
相關文章
- 2024牛客暑期多校訓練營9
- 2024牛客暑期多校訓練營8
- 2024牛客暑期多校訓練營6
- 2024牛客暑期多校訓練營2
- 2024牛客暑期多校訓練營4
- 2024牛客暑期多校訓練營5
- 2024牛客暑期多校訓練營1
- 牛客網暑期ACM多校訓練營(第三場)C Shuffle Cards(splay)ACM
- 2024牛客暑期多校訓練營2 HI
- 2020牛客暑期多校訓練營(第一場)H Minimum-cost Flow
- 2024牛客暑期多校訓練營2 解題報告
- 2024牛客暑期多校訓練營10 - L. Tada! - 題解
- 2024牛客暑期多校訓練營9 - VP記錄
- 2024牛客暑期多校訓練營10 - VP記錄
- 2024牛客暑期多校訓練營4 - J. Zero (卡常)
- 2024牛客多校第三場
- 2024牛客多校訓練營覆盤:上篇(1~5)
- 2020牛客多校第八場K題
- 2020牛客NOIP賽前訓練營-普及組第一場牛牛的跳跳棋題解
- 牛客多校H題題解
- [DP]HDU6415(2018多校訓練賽第九場 Problem A) Rikka with Nash Equilibrium 題解UI
- 2024牛客多校第七場
- 2024牛客多校第10場
- 2024牛客多校第四場
- 24牛客多校第一場
- 思維題專項訓練
- 2024牛客多校第一場 - Mirror Maze
- 牛客練習賽73 D題:離別
- 2024 牛客多校 2
- 2024 牛客多校 1
- 2023 牛客多校 5
- 2024 牛客多校 7
- 2024 牛客多校 8
- 2024 牛客多校 6
- 2024牛客多校6
- 2024牛客多校1
- 【牛客訓練記錄】牛客周賽 Round 69
- 【牛客訓練記錄】牛客周賽 Round 70