首页 > 其他分享 >P6411 [COCI2008-2009#3] MATRICA 题解

P6411 [COCI2008-2009#3] MATRICA 题解

时间:2023-09-26 21:25:25浏览次数:36  
标签:字符 cnt include COCI2008 int 题解 对角线 return 2009

水题。

发现根据限制 \(M_{i,j}=M_{j,i}\) 可以知道除了主对角线上的点,其他的点都是成对出现的。也就是说如果有一条要求的 \(a_i\) 为奇数,那么至少有一个 \(c_i\) 在主对角线上。

记 \(S=\sum\limits_{i=1}^{k} (a_i\equiv 1\pmod 2)\),即有 \(S\) 个要求中 \(a_i\) 为奇数。主对角线上只有 \(n\) 个点,所以若 \(S>n\) 则无解。


如果 \(S=n\) 很好处理,但如果 \(S<n\),说明主对角线上还需要放别的数,而且要一次性放入两个。

我们按字典序从小到大枚举字符,只处理 \((i,j)|i\leq j\) ,也就是主对角线及上方的点。

对于主对角线特别考虑,维护一个栈,从栈顶到栈底从小到大。里面放入现在剩余未填个数为奇数的字符,每次比较栈顶字符 \(a\) 和当前的枚举字符 \(b\),设栈的大小为 \(cnt\),当前位置为 \((i,i)\):

如果 \(b<a\) 则说明将 \(b\) 填在此处比将 \(a\) 填在此处更优,但同时需要保证 \((i-1)+(cnt+2)\leq n\),因为主对角线上已经填过 \(i-1\) 个数,如果将 \(b\) 填在这里,就说明在第 \(i\sim n\) 行的主对角线上要填 \(cnt+2\) 个数。所以如果这个值大于 \(n\) 就会不合法。

对于其他点直接顺次放,一种字符一定是连续的,每一行用 vector 维护连续的字符段。总共 \(n\) 行只会有 \(n+|\Sigma|\) 个连续字符段,其中 \(|\Sigma|\) 表示字符集大小。

输出答案时直接遍历,一行最多只会有 \(|\Sigma|\) 连续的字符段,并且均摊 \(O(1)\)。

总时间复杂度为 \(O(np)\)。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=3e4+10;
int n,k,t[26],q[30],cnt,p,pos[60],h[MAXN];
struct node{int l,r,num;};
vector < node > v[MAXN];
inline char ANS(int x,int y)
{
    if(x>y) return ANS(y,x);
    if(x==y) return h[x]+65;
    for(node z:v[x]) if(z.l<=y&&z.r>=y) return z.num+65;
    return 0;
}
int main()
{
#ifdef ONLINE_JUDGE
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
#endif
    cin>>n>>k;
    for(register int i=1;i<=k;++i){char c;int a;cin>>c>>a;t[c-65]=a;}
    //逆序,这样从栈顶到栈底从小到大;t[i]/=2 因为只考虑主对角线及上方
    for(register int i=25;i>=0;--i){if(t[i]&1) q[++cnt]=i;t[i]/=2;}
    if(cnt>n){cout<<"IMPOSSIBLE\n";return 0;}
    cin>>p;for(register int i=1;i<=p;++i) cin>>pos[i];
    //cur 是枚举元素
    for(register int i=1,cur=0;i<=n;++i)
    {
        while(!t[cur]) ++cur;
        //这里还要在栈顶加入 cur,因为这一行只填了一个,它变成了还剩奇数个未填
        if((cur<q[cnt]||!cnt)&&i+cnt+1<=n) h[i]=cur,t[cur]-=1,q[++cnt]=cur;
        else h[i]=q[cnt--];
        for(int l=i+1,r;l<=n;l=r+1)
        {
            while(!t[cur]) ++cur;
            r=min(n,l+t[cur]-1);
            v[i].push_back({l,r,cur});
            t[cur]-=(r-l+1);
        }
        for(register int j=1;j<=p;++j) cout<<ANS(i,pos[j]);
        cout<<'\n';
    }
    return 0;
}

标签:字符,cnt,include,COCI2008,int,题解,对角线,return,2009
From: https://www.cnblogs.com/int-R/p/matrica.html

相关文章

  • IDEA中的java代码Getters和Setters报红问题解决办法【杭州多测师_王sir】
    今天在新的编辑器中导入新项目时,发现很多get、set、toString的相关方法全部报红,仔细排查发现,原来是bean中注解采用lombok来自动生成get、set、toStirng、equals等方法,而新的编辑器未安装lombok plugin,所以全部报红。Lombok简介项目中经常使用bean,entity等类,绝大部分数据类类中都......
  • 2023.09.26 联考总结&题解
    T1derby你考虑直接贪心进行匹配即可,就是说对于每一个\(1\)去匹配最大的\(0\)#include<bits/stdc++.h>usingnamespacestd;intn,m;vector<int>A[2],B[2];intmain(){ freopen("derby.in","r",stdin); freopen("derby.out","w",s......
  • P6344 [CCO2017] Vera 与现代艺术 题解
    在\(V\timesV\)的平面上,\(n\)次修改,每次给定\(x,y,v\),令\(a,b\)为不超过\(x,y\)的最大的\(2\)的整数次幂,则所有\((x+pa,y+qb)(p,q为自然数)\)都加上\(v\),最后有\(m\)次单点询问一个位置的值。\(1\lex,y,V\le10^{18},1\lev,n,m\le2\times10^5\)我们可以......
  • P9566 [SDCPC2023] K-Difficult Constructive Problem 题解
    @目录DescriptionSolutionSol1Code1Sol2Code2Description有一个长度为\(n\)的01字符串\(s\),其中部分位置已给出,在?的位置处需填入一个1或0。一个填充方案是好的,当且仅当存在\(m\)个不同的\(i\)满足\(1\lei<n\)且\(s_i\nes_{i+1}\)。求所有好的填充方案中字典......
  • 预训练Bert模型输出类型为str问题解决
     input_ids=keras.layers.Input(shape=(MAXLEN,),dtype='int32')attention_mask=keras.layers.Input(shape=(MAXLEN,),dtype='int32')token_type_ids=keras.layers.Input(shape=(MAXLEN,),dtype='int32')_,x=bert_model([input_ids,atten......
  • 浏览器输入 http 自动转 https 问题解决方法
    很多朋友问浏览器输入http被自动跳转至https问题,到底该怎么解决呢,其实解决方法很简单,主要关闭浏览器的HSTS功能就可以了IE浏览器1.地址栏中输入edge://net-internals/#hsts2.在Deletedomain中输入项目的域名,并Delete(删除)3.可以在Querydomain测试是否删除成功。Chrome浏览......
  • Redis大key问题解决方案
     Redis的大key如何处理 介绍 大key并不是指key的值很大,而是key对应的value很大(非常占内存)一般而言,下面这两种情况被称为大key:String类型的值大于10KB;Hash、List、Set、ZSet类型的元素的个数超过5000个;为什么会出现大key数据结构不合理:当使用Re......
  • 综合概念映射和网络问题解决方法对学生学习成绩、感知和认知负荷的影响
    (Effectsofanintegratedconceptmappingandweb-basedproblem-solvingapproachonstudents’learningachievements,perceptionsandcognitiveloads) Computers&Education71(2014)77–86一、摘要研究目的:虽然学生可以通过适当的关键词有效地搜索到网络数据,并......
  • CF1863 题解
    CF1863题解A条件很简单:如果总共的'+'号加上开始上线人数不到\(n\)人,就不可能。实时记录人数,如果某一时刻大于等于\(n\)人在线上,就一定是。剩余情况则可能。#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn,a,q,T; cin>>T; while(T--) { cin>>n>......
  • CF249E Endless Matrix 题解
    @目录Description前置芝士SolutionCodeDescription构造一类矩形:先构造矩形\(M_1=\begin{bmatrix}1\end{bmatrix}\)。对于\(i\geq1\),\(T_{i+1}\)从\(T_i\)构造而来,方法为在最右侧和最下侧插入新的一行一列,自右上到左下\(2i+1\)个数分别填入\(i^2+1,i^2+2\dots(i+1)^2\)......