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
*/
相關文章
- 牛客網暑期ACM多校訓練營(第三場)C Shuffle Cards(splay)ACM
- 2020牛客NOIP賽前訓練營-普及組第一場牛牛的跳跳棋題解
- 「暑期訓練」「Brute Force」 Multiplication Table (CFR256D2D)
- 「暑期訓練」「Brute Force」 Bitonix' Patrol (CFR134D1D)
- [DP]HDU6415(2018多校訓練賽第九場 Problem A) Rikka with Nash Equilibrium 題解UI
- 挑選方案問題(牛客競賽 思維題+推導公式)公式
- 2020牛客NOIP賽前集訓營-普及組(第一場) 牛牛的跳跳棋
- 如何訓練結構化思維能力?它是一種工作方法還是思維方式?
- 牛客SQL練習第21題SQL
- 天池python訓練營D3Python
- 「暑期訓練」「Brute Force」 Restoring Painting (CFR353D2B)RESTAI3D
- Mysql 練習(牛客網)MySql
- 極客大學java進階訓練營學習分享Java
- 2020HDU多校第三場 1005 Little W and Contest
- java小白訓練營Java
- 如何變聰明?訓練自己變成結構化思維型的人!- TechMoon 科技月球
- 騰訊面試官親授:三個遊戲策劃思維訓練面試遊戲
- 牛客周賽 Round 36 (小白練習記)
- 構建一個 Javascript 多維陣列構造器JavaScript陣列
- 2023牛客寒假演算法基礎集訓營1 ACDEFGHKLM演算法
- 西部戰略 | GBase資料庫訓練營華西專場培訓資料庫
- oracle 客戶培訓上機操作練習題目Oracle
- 「暑期訓練」「基礎DP」 Common Subsequence (POJ-1458)
- CANN訓練營第三季_基於昇騰PyTorch框架的模型訓練調優_讀書筆記PyTorch框架模型筆記
- acm訓練題ACM
- matlab練習程式(構造簡單多邊形)Matlab
- 2023牛客寒假演算法基礎集訓營5 A-L演算法
- 2023牛客寒假演算法基礎集訓營6 A-L演算法
- 牛客錯題集(Java)Java
- nowcoder 牛客練習賽9 B
- 「暑期訓練」「基礎DP」免費餡餅(HDU-1176)
- 19_03_28校內訓練[相似字串]字串
- 華南攻略 | GBase資料庫訓練營專場培訓最後一季資料庫
- 2023牛客寒假演算法基礎集訓營2 ABCDEFHJKL演算法
- 2023牛客寒假演算法基礎集訓營3 A-I+K演算法
- 結構化思維
- 牛客特製2020名企校招筆試面試求職攻略-技術篇筆試面試求職
- .NET 雲原生架構師訓練營(系統架構)--學習筆記架構筆記