1003
签到题
#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=1e6+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;
int arr[N],n,m,k;
ll solve()
{
cin>>n>>m>>k;
for(int i=0;i<m;i++)
cin>>arr[i];
sort(arr,arr+m);
ll ret=k-1;
ret+=arr[0]-1+abs(k-arr[0]);
for(int i=1;i<m;i++)
ret+=abs(k-arr[i])*2;
return ret;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
// freopen("in.txt","r",stdin);
int _;cin>>_;
while(_--)
{
cout<<solve()<<endl;;
}
return 0;
}
1005
在此期间遇到的所有博弈论问题都是使劲推就可以推出来,这个比赛期间推了俩小时直接爆炸,对于单堆的很快就可以推出来关于奇偶性的规律,但是多堆真的推吐了,最后画到第五维表格的时候队友说ac了,队友期间一直在说什么子问题,我还以为是队友想歪了,赛后才知道有sg函数(nim函数)这种黑科技,很容易推出sg函数,这样问题就转换成了说在1e3的复杂度内分解一个1e9大小的数。
比赛期间想到的是miller-rabin算法加上n^(1/3)暴力,但是赛后听jls说在n较小时使用pollard_rho会复杂度很大,还是直接暴力对每个素数判断会好些,1e9大小的数,只用判断到4e4以下的素数,小于x的素数个数是x/ln(x),所以大概就是1e3级别的。
另外代码需要进行优化,一个是不可以用vector来存素数,一个是当a==1时要直接break
#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri {int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=4e4+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;
bool vis[N];
int prim[N],num;
bool solve()
{
int n;
cin>>n;
int ret=0;
while(n--)
{
int a,add=0;
cin>>a;
while(a%2==0)
{
add=1;
a/=2;
}
for(int i=0;i<num;i++)
{
while(a%prim[i]==0)
{
a/=prim[i];
add++;
}
if(a==1)break;
}
if(a!=1)
add++;
ret^=add;
}
return ret;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
// freopen("in.txt","r",stdin);
for(int i=2; i<N; i++)
if(!vis[i])
for(int j=i<<1; j<N; j+=i)
vis[j]=1;
for(int i=3; i<N; i++)
if(!vis[i])prim[num++]=i;
int _;
cin>>_;
while(_--)
{
if(solve())
cout<<"W"<<endl;
else
cout<<"L"<<endl;
}
}
1006
读题一小时,做题十分钟,阅读理解题实锤,感觉就是把题读懂,然后暴力把每个边界点都带进两边的两条路,走到终点n看输出的答案是否一样,一样的话说明节点处没断是连续的;代码就是纯模拟,最坏复杂度是O(t*n*k*log(n)),由于边数实际上很小根本跑不满再加上n也不大log(n)也小所以暴力复杂度没问题。
#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=500+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;
int n,k[N],d[N][N];
ll a[N][N],c[N][N],b[N][N];
ll dfs(int s,ll x)
{
if(s==n)return x;
int id=lower_bound(a[s],a[s]+k[s],x)-a[s];
return dfs(d[s][id],x*c[s][id]+b[s][id]);
}
bool solve()
{
cin>>n;
if(n==1)return 1;
for(int i=1;i<n;i++)
{
cin>>k[i];
for(int j=0;j<k[i];j++)
{
cin>>c[i][j]>>b[i][j]>>d[i][j]>>a[i][j];
}
cin>>c[i][k[i]]>>b[i][k[i]]>>d[i][k[i]];
}
for(int i=n-1;i;i--)if(k[i])
{
for(int j=0;j<k[i];j++)
{
ll t=a[i][j];
if(dfs(d[i][j],t*c[i][j]+b[i][j])!=dfs(d[i][j+1],t*c[i][j+1]+b[i][j+1]))
return 0;
}
}
return 1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
// freopen("in.txt","r",stdin);
int _;cin>>_;
for(int cas=1;cas<=_;cas++)
{
cout<<"Case #"<<cas<<": ";
if(solve())cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
1007
比赛时发现了规律,看着过的挺多的就直接大胆交了,只需找到出现最多的字母
#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=500+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;
int solve()
{
string s;cin>>s;
int cnt[150]={},ma=0;
for(auto i:s)
cnt[i]++;
for(int i='a';i<='z';i++)
ma=max(ma,cnt[i]);
return ma;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
// freopen("in.txt","r",stdin);
int _;cin>>_;
for(int cas=1;cas<=_;cas++)
{
cout<<"Case #"<<cas<<": "<<solve()<<endl;
}
return 0;
}
1010
纯粹签到题
#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=500+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;
int arr[N];
bool solve()
{
int n;cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
for(int i=1;i<n;i++)
if(arr[i]==arr[i-1])return 0;
return 1;
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);cout.tie(0);
// freopen("in.txt","r",stdin);
int _;cin>>_;
while(_--)
{
if(solve())puts("YES");
else puts("NO");
}
return 0;
}
1011
阅读理解拼胆量题,三次pe才过,有空格有回车,有空格无回车,无空格无回车/(ㄒoㄒ)/~~
#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=500+10;
const ll mod=1e9+7;
const double PI=acos(0)*2;
int A[N][N],K[N][N];
void solve()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>A[i][j];
int sum=0;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
{
cin>>K[i][j];
sum+=K[i][j];
}
}
if(sum!=K[1][1])
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
A[i][j]=0
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<A[i][j];
if(j!=n)cout<<' ';
}
cout<<endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
// freopen("in.txt","r",stdin);
int _;cin>>_;
while(_--)
{
solve();
}
return 0;
}