20240621【省選】模擬

和蜀玩發表於2024-06-21

T1 寄了。

T1

Bob 贏的條件有兩個:樹有完美匹配且 \(k\ge \frac{n}{\mathbf{2}}-\mathbf{1}\)。前一個顯然,證後一個的話考慮一段長為 \(\mathbf{4}\) 的鏈,能發現如果 Alan 先選了葉節點,那麼 Bob 無論選哪裡都是輸,這個時候 Bob 只需要切斷正中間的邊就能必贏,也就是整棵樹中要有 \(\frac{n}{\mathbf{2}}-\mathbf{1}\) 條邊要被切掉。然後就沒了。

T2

先按 \(a\) 從小到大排序,然後列舉 \(ax\),將 \(n\) 個人分為 \(a_i\ge ax\)\(a_i<ax\) 兩類。首先對於第一類是肯定要滿足 \(b_i,c_i\) 的最大值小於 \(bx,cx\) 的,所以答案是 \(p*(q-maxb)*(r-maxc)\)
對於第二類,若 \(b_i<bx\),則無論 \(cx\) 的取值都滿足條件。若 \(b_i\ge bx\),則需 \(cx>c_i\),然後就直接:



(我懶)

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls now<<1
#define rs now<<1|1
const ll N=5*114514,M=1919810;
ll n,p,q,r;
ll sb[N],sc[N],ans;
struct xx{
	ll a,b,c;
}a[N];
bool cmp(xx x,xx y){
	return x.a<y.a;
}
struct tree{
	ll l,r,len;
	ll sum,max,tag;
}t[4*N];
void pushup(ll now){
	t[now].sum=t[ls].sum+t[rs].sum;
	t[now].max=max(t[ls].max,t[rs].max);
}
void pushdown(ll now){
	ll k=t[now].tag;
	if(!k) return;
	t[ls].sum=k*t[ls].len;
	t[rs].sum=k*t[rs].len;
	t[ls].max=t[rs].max=k;
	t[ls].tag=t[rs].tag=k;
	t[now].tag=0;
}
void build(ll now,ll l,ll r){
	t[now].l=l,t[now].r=r;
	t[now].len=r-l+1; //我勒個騷剛 
	if(l==r){
		t[now].sum=t[now].max=1;
		return;
	}
	ll mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(now);
}
void update(ll now,ll x,ll y,ll k){
	if(t[now].l>=x&&t[now].r<=y){
		t[now].sum=k*t[now].len;
		t[now].max=t[now].tag=k;
		return;
	}
	pushdown(now);
	ll mid=(t[now].l+t[now].r)>>1;
	if(x<=mid) update(ls,x,y,k);
	if(y>mid) update(rs,x,y,k);
	pushup(now);
}
ll query_pos(ll now,ll k){
	if(t[now].l==t[now].r) return t[now].l;
	pushdown(now);
	if(t[rs].max<=k) return query_pos(ls,k);
	else return query_pos(rs,k);
}
ll query_sum(ll now,ll x,ll y){
	if(x>t[now].r||y<t[now].l||x>y) return 0;
	if(t[now].l>=x&&t[now].r<=y) return t[now].sum;
	pushdown(now);
	ll mid=(t[now].l+t[now].r)>>1,ans=0;
	if(x<=mid) ans+=query_sum(ls,x,y);
	if(y>mid) ans+=query_sum(rs,x,y);
	return ans;
}
ll query_po(ll val){
	if(query_sum(1,1,1)<=val) return 0;
	else return query_pos(1,val);
}
void Firefly(ll tar,ll val){
	if(!tar||!val) return;
	if(query_sum(1,1,1)<=val) update(1,1,tar,val);
	else{
		ll pos=query_pos(1,val);
		if(pos<tar) update(1,pos+1,tar,val);
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>p>>q>>r;
	for(int i=1;i<=n;++i) cin>>a[i].a>>a[i].b>>a[i].c;
	a[++n].a=0;
	sort(a+1,a+n+1,cmp);
	build(1,1,q);
	a[++n].a=p;
	for(int i=n;i>=1;--i){
		sb[i]=max(sb[i+1],a[i].b);
		sc[i]=max(sc[i+1],a[i].c);
	}
	for(int i=1;i<n;++i){
		Firefly(a[i].b,a[i].c+1);
		if(a[i].a==a[i+1].a) continue;
		ll y=sb[i+1]+1,z=sc[i+1]+1,pos=query_po(z)+1,res=0;
		if(pos<y) res=(q-y+1ll)*(r-z+1ll);
		else res=(q-pos+1ll)*(r-z+1ll)+(pos-y)*(r+1ll)-query_sum(1,y,pos-1);
		ans+=res*(a[i+1].a-a[i].a);
	}
	cout<<ans;
	return 0;
}

T3

數學題,甚至還有期望,會不了一點。

相關文章