2021牛客国庆集训派对day6
Singing Contest
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int winner[(1<<14)+5];
int main()
{
int _,Case=0;
cin >> _;
while(_--)
{
vector <int> v[(1<<14)+5];
memset(winner,0,sizeof(winner));
int n;
cin >> n;
int num=pow(2,n);
for(int i=1;i<=num;i++)
{
for(int j=1;j<=n;j++)
{
int number;
cin >> number;
v[i].push_back(number);
}
sort(v[i].begin(),v[i].end());
}
int cnt=0;
for(int i=1;i<=num;i+=2)
{
int Min=v[i][v[i].size()-1]<v[i+1][v[i+1].size()-1]?i:i+1;
int Max=i+i+1-Min;
int pos=upper_bound(v[Max].begin(),v[Max].end(),v[Min][v[Min].size()-1])-v[Max].begin();
v[Max].erase(v[Max].begin()+pos);
winner[++cnt]=Max;
}
while(--n)
{
for(int i=1;i<=cnt;i+=2)
{
int Min=v[winner[i]][v[winner[i]].size()-1]<v[winner[i+1]][v[winner[i+1]].size()-1]?winner[i]:winner[i+1];
int Max=winner[i]+winner[i+1]-Min;
int pos=upper_bound(v[Max].begin(),v[Max].end(),v[Min][v[Min].size()-1])-v[Max].begin();
v[Max].erase(v[Max].begin()+pos);
winner[(i+1)/2]=Max;
}
cnt/=2;
}
printf("Case #%d: %d\n",++Case,winner[1]);
}
return 0;
}
Bulbasaur
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100005
int flag[N];
struct Node
{
int a;
int b;
int c;
}node[N];
bool cmp(Node x,Node y)
{
if(x.c!=y.c)
return x.c>y.c;
else if(x.a!=y.a)
return x.a<y.a;
else
return x.b<y.b;
}
int main()
{
int _,Case=0;
cin >> _;
while(_--)
{
memset(flag,0,sizeof(flag));
int n,m,k;
cin >> n >> m >> k;
for(int i=1;i<=k;i++)
cin >> node[i].a >> node[i].b >> node[i].c;
sort(node+1,node+1+k,cmp);
long long ans=0;
for(int i=1;i<=k;i++)
{
if(!flag[node[i].b])
{
ans+=node[i].c;
flag[node[i].b]=1;
}
}
printf("Case #%d: %lld\n",++Case,ans);
}
return 0;
}
Heritage of skywalkert
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef unsigned long long ull;
unsigned x,y,z;
unsigned number[105];
unsigned tang()
{
unsigned t;
x^=x<<16;
x^=x>>5;
x^=x<<1;
t=x;
x=y;
y=z;
z=t^x^y;
return z;
}
unsigned gcd(unsigned x,unsigned y)
{
return y==0?x:gcd(y,x%y);
}
int main()
{
int _,Case=0;
cin >> _;
while(_--)
{
int n,A,B,C;
cin >> n >> A >> B >> C;
x=A,y=B,z=C;
priority_queue <unsigned,vector <unsigned> ,greater <unsigned> > q;
for(int i=1;i<=100;i++)
q.push(0);
for(int i=1;i<=n;i++)
{
unsigned number=tang();
if(number>q.top())
{
q.pop();
q.push(number);
}
}
int cnt=0;
while(!q.empty())
{
if(q.top())
number[++cnt]=q.top();
q.pop();
}
ull ans=0;
for(int i=1;i<=min(n,100)-1;i++)
for(int j=i+1;j<=min(n,100);j++)
ans=max(ans,(ull)number[i]*number[j]/gcd(number[i],number[j]));
printf("Case #%d: %llu\n",++Case,ans);
}
return 0;
}