1 条题解
-
0
自动搬运
来自洛谷,原作者为

Like_Amao
ENFJ-A||代词使用他||壶关条件:https://www.luogu.me/paste/5j8jlfwn#搬运于
2025-08-24 22:53:11,当前版本为作者最后更新于2025-07-28 09:19:11,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
前言
思路
这道题算是一道挺简单的模拟了。
我们用一个数组 来存储答案,在刚开始的时候,把数组初始化为
?,然后在开始做题。对于每一篇论文的作者列表中,不难发现,当这一次输入的名字的字典序,小于前一个名字的字典序时,前面所有人的贡献都会比这个人大,所以,这个人的资历比前面任何一个人的资历要深,所以这个时候我们把这个人处于输入的第几个数设为 ,把第 1 个到这个人前面的那个人,用 循环,所以,当这样时, 且 。
当这个人的字典序大于前一个人的字典序时,就要往前找到最后一次字典序小于前一个字典序,把这个位置标记为 ,从 1 循环到 在这之间的全部都没最开始那个人的资历深。
代码
#include<bits/stdc++.h> using namespace std; char ans[101][101]; map<string,int>mp; int main() { int k,n; cin>>k>>n; for(int i=1;i<=n;i++) { string str; cin>>str; mp[str]=i; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { ans[i][j]='?'; } } while(k--) { string str[101]; for(int i=1;i<=n;i++) { cin>>str[i]; } for(int i=2;i<=n;i++) { if(str[i]<str[i-1]) { for(int j=1;j<=i-1;j++) { if(ans[mp[str[i]]][mp[str[j]]]=='?') { ans[mp[str[i]]][mp[str[j]]]='1'; } if(ans[mp[str[j]]][mp[str[i]]]=='?') { ans[mp[str[j]]][mp[str[i]]]='0'; } } } else { int t=i; while(str[t]>str[t-1]) { t--; } t--; for(int j=1;j<=t;j++) { if(ans[mp[str[i]]][mp[str[j]]]=='?') { ans[mp[str[i]]][mp[str[j]]]='1'; } if(ans[mp[str[j]]][mp[str[i]]]=='?') { ans[mp[str[j]]][mp[str[i]]]='0'; } } } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) { cout<<"B"; } else { cout<<ans[i][j]; } } cout<<endl; } return 0; }
- 1
信息
- ID
- 9512
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者