1. 程式人生 > 遊戲 >《全面戰爭:戰錘3》Steam中文區“多半差評” 線上峰值超13萬

《全面戰爭:戰錘3》Steam中文區“多半差評” 線上峰值超13萬

Codeforces Round #682 (Div. 2)

CF1438A Specific Tastes of Andre

洛谷傳送門
CF1438A


程式碼(全鋪成1就可以了)

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline void print(int ans){
	if (ans>9) print(ans/10);
	putchar(ans%10+48);
}
signed main(){
	for (rr int T=iut();T;--T,putchar(10)){
		for (rr int n=iut();n;--n)
		    putchar(49),putchar(32);
	}
	return 0;
}

CF1438B Valerii Against Everyone

洛谷傳送門
CF1438B


分析

如果不存在兩個數相同,那麼就不可能產生進位,相加之後也不一樣。

如果存在兩個數相同,那答案就是這兩個數所在的區間 \([i,i]\)\([j,j]\)


程式碼

#include <cstdio>
#include <cctype>
#include <map>
#define rr register
using namespace std;
int n,flag; map<int,bool>uk;
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline void print(int ans){
	if (ans>9) print(ans/10);
	putchar(ans%10+48);
}
signed main(){
	for (rr int T=iut();T;--T){
		n=iut(),uk.clear(),flag=0;
		for (rr int i=1,x;i<=n;++i)
		if (uk[x=iut()]) {
			if (!flag) puts("YES");
			flag=1;
		}else uk[x]=1;
		if (!flag) puts("NO");
	}
	return 0;
}

CF1438C Engineer Artem

洛谷傳送門
CF1438C


分析

直接對矩陣黑白染色,黑色放奇數,白色放偶數即可
反正考場上沒想到QAQ


程式碼

#include <iostream>
using namespace std;
int T,n,m;
int main(){
	ios::sync_with_stdio(0);
	for (cin>>T;T;--T){
		cin>>n>>m;
		for (int i=1;i<=n;++i,cout<<endl)
		for (int j=1;j<=m;++j){
			int x; cin>>x;
			if ((i^j^x)&1) cout<<x+1<<" ";
			    else cout<<x<<" ";
		}
	}
	return 0;
}

CF1438D Powerful Ksenia

洛谷傳送門
CF1438D


分析

有一些性質:異或前後異或和不變;如果有兩個數 \(a_j,a_k\) 相同,那麼 \(a_i,a_j,a_k\) 異或之後全部變成 \(a_i\)

那麼給兩兩配對,如果序列長度為奇數意味著可以先用 \(\frac{n-1}{2}\) 次將配對的數變為相同的數,

再用 \(\frac{n-1}{2}\) 次將所有數變相同。

否則序列長度為偶數有解當且僅當所有數異或和為0,這樣只對前 \(n-1\) 個數操作第 \(n\) 個數會自動相同


程式碼

#include <iostream>
using namespace std;
int n,sum;
int main(){
	ios::sync_with_stdio(0);
	cin>>n;
	for (int i=1;i<=n;++i){
		int x; cin>>x,sum^=x;
	}
	if (!(n&1)&&sum) cout<<"NO";
	else{
		cout<<"YES"<<endl<<n-2+(n&1)<<endl;
		for (int i=2;i<n;i+=2) cout<<1<<" "<<i<<" "<<i+1<<endl;
		for (int i=2;i<n;i+=2) cout<<1<<" "<<i<<" "<<i+1<<endl;
	}
	return 0;
}

CF1438E Yurii Can Do Everything

洛谷傳送門
CF1438E


分析

考慮 \(O(n^2)\) (bushi
因為總和肯定會增大,所以考慮以左端點為基準或者以右端點為基準,

當增大到 \(2^{mx[i]+1}\) 時異或值一定不相等,退出迴圈。

這樣看時間貌似是差不多的,但是如果考慮列舉 \(mx[i]\) 的話,每個位置最多被訪問兩次。

所以時間複雜度為 \(O(n\log \max\{a_i\})\)


程式碼

#include <iostream>
#include <set>
using namespace std;
const int N=34011;
int n,mx[N],a[N*6],bit[N*6]; set<pair<int,int> >ans;
int main(){
	ios::sync_with_stdio(0);
	cin>>n;
	for (int i=0;i<15;++i)
	for (int j=(1<<i);j<(1<<(i+1));++j)
	    mx[j]=i+1;
	for (int i=1;i<=n;++i){
		cin>>a[i];
		if (!(a[i]>>15)) bit[i]=mx[a[i]];
		    else bit[i]=15+mx[a[i]>>15]; 
	}
	for (int i=1;i<n-1;++i){
		int sum=a[i+1];
		for (int j=i+2;j<=n;++j){
			if (sum>=(1<<bit[i])) break;
			if ((a[i]^a[j])==sum) ans.insert(make_pair(i,j));
			sum+=a[j];
		}
	}
	for (int j=n;j>2;--j){
		int sum=a[j-1];
		for (int i=j-2;i;--i){
			if (sum>=(1<<bit[j])) break;
			if ((a[i]^a[j])==sum) ans.insert(make_pair(i,j));
			sum+=a[i];
		}
	}
	cout<<ans.size();
	return 0;
}

CF1438F Olha and Igor

洛谷傳送門
CF1438F


分析

如果把這種題放考場可能還是不會做QWQ

這道題最妙的就是用420次隨機三個點,

就可以知道根節點的兩個子節點。

然後再用 \(n\) 次判斷根節點即可,證明也不會。

反正隨機題都挺玄學的


程式碼

#include <iostream>
#include <algorithm>
using namespace std;
const int N=300011;
int n,h,rk[N],c[N];
bool cmp(int x,int y){return c[x]>c[y];}
int main(){
	ios::sync_with_stdio(0);
	cin>>h,n=(1<<h)-1,srand(33333331);
	for (int i=1;i<=n;++i) rk[i]=i;
	for (int i=1;i<421;++i){
		int x=(rand()*rand()+rand())%n+1,y=(rand()*rand()+rand())%n+1,rt=(rand()*rand()+rand())%n+1;
		while (x==y) y=(rand()*rand()+rand())%n+1;
		while (rt==x||rt==y) rt=(rand()*rand()+rand())%n+1;
		cout<<"? "<<x<<" "<<y<<" "<<rt<<endl;
		cin>>x; ++c[x];
	}
	sort(rk+1,rk+1+n,cmp);
	for (int i=1;i<=n;++i)
	if (i!=rk[1]&&i!=rk[2]){
		cout<<"? "<<rk[1]<<" "<<rk[2]<<" "<<i<<endl;
		int x; cin>>x;
		if (x==i){
			cout<<"! "<<x<<endl;
			return 0;
		} 
	}
	return 0;
}