【学习笔记】AGC036

ABC String

  • 神仙贪心题
  • 考虑基本的转化,对于一串相同的字母只保留一个
  • 不妨设 c n t [ A ] ≤ c n t [ B ] ≤ c n t [ C ] cnt[A]\le cnt[B]\le cnt[C] cnt[A]cnt[B]cnt[C]
  • 假设我们已经知道了保留的 A A A的位置,那么把未保留的 A A A全部删掉,对于相邻的相同的字母仍然只保留一个
  • p p p, q q q, r r r表示 A A A, B B B, C C C出现的次数,因为删除一个 A A A最多去掉一个 B B B C C C,所以 p ≤ q p\le q pq, p ≤ r p\le r pr
  • 假设 q = r q=r q=r,那么可以重复删除 B C BC BC直到 p = q = r p=q=r p=q=r。因为考虑 A A A隔开的若干子串,如果长度 ≥ 4 \ge 4 4那么就会出现 B C B C BCBC BCBC的结构,可以删去中间的 B C BC BC,如果长度 = 3 =3 =3就会出现 A B C B A ABCBA ABCBA的结构,可以删去中间的 B C BC BC C B CB CB,而根据鸽巢原理一定会有一段落入至少 3 3 3个字母(两端只能最多放一个字母)
  • 假设 q < r q<r q<r继续寻找必要条件,设含 B B B的子段数目为 x x x,只含一个 C C C的子段数目为 y y y,若 x < y x<y x<y,那么无论如何删除 B , C B,C B,C,它们的出现次数都不会相同。若 x ≥ y x\ge y xy,那么我们总能删除一些 C C C使得 B , C B,C B,C出现次数相同,这是因为我们总能对含 B B B的子段进行改造,使得这一段中 B B B的数目比 C C C 1 1 1
  • 回到原问题。问题转化为删除最少的 A A A使得留下的序列合法
  • 那么一个合法的序列应该满足:
  • B B B的串大于等于 C C C的单位串,含 C C C的串大于等于 B B B的单位串
  • 不妨验证其正确性:当 q < r q<r q<r时,因为合法所以含 B B B的串大于等于 C C C的单位串,同时反证法可以证明此时含 C C C的串大于等于 B B B的单位串 雾,卡了很久。当 q = r q=r q=r 时,若含 B B B的串小于 C C C的单位串,同样可以推出 B B B的数目比 C C C少,与前提矛盾
  • 设原序列中含 B B B串数目为 b 1 b1 b1 B B B的单位串数目为 b 2 b2 b2,含 C C C串数目为 c 1 c1 c1 C C C的单位串数目为 c 2 c2 c2
  • 如果 b 1 ≥ c 2 b1\ge c2 b1c2, c 1 ≥ b 2 c1\ge b2 c1b2那么可以把所有的 A A A保留下来。
  • 否则不妨设 b 1 < c 2 , c 1 ≥ b 2 b1<c2,c1\ge b2 b1<c2,c1b2
  • 然后我们每次删 A A A最多只能让 c 2 c2 c2 1 1 1而不能让 b 1 b1 b1变大
  • 那么模拟删 A A A,模拟输出方案即可
  • 复杂度 O ( n ) O(n) O(n)
  • AC Code
  • 该死调了一下午的大模拟

Modulo Matrix

  • 虽然乱搞过了但是还是学一下正解
  • 首先可以黑白染色考虑
  • 考虑对每条穿过黑色格子的斜对角线和正对角线分配质数 p p p
  • 每个黑色格子上的数就是穿过它的正对角线和副对角线上质数的乘积
  • 每个白色格子上的数就是上下左右四个数的 lcm \text{lcm} lcm加一,即 4 4 4个小质数的乘积加一
    算下来差不多就在 1 0 15 10^{15} 1015左右

Flipper

有没有那个大佬教我怎么乱搞啊

组合优化趣题

两个状态互相可达,当且仅当每一列 1 1 1的奇偶性相同,每一行模 3 3 3位置的异或和完全相同或全部取反。

考虑证明。显然转移是双向的,所以 A A A, B B B能转移到一个相同的状态就相互可达。

那么构造成一个大小为 ( 1 0 9 − 1 ) × ( 1 0 9 − 2 ) (10^9-1)\times (10^9-2) (1091)×(1092)的全是 0 0 0的矩阵即可。

p [ i ] = ⊕ x a [ x ] [ i ] p[i]=\oplus_xa[x][i] p[i]=xa[x][i] q [ x ] [ i ] = ⊕ y a [ x ] [ y ] ( y   m o d   3 = i ) q[x][i]=\oplus_{y}a[x][y](y\bmod 3=i) q[x][i]=ya[x][y](ymod3=i)

考虑构造 a [ i ] = ⊕ x q [ x ] [ i ] a[i]=\oplus_{x}q[x][i] a[i]=xq[x][i] b [ i ] = ∑ x p [ x ] ( x   m o d   3 = i ) b[i]=\sum_{x}p[x](x\bmod 3=i) b[i]=xp[x](xmod3=i)

那么剩下的 1 1 1的个数是 ∑ i = 0 2 max ⁡ ( a [ i ] , b [ i ] ) \sum_{i=0}^2\max(a[i],b[i]) i=02max(a[i],b[i])。注意到 b [ i ] b[i] b[i]是定值,因此我们只需要把偶数个 q [ x ] q[x] q[x] 取反,使得上式最小。

然后玄学贪心。考虑调整一下,把 ( 1 , 1 , 1 ) , ( 0 , 1 , 1 ) , ( 1 , 0 , 1 ) , ( 1 , 1 , 0 ) (1,1,1),(0,1,1),(1,0,1),(1,1,0) (1,1,1),(0,1,1),(1,0,1),(1,1,0)全部翻掉。

然后随便翻一个满足奇偶性。此时只会翻 ( 0 , 0 , 1 ) , ( 0 , 1 , 0 ) , ( 1 , 0 , 0 ) (0,0,1),(0,1,0),(1,0,0) (0,0,1),(0,1,0),(1,0,0)种类之一。

#include<bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pb push_back
#define db double
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
int n,m,c[100005][3],a[3],b[3],A[3],tot=0x3f3f3f3f;
map<int,int>p,q;
int calc(){
	int tot=0;for(int i=0;i<3;i++)tot+=max(A[i],b[i]);return tot;
}
void solve(){
	for(int i=0;i<3;i++)A[i]=a[i];int res=calc();
	if(A[0]>b[0]&&A[1]<b[1]&&A[2]<b[2]){
		while(1){
			A[0]-=2,A[1]+=2,A[2]+=2;if(calc()<res)res=calc();else break;
		}
		
	}
	else if(A[1]>b[1]&&A[0]<b[0]&&A[2]<b[2]){
		while(1){
			A[1]-=2,A[0]+=2,A[2]+=2;if(calc()<res)res=calc();else break;
		}
		
	}
	else if(A[2]>b[2]&&A[0]<b[0]&&A[1]<b[1]){
		while(1){
			A[2]-=2,A[0]+=2,A[1]+=2;if(calc()<res)res=calc();else break;
		}
	}tot=min(tot,res);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;cin>>x>>y,p[y]^=1;
		if(!q[x])q[x]=++m;c[q[x]][y%3]^=1;
	}for(auto x:p)b[x.fi%3]+=x.se;
	int f=0;
	for(int i=1;i<=m;i++){
		int cnt=0;for(int j=0;j<3;j++)cnt+=c[i][j];
		if(cnt>=2){
			f^=1;for(int j=0;j<3;j++)c[i][j]^=1;
		}
		for(int j=0;j<3;j++)a[j]+=c[i][j];
	}
	if(f){
		if(a[0])a[0]++,solve(),a[0]--;
		if(a[1])a[1]++,solve(),a[1]--;
		if(a[2])a[2]++,solve(),a[2]--;
		if(!(a[0]+a[1]+a[2]))a[0]++,a[1]++,a[2]++,solve();
	}
	else{
		solve();
	}cout<<tot;
}

Subset Sum Game

  • Alice \text{Alice} Alice必胜当且仅当能将 n n n个数分成 n 2 \frac{n}{2} 2n组,并选择其中一组中的一个数,使得这个数加上剩余 n 2 − 1 \frac{n}{2}-1 2n1组数中的最小值 ≥ L \ge L L,最大值 ≤ R \le R R
  • 否则 Bob \text{Bob} Bob总能使得当前局面下 Alice \text{Alice} Alice不存在必胜策略,直到所有数都被取完
  • 不妨看成是 Alice \text{Alice} Alice强行保留了一个数,并强行扔掉了一个数
  • 枚举这两个数即可做到复杂度 O ( n 2 ) O(n^2) O(n2)
  • 毋宁为猜结论的好题。

Neither AB nor BA

  • 巧妙的计数题
  • 考虑黑白染色,那么每次删除的位置都会跨过黑和白
  • 然后考虑做一个翻转,把奇数位的 B → A B\to A BA A → B A\to B AB
  • 那么原问题转化为长度为 n n n的序列,不能删除 A A AA AA B B BB BB,最终能够全部删完的序列数量
  • 单独考虑 A A A,因为每次至多删除 1 1 1个,所以 A A A的数目不能超过 n 2 \frac{n}{2} 2n,同理 B B B的数目也不能超过 n 2 \frac{n}{2} 2n
  • 问题转化为求 A , B A,B A,B数量 ≤ n 2 \le \frac{n}{2} 2n的序列的个数
  • 根据众数那套理论可以转化为求出现次数 > n 2 >\frac{n}{2} >2n的序列个数
  • 答案是 3 n − 2 ∑ i = n 2 + 1 n ( n i ) 2 n − i 3^n-2\sum_{i=\frac{n}{2}+1}^n\binom{n}{i}2^{n-i} 3n2i=2n+1n(in)2ni
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值