ACM-ICPC 2018 徐州赛区网络预赛F G I(持续更新)

/*************************  F. Features Track  *****************************

链接:https://nanti.jisuanke.com/t/31458

题意:首先有1个n,n行,每行一个k表示这一行有k个点,然后输入这个k个点,问
最长连续多少行出现了相同的点

思路:map里pair存坐标对应int,一个记录连续次数,一个记录上一次出现在第几行
取最大值即可

****************************************************************************/
#include<bits/stdc++.h>
using namespace std;

map<pair<int,int>,int>mp1,mp2;
/** mp1记录次数,mp2记录上一次出现的地方 */

int main()
{
    int t;
    cin>>t;
    while(t--){
        int n,Max=0;
        scanf("%d",&n);
        mp1.clear();mp2.clear();
        for(int i=1;i<=n;i++){
            int k;
            scanf("%d",&k);
            while(k--){
                int x,y;
                scanf("%d%d",&x,&y);
                if(mp2[make_pair(x,y)]==i) continue;
                else if(mp2[make_pair(x,y)]==i-1||mp1[make_pair(x,y)]==0){
                    mp1[make_pair(x,y)]++;
                    mp2[make_pair(x,y)]=i;
                }
                else{
                    mp1[make_pair(x,y)]=1;
                    mp2[make_pair(x,y)]=i;
                }
                Max=max(Max,mp1[make_pair(x,y)]);
            }
        }
        printf("%d\n",Max=Max<2?0:Max);
    }
    return 0;
}
/*************************   G. Trace  **********************************

链接:https://nanti.jisuanke.com/t/31459

题意:n个点,每次输入一个坐标,表示一个从(0,0)点开始的矩阵,后者会将前者
覆盖掉,如题目图片所示,求最终露在外面的周长,x,y两个点不会同时小于对应的xy

思路:set+二分
    1.将x,y分别存到x数组,y数组,开两个set,s1记录x坐标的变化,s2记录y坐标的变化
    2.由于后者会将前者覆盖,所以倒着匹配,利用lower_bound找到被覆盖的地方,将差值
相加,即为ans;

for(int i=n-1;~i;--i){
    auto it=s1.lower_bound(x[i]);
    ans+=x[i]-*--it;
    s1.insert(x[i]);
    it=s2.lower_bound(y[i]);
    ans+=y[i]-*--it;
    s2.insert(y[i]);
}
代码解释:
    1.s1.lower_bound()的返回值为set的迭代器,是一个地址,所表达的值是x[i]在set中的地址,
因为set有自动排序以及去重的功能,所以--it表示比x[i]小的那个值的地址,*--it表示该值
    2.auto表示定义变量自动匹配数据类型,迭代器的标准定义方法为
    set<int>::iterator it;
    3.倒着遍历,找到上一个比他小的值求差,就可剪掉被覆盖部分,然后把这些差值加起来,即为ans

*************************************************************************/
#include<bits/stdc++.h>
using namespace std;
#define ll long long

const int maxn = 1e5+5;
int x[maxn],y[maxn];
set<int>s1,s2;

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d%d",&x[i],&y[i]);
    s1.insert(0),s2.insert(0);
    ll ans=0;
    for(int i=n-1;~i;--i){
        auto it=s1.lower_bound(x[i]);
        ans+=x[i]-*--it;
        s1.insert(x[i]);
        it=s2.lower_bound(y[i]);
        ans+=y[i]-*--it;
        s2.insert(y[i]);
    }
    printf("%lld\n",ans);
    return 0;
}

 

/********************************   I. Characters with Hash  *****************************

链接:https://nanti.jisuanke.com/t/31461

题意:给出一个n为字符串的长度,给出一个字符,使计算出字符串每个字符与该字符的差的绝对值,
每个值都是两位数,保持前导0,把这些数字拼接起来,去掉前导0,问新的串的长度

思路:
    1.遇到第一个不一样的,判断差的长度为1还是2,然后计算剩下的长度再加1或2即可
    2.当全部一样即字符串结果为0时,ans=1,因为长度为1;

******************************************************************************************/
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--){
        int n,ans,s=0;
        char x,a[1000005];
        cin>>n>>x>>a;
        for(int i=0;i<n;i++){
            if(x==a[i]) s++;
            else break;
        }
        ans=abs(x-a[s])<10?(n-s)*2-1:(n-s)*2;
        if(ans==0) ans=1;
        cout<<ans<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值