Codeforces Round #296 (Div. 2) B C题

    题解: view
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
using namespace std;
const int maxn=200005;
vector<int> pos1[30],pos2[30];
char s1[maxn],s2[maxn];
map<pair<char,char>, int> mp;
int main()
{
         //freopen("in.txt","r",stdin);
         int n;
         scanf("%d",&n);
         scanf("%s%s",s1,s2);
         int hu=0;
         int p1=-1,p2=-1;
         pair<char,char> m1,m2;
         map<pair<char,char>, int>::iterator it;
         for(int i=0;i<n;i++){
                  if(s1[i]!=s2[i]){
                           pos1[s1[i]-'a'].push_back(i);
                           pos2[s2[i]-'a'].push_back(i);
                           hu++;
                           m1=make_pair(s1[i],s2[i]);
                           m2=make_pair(s2[i],s1[i]);
                           it=mp.find(m2);
                           if(it!=mp.end()) {
                                    p1=mp[m2];
                                    p2=i;
                           }
                           mp[m1]=i;
                  }
         }
         int ps=-1;
         for(int i=0;i<26;i++){
                  if(pos1[i].size()!=0&&pos2[i].size()!=0){
                           ps=i;
                  }
         }
         if(ps==-1) printf("%d\n%d %d\n",hu,p1,p2);
         else if(p1==-1&&p2==-1) printf("%d\n%d %d\n",hu-1,pos1[ps][0]+1,pos2[ps][0]+1);
         else printf("%d\n%d %d\n",hu-2,p1+1,p2+1);
         return 0;
}

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<set>
using namespace std;
const int maxn=200005;
set<int> V,H;
multiset <int>  qh, qv;
void init()
{
         V.clear(),H.clear();
}
int main()
{
         //freopen("in.txt","r",stdin);
         int w,h,n;
         scanf("%d%d%d",&w,&h,&n);
         V.insert(0),V.insert(w),H.insert(0),H.insert(h);
         qh.insert(h),qv.insert(w);
         set<int>::iterator it;
         multiset <int>::iterator it1;
         //puts("hello");
         while(n--){
                  char tp[2];
                  int v;
                  scanf("%s %d",tp,&v);
                  if(tp[0]=='V'){
                           it=V.lower_bound(v);
                           int v1,v2 = *it;
                           it--,v1=*it;
                           V.insert(v);
                           it1= qv.find(v2-v1);
                           qv.erase(it1);
                           qv.insert(v - v1);
                           qv.insert(v2 - v);
                  }
                  else{
                           it=H.lower_bound(v);
                           int v1,v2 = *it;
                           it--,v1=*it;
                           H.insert(v);
                           it1 = qh.find(v2-v1);
                           qh.erase(it1);
                           qh.insert(v - v1);
                           qh.insert(v2 - v);
                  }
                  printf("%I64d\n",1LL*(*(qv.rbegin())) * (*(qh.rbegin())));
         }
         return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值