这场打的巨烂,前三道题写的都挺快的,但是第四题看到大家都写出了L题,所以就开始去写L题了,但是由于map开错了,后来反复给也没有改对,心情就有些急躁,想着换一个写法去写,但是新的写法有很大的漏洞,所以不断超时或者报错。写F题的时候,脑子没转过来,将一个简单的规律绕了特别大的一个圈子写出来的(八个if条件进行判断)反复出错,后来就给自己的心态写崩了,后边的题看都没看。
比完赛静下心来想一想,实际上题目并没有那么的难,而是自己不敢尝试和心理素质不够强,导致四个小时的比赛只有前一个小时交了三道题,后三个小时一道题都没出。
F题--累加器
https://ac.nowcoder.com/acm/contest/87865/F
实际上可以将其处理的很巧妙。x到x/2上产生了x/2的改变,依照这个规律可以直接找出x到0上到底有多少位发成改变, x对y次累加的改变就可以变为temp(x+y)-temp(x)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int t;
int a,b;
int temp(int x,int y){
int n=x;
int m=y;
while(x){
x/=2;
n+=x;
}
while(y){
y/=2;
m+=y;
}
return m-n;
}
signed main(){
std::ios::sync_with_stdio(0);
std::cin.tie(0);
cin>>t;
while(t--){
cin>>a>>b;
cout<<temp(a,a+b)<<endl;
}
}
L题--SSH
https://ac.nowcoder.com/acm/contest/87865/L
实际上,这道题并没有很难,但是当时心态写崩了,不够镇静,所以没能理清思路,好好的写一遍。实际上只要将存储数据的那部分写清楚,就好了。
开三个map,第一个map存储钥匙,第二个map用来存储每个地址上存在的用户的名字,第三个map,是用来存储每个名字所需要的公共钥匙。在查找的时候,要先通过地址来查找人,再找到人之后,在去查找这个人的私人钥匙所对应的公共钥匙能不能被查找到。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int m,n,q;
map<string,string>mp1;
string pub,pri;
signed main(){
std::ios::sync_with_stdio(0);
std::cin.tie(0);
cin>>m>>n>>q;
for(int i=1;i<=m;i++){
cin>>pub>>pri;
mp1[pub]=pri;
}
map<string,vector<string> >mp2;
map<string,vector<string> >mp3;
for(int i=1;i<=n;i++){
string s;
int a;
cin>>s>>a;
for(int j=1;j<=a;j++){
string str;
int b;
cin>>str>>b;
mp2[s].push_back(str);
for(int k=1;k<=b;k++){
string yao;
cin>>yao;
mp3[str].push_back(yao);
}
}
}
for(int i=1;i<=q;i++){
int cnt=0;
string name,add,fin;
cin>>name>>add>>fin;
for(auto x:mp2[add]){
if(x==name){
for(auto y:mp3[name]){
if(mp1[y]==fin){
//cout<<"Yes"<<endl;
cnt=1;
break;
}
}
}
}
if(cnt==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}