这场比赛真是大起大落。。比的时候一度排在rank1,以为从此达到人生巅峰了,结果最后B,C都FST了,都是因为很2的错误,B为了偷懒,居然把数加到string里比较字典序。C漏一个"=",而且有语句写错了位置。
CF题的难度,好像有变水的趋势。。以前前3题没算法,现在前4题都没有,而且还没编程复杂度。。
A. Vasya and Football
思路:给每个人领牌数计数,黄牌+1,红牌+2。拿黄牌时,如果计数器为2则输出,拿红牌时,如果计数器为2或3则输出。
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
#define ll long long
#define INF 1000000000
int cnt[210];
int main(){
string h;
string a;
cin>>h>>a;
int n;
cin>>n;
map<string,int> mp;
for(int i=1;i<=n;i++){
int t;
string x;
int id;
string y;
cin>>t>>x>>id>>y;
if(y=="r"){
if(x=="h"){
cnt[id]+=2;
if(cnt[id]==2||cnt[id]==3){
cout<<h;
cout<<" "<<id<<" "<<t<<endl;
}
}else{
cnt[id+100]+=2;
if(cnt[id+100]==2||cnt[id+100]==3){
cout<<a;
cout<<" "<<id<<" "<<t<<endl;
}
}
}else{
if(x=="h"){
cnt[id]++;
if(cnt[id]==2){
cout<<h;
cout<<" "<<id<<" "<<t<<endl;
}
}else{
cnt[id+100]++;
if(cnt[id+100]==2){
cout<<a;
cout<<" "<<id<<" "<<t<<endl;
}
}
}
}
return 0;
}
B. Vasya and Wrestling
思路:模拟。先判断分高的,相同判断字典序,再相同判断最后一次动作。注意需要long long。
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
#define ll long long
#define INF 1000000000
int a[200010];
int b[200010];
int main(){
int n;
ll suma=0;
ll sumb=0;
cin>>n;
ll last;
int ida=0;
int idb=0;
for(int i=1;i<=n;i++){
ll t;
scanf("%I64d",&t);
if(t>0){
suma+=t;
a[ida++]=t;
}else{
sumb+=(-t);
b[idb++]=-t;
}
if(i==n)last=t;
}
bool win;
if(suma>sumb){
win=1;
}else if(suma<sumb){
win=0;
}else{
int flag=0;
for(int i=0;i<max(ida,idb);i++){
if(a[i]<b[i]){
flag=-1;break;
}
if(b[i]<a[i]){
flag=1;break;
}
}
if(flag==1){
win=1;
}else if(flag==-1){
win=0;
}else{
if(last>0){
win=1;
}else{
win=0;
}
}
}
if(win){
cout<<"first"<<endl;
}else{
cout<<"second"<<endl;
}
return 0;
}
C. Vasya and Basketball
思路:给所有球的距离排序,先让所有球都是三分,然后扫一遍,不断更改三分线,找出最有利的三分线就行了。
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
#define ll long long
#define INF 1000000000
pair<int,bool> p[400010];
int main(){
int n,m;
cin>>n;
for(int i=0;i<n;i++){
scanf("%d",&p[i].first);
p[i].second=1;
}
cin>>m;
for(int i=n;i<n+m;i++){
scanf("%d",&p[i].first);
p[i].second=0;
}
sort(p,p+n+m);
p[n+m].first=-1;
ll as=(ll)n*3LL;
ll bs=(ll)m*3LL;
ll MAX=-1000000000000LL;
ll ansa;
ll ansb;
for(int i=0;i<=n+m;i++){
if(i==0||p[i].first!=p[i-1].first){
if(as-bs>MAX){
MAX=as-bs;
ansa=as;
ansb=bs;
}
}
if(p[i].second==1){
as--;
}else{
bs--;
}
}
cout<<ansa<<":"<<ansb<<endl;
return 0;
}
思路:判断奇偶,偶数白赢,第一步走1 2;奇数黑赢。白的最优决策,就是自己行动后保持和黑皇后横坐标的差为偶数,第一步往右,然后黑上下自己也上下,黑左右自己也左右,黑斜走自己也斜走。话说D题这么水,真的好吗。。
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
#define ll long long
#define INF 1000000000
int main(){
int n;
while(cin>>n){
if(n&1){
cout<<"black"<<endl;
}else{
cout<<"white"<<endl;
cout<<1<<" "<<2<<endl;
}
}
return 0;
}