区域赛补题记录
22威海 L. Novice Magician
简单构造,但是读错了半年。
大意是构造一组方程有唯一解。
随便凑一个就行,没有任何讲究,不知道为啥没人过。
#include<bits/stdc++.h> using namespace std;typedef long long ll;typedef long double ld;void ini();void solve(); const int mod=998244353; //const int mod=1e9+7; const ll inf=1e18; int cases=0; int main(){ ini(); ios::sync_with_stdio(0);cin.tie(0),cout.tie(0); cout<<fixed<<setprecision(6); int T; if(cases)cin>>T;else T=1; for(int tt=0;tt<T;tt++){ solve(); } } const int N=2112; ll a[N],ans[N];int l[N],r[N]; void solve(){ int m;cin>>m; int n=1<<m; if(n==2){ cin>>a[0]>>a[1]; cout<<"YES\n2\n"; cout<<a[0]<<' '<<0<<'\n'<<a[1]<<' '<<1<<'\n'; return; } ll s=0; for(int i=0;i<n;i++)cin>>a[i],s+=a[i]; if(s%(n/2)){ cout<<"NO\n"; return; } cout<<"YES\n"<<n<<'\n'; ll x=a[0]; cout<<a[0]<<' ';for(int i=0;i<n/2;i++)cout<<i<<' ',a[i]-=x+i*2;cout<<'\n'; x=(0+n-2)*(n/2)/2; ll vtot=0; for(int i=1;i<n;i++)a[i]-=x; for(int i=1;i<n;i++)vtot+=a[i]; vtot/=n/2; for(int i=1;i<n;i++)l[i]=i,r[i]=(i+n/2-1)%(n-1)+1,ans[r[i]]=(a[i]+a[r[i]]-vtot); for(int i=1;i<n;i++){ cout<<ans[i]<<' '; for(int j=l[i];j!=r[i];j=j%(n-1)+1)cout<<j<<' '; cout<<'\n'; } } void ini(){}
注意点:
输出YES同时输出n个数,这会导致20罚时
2的时候需要特判,这会导致20+罚时
22威海 M. String Master
想补,待填。
20威海 J. Steins;Game
如果第i堆为白色,那么sg值为ai;
考虑有k堆已经排好序的黑色b1~bk,它的sg值为b1-(cnt[b1]&1^有更大堆)
钦定一个黑色堆的最小值/个数,求出它的sg,然后就是剩下一些数xor和的方案数,这是个线性基结论。
注意点:
细节比较多,sg得手玩清楚。
写了1H左右,但是绝大部分时间在构思细节,这个应该在机下做好,实际代码时间需要控制在20min以内。
%=写成了%,如果不是clion就检查不出来了,这会导致25罚时
20威海 K. Tree Tweaking
复杂度写在了题面里,但是这种基于算法的题我都不太会啊,需要努力。
思路:
题解: