2021icpc网络赛

I. Neighborhood Search

题意: 第一行是一个集合,第二行与第三行分别输入 A , r A,r Ar输出集合中 A − r , A + r A-r,A+r Ar,A+r的值。

#include <bits/stdc++.h>
using namespace std;
using ll = long long ;
int main()
{
    ios::sync_with_stdio(false);
    int x;
    deque<int>q;
    vector<int>a;
    while(cin>>x){
        q.push_back(x);
        while(q.size()>2){
            a.push_back(q.front());
            q.pop_front();
        }
    }
    sort(a.begin(),a.end());
    int l=lower_bound(a.begin(),a.end(),q[0]-q[1])-a.begin(),r=upper_bound(a.begin(),a.end(),q[0]+q[1])-a.begin()-1;
    if(l==a.size()){
        cout<<"\n";
    }else{
        for(int i=r;i>=l;i--)
            cout<<a[i]<<' ';
    }
}

F. Land Overseer

计算几何(签到)

#include <bits/stdc++.h>
using namespace std;
using ll = long long ;
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
        double a,b,r;
        scanf("%lf%lf%lf",&a,&b,&r);
        if(r>=b){
            printf("Case #%d: %.2lf\n",i,2*a-r);
        }else{
            double ans=sqrt(a*a+pow(b-r,2))*2.0-r;
            printf("Case #%d: %.2lf\n",i,ans);
        }
    }
}

H.Mesh Analysis

模拟

#include <bits/stdc++.h>
using namespace std;
using ll = long long ;
map<int,set<int>>mp1,mp2;
int main()
{
    int n,m;
    cin>>n>>m;getchar();
    string s;
    while(n--)getline(cin,s);
    while(m--){
        int i,u,a,b,c;
        cin>>i>>u;
        if(u==203){
            cin>>a>>b>>c;
            mp1[a].insert(i);
            mp1[b].insert(i);
            mp1[c].insert(i);
            mp2[a].insert(b);
            mp2[a].insert(c);
            mp2[b].insert(a);
            mp2[b].insert(c);
            mp2[c].insert(a);
            mp2[c].insert(b);
        }
        else{
            cin>>a>>b;
            mp1[a].insert(i);
            mp1[b].insert(i);
            mp2[a].insert(b);
            mp2[b].insert(a);
        }
    }
    int q;
    cin>>q;
    while(q--){
        int x;cin>>x;
        cout<<x<<"\n[";
        bool f=0;
        for(auto &t:mp2[x]){
            if(f)cout<<',';
            cout<<t;f=1;
        }
        cout<<"]\n[";
        f=0;
        for(auto &t:mp1[x]){
            if(f)cout<<',';
            cout<<t;f=1;
        }
        cout<<"]\n";
    }
}

k.Segment Routing

阅读理解输入前 n n n行表示第 i i i行到 x x x的有向边,前 m m m行表示从第 x 1 x_1 x1个数往后走 x 2 . . . x_2... x2...个数最后走到哪里,走不到返回 P a c k e t L o s s Packet Loss PacketLoss

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define re register
#define ll long long int

using namespace std;
const int N = 1e5 + 10;

vector<ll> road[N];

void test(ll n)
{
    for (ll i = 0; i < n; i++)
    {
        for (ll j = 0; j < road[i].size(); j++)
            cout << road[i][j] << " ";
        cout << "\n";
    }
}

signed main()
{
    ll t = 1; cin >> t;
    for (ll k = 1; k <= t; k++)
    {
        ll n, m; cin >> n >> m;
        ll ways, way;
        for (ll i = 1; i <= n; i++)
        {
            road[i].clear();
            cin >> ways;
            for (int j = 1; j <= ways; j++)
            {
                cin >> way;
                road[i].push_back(way);
            }
        }

        //test(n);

        cout << "Case #" << k << ": \n";

        for (ll i = 1; i <= m; i++)
        {
            ll start = 0;
            ll times = 0;
            bool exist = 1;
            cin >> start >> times;

            ll cur = start; ll to;
            for (ll j = 1; j <= times; j++)
            {
                cin >> to;
                if (to > road[cur].size() || !to) exist = 0;
                if (!exist) continue;

                cur = road[cur][to - 1];
            }

            if (!exist) cout << "Packet Loss\n";
            else cout << cur << "\n";
        }
    }

    return 0;
}

A.Busiest Computing Nodes

#include <bits/stdc++.h>
using namespace std;
using ll = long long ;
const int N = 1e5+10 ;
ll a[N<<2];
ll query(int k,int l,int r,int L,int R){
    if(l<=L&&r>=R)return a[k];
    ll ans=1e18;
    int mid=L+R>>1;
    if(l<=mid)ans=min(ans,query(k<<1,l,r,L,mid));
    if(r>mid)ans=min(ans,query(k<<1|1,l,r,mid+1,R));
    return ans;
}
void modify(int k,int x,int L,int R,int add){
    if(x<=L&&x>=R){
        a[k]=add;
        return ;
    }
    int mid=L+R>>1;
    if(x<=mid)modify(k<<1,x,L,mid,add);
    else modify(k<<1|1,x,mid+1,R,add);
    a[k]=min(a[k<<1],a[k<<1|1]);
}
ll cnt[N];
int main()
{
    ios::sync_with_stdio(false);
    int k,n;
    cin>>k>>n;
    ll ans=0;
    for(int i=0;i<n;i++)
    {
        ll a,b;
        cin>>a>>b;
        ll l=i%k+1,r=i%k+k;
        if(query(1,l,r,1,2*k)>a)continue;
        while(l<=r){
            ll mid=l+r>>1;
            if(query(1,l,mid,1,2*k)<=a)r=mid-1;
            else l=mid+1;
        }
        modify(1,l,1,2*k,a+b);
        modify(1,(l+k-1)%(2*k)+1,1,2*k,a+b);
        ans=max(ans,++cnt[(l-1)%k+1]);
    }
    bool f=0;
    for(int i=1;i<=k;i++)
        if(cnt[i]==ans){
            if(f)cout<<' ';f=1;
            cout<<i-1;
        }
}

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾海、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值