最后一场了,打得一般。三题。。

1003 Valentine's Day

按成功率从大到小取,如果对答案有提高的作用,加上这个点,同时更新一下失败的和成功的概率。

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

#define ll long long
ll input(){
    ll x=0,f=0;char ch=getchar();
    while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return f? -x:x;
}

const int N=10007;

int n;

double p[2];

double a[N];

int main(){
    int T=input();
    while(T--){
        n=input();
        for(int i=1;i<=n;i++)
            scanf("%lf",&a[i]);

        sort(a+1,a+1+n);
            p[0]=a[n],p[1]=1-a[n];
        
            for(int i=n-1;i>=1;i--){
                if(p[0]*(1-a[i])+a[i]*p[1]>p[0]){
                    p[0]=p[0]*(1-a[i])+a[i]*p[1];
                    p[1]=p[1]*(1-a[i]);
                }
            }
        
        printf("%.12lf\n",p[0]);
    }
}

1005 Welcome Party

线段树维护最大值,multiset搞一搞就可以了。

两个值x,y 对x从小到大排序。枚举a作为最大值,那么i+1到n的最大值mx和1到i-1位置的b选一个最接近当前a的值就ok了。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=1e5+10;
int n;
struct node
{
    ll x,y;
}a[N];
ll mx[N*4];
int len;
bool cmp(node a,node b)
{
    if(a.x==b.x) return a.y<b.y;
    return a.x<b.x;
}
void build(int id,int l,int r)
{
   if(l==r)
   {
       mx[id]=a[l].y;
       return ;
   }
   int mid=l+r>>1;
   build(id<<1,l,mid);
   build(id<<1|1,mid+1,r);
   mx[id]=max(mx[id<<1],mx[id<<1|1]);
}
ll qu(int id,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr)
    {
        return mx[id];
    }
    int mid=l+r>>1;
    ll res=0;
    if(ql<=mid) res=max(res,qu(id<<1,l,mid,ql,qr));
    if(qr>mid) res=max(res,qu(id<<1|1,mid+1,r,ql,qr));
    return res;
}

int main()
{
    int _;cin>>_;while(_--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i) scanf("%lld%lld",&a[i].x,&a[i].y);
        sort(a+1,a+1+n,cmp);
        build(1,1,n);
        multiset<ll>st;
        ll ans=0x3f3f3f3f3f3f3f3f;
        //for(int i=1;i<=n;++i) printf("x:%lld y:%lld\n",a[i].x,a[i].y);
        for(int i=1;i<=n;++i)
        {
            ll mxx=0;
            if(i<n)
            {
                mxx=qu(1,1,n,i+1,n);
                st.insert(mxx);
            }
            ll val=max(a[i].x,mxx);
            auto it=st.upper_bound(val);
            //printf("i:%d mxx:%lld it1:%lld\n",i,mxx,*it);
            if(it!=st.end()) ans=min(ans,abs(a[i].x-*it));
            it--;
            //printf("i:%d mxx:%lld it2:%lld\n",i,mxx,*it);
            ans=min(ans,abs(a[i].x-*it));
            if(i<n)
            {
                auto it1=st.find(mxx);
                st.erase(it1);
            }
            st.insert(a[i].y);
        }
        printf("%lld\n",ans);
    }
}

1009 Block Breaker

签到题

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=2e3+10;
int vis[N][N],ma[N][N][2];
int n,m,q;
struct node
{
    int x,y;
};
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int bfs(int x1,int y1)
{
    queue<node>que;
    que.push({x1,y1});
    int ans=1;
    while(que.size())
    {
        node now=que.front();que.pop();
        //printf("nowx:%d nowy:%d\n",now.x,now.y);
        for(int i=0;i<4;++i)
        {
            int x=now.x+dir[i][0];
            int y=now.y+dir[i][1];

            if(x<=0||y<=0||x>n||y>m) continue;
            if(vis[x][y]==0)continue;
            if(i<=1)
            {
                //printf("0:X:%d y:%d\n",x,y);
                ma[x][y][0]=0;
            }
            else
            {
                //printf("1:X:%d y:%d\n",x,y);
                ma[x][y][1]=0;
            }

            //printf("x:%d y:%d\n",x,y);
            if(ma[x][y][0]==0&&ma[x][y][1]==0)
            {
                ans++;
                vis[x][y]=0;
                que.push({x,y});
            }
        }
    }
    return ans;
}
int main()
{
    int _;cin>>_;while(_--)
    {
        scanf("%d%d%d",&n,&m,&q);
        for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) vis[i][j]=1,ma[i][j][0]=1,ma[i][j][1]=1;
        while(q--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            if(vis[x][y]==0)
            {
                printf("0\n");
                continue;
            }
            vis[x][y]=0;
            ma[x][y][0]=ma[x][y][1]=0;
            printf("%d\n",bfs(x,y));
        }
    }
}