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
數學題,甚至還有期望,會不了一點。