首页 > 其他分享 >CF1968E.Cells Arrangement-构造(给个和题解不同的做法)

CF1968E.Cells Arrangement-构造(给个和题解不同的做法)

时间:2024-05-03 22:00:40浏览次数:26  
标签:CF1968E -- 题解 Cells back lst ans push 2n

link:https://codeforces.com/problemset/problem/1968/E
题意:需要构造一个 \(n\times n\) 的棋盘,在上面放 \(n\) 枚棋子,设集合 \(\mathcal{H}\) 表示两两之间曼哈顿距离构成的集合,要让 \(|\mathcal{H}|\) 最大。给出放棋子的方案。


首先说说题解的做法…考虑把距离为奇数和偶数的分开想…然后就会有下面这种,对角线放一堆,然后角落放两个的操作,非常合理…

但是我完全没想到这么造…

首先想的是,距离最近是 \(0\),最远是 \(2(n-1)=2n-2\),答案上界应该是 \(2n-1\),那我们就看看能不能取到上界,想这么一个构造:如果在左上角放了一排 \(L\) 个棋,可以得到 \([0,L-1]\) 的所有距离,至多可以造到 \([0,n-1]\),这不够用

如果把棋盘分成四份,左上角放 \(n/2\) 个,右下角放一个,会发生什么呢?

右下角能额外产生最小 \(n-1+(n/2)=\frac{3}{2} n-1\),最大 \(2n-2\) 的值,这样是把 \([0,2n-2]\) 的前后都覆盖住了,中间还有大约 \(n\) 个数,再放几个球:

绿色小球和左上角能产生 \([n/2,n/2-1+n/2]=[n/2,n-1]\) 的值,而黄色小球能产生 \([n/2+n/2-1,n-1+(n/2-1)]=[n-1,\frac{3}{2}n-2]\) 的值。

所以大约用了 \(\frac{n}{2}+3\) 个球就得到了最大值…剩下的随便乱放就好。
当然,具体实现的时候wa了一发, \(n=4\) 的时候太小会出问题,其他情况都能取得到。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define endl '\n'
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
int main(){
    fastio;
    int tc;cin>>tc;
    while(tc--){
        int n;
        cin>>n;
        vector<pii> ans;
        int lst=n;
        if(n==4){
            ans.push_back({1,1});
            ans.push_back({1,3});
            ans.push_back({4,3});
            ans.push_back({4,4});
        }else{
            rep(i,1,(n+1)/2){
                ans.push_back({1,i});
                lst--;
            }
            ans.push_back({n,n});lst--;
            if(lst){
                ans.push_back({(n+1)/2,(n+1)/2+1});
                lst--;
            }
            if(lst){
                ans.push_back({(n+1)/2+1,n});
                lst--;
            }
            while(lst--)ans.push_back({n,n});
        }

        for(auto [x,y]:ans)cout<<x<<' '<<y<<endl;
        cout<<endl;
    }
    return 0;
}

标签:CF1968E,--,题解,Cells,back,lst,ans,push,2n
From: https://www.cnblogs.com/yoshinow2001/p/18171705

相关文章

  • 题解:CF1926G
    题目传送门思路发现权值为C的点可以选择看做是权值为S或为P的点,所以问题转换为怎么给C点赋值可以使答案最小,考虑树形dp。\(f_{i,0/i,1}\)表示\(i\)点赋值为S或P时最少要删除几条边。但如果当前点权值不为C的话,那显然他的父亲节点应该选择和他权值相同的点才......
  • 题解:AT_abc298_h [ABC298Ex] Sum of Min of Length
    分析模拟赛签到题。考虑分讨。分两种情况:\(L=R\)。\(L\neR\)。对于第\(1\)种情况,用换根DP求一个\(i\)为根时所有点的深度和就行。对于第\(2\)种情况,钦定$dep_R\gedep_L$。很显然,\(R\)为根的子树中所有点都是离\(R\)更近。假设在\(L\)到\(R\)的路径......
  • 题解【[ABC077D] Small Multiple】
    题目链接题意简述:给定正整数\(K\),求数位之和最小的\(K\)的倍数的数位和。错误方向:\(K\)的倍数一定满足\(K\timesS\),根据\(K\)的特征构造出合适的\(S\)。正确方向考虑直接构造出K的倍数,由于从1开始可以通过×10和+1构造出所有数字,并且在此......
  • 【题解】P4711 「化学」相对分子质量
    Problem给定一个长度为\(L\)的化学式,求出此化学式的相对分子质量。例:十二水合硫酸铝钾(明矾)\(KAl(SO_4)_2\cdot12H_2O\).输入格式形为:KAl(SO_{4})_{2}~12H_{2}OSolve清新小模拟。定义一下“结账”这个概念,分为三种:原子结账,即为当单独的一个(一坨)原子计算完成后,计入所属......
  • [题解]ABC337E Bad Juice
    ABC337EBadJuice一开始的想法如下:就是利用二分法,对于一个区间\([l,r]\),分成\([l,mid-1],[mid,r-1]\)两部分,各找两个朋友喝,右边还空出一个\(r\),如果前面两个朋友都没中毒,那说明\(r\)这瓶有毒。但仔细一想,我们发现\([1,n)\)的瓶子中任意一个我们分出的区间\([l,r]\),都用去了\(......
  • 题解:CF607E Cross Sum
    Problem给定\(N\)条不平行的直线\(y=\frac{k_i}{1000}x+\frac{b_i}{1000}\),\(N\)条直线总共会有\(\frac{N(N-1)}{2}\)个交点(包含在同一个位置的点,即相同位置算不同的点),找出距离原点前\(K\)近的交点的距离和。$2\leN\le5\times10^4$,\(1\leK\le\frac{N(N-1)}{2}\)......
  • P6123 [NEERC2016] Hard Refactoring 题解
    本题说白了,就是一道big模拟!!!题意不再赘述,我们直接看思路。这里作者借鉴了某差分思想:末尾加空格,用于判断最后一个条件;若只有\(\le\),对给出的数字和数组第一个进行标记。标记的时候要+32769,因为数组中不存在负数下标,以免越界;若只有\(\ge\),就标记给出的数字和数组最后......
  • 5.2考试题解
    T1[NOIP2017提高组]时间复杂度大模拟……#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intt,n,k,as,nw,tr,ed[105];intc[26],str[105],b[105];stringtim;stack<int>st;structAadd{strings,t,fr,ed;}ad[105];intdfs(intx){i......
  • P4921 题解
    linkHint:错排计数。\(ans_k=C_n^k\timesA_n^k\times2^k\timesg(n-k)\)\(g(i)\)代表\(i\)对情侣全部错开的方案数。解释一下\(ans_k\)的表达。我们从\(n\)对情侣中无序地抽出\(k\)对情侣,有序地放到\(k\)排座位上,这里的方案数是\(C_n^k\timesA_n^k\)。由于两个......
  • UVA1362 Exploring Pyramids 题解
    题目传送门前置知识欧拉序|区间DP|乘法原理解法DFS序可近似理解为欧拉序,故考虑区间DP。设\(f_{l,r}\)表示\([l,r]\)对应的二叉树的个数,状态转移方程为\(f_{l,r}=\begin{cases}1&l=r\\[s_{l}=s_{r}]\times\sum\limits_{i=l+2}^{r}[s_{l}=s_{i}]\timesf_{......