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

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));
}
}
}