正常发挥吧,没倒数就非常开心了。。。红黑树那题敲慢了,也不知道想对了没有
A Live Love
水题略
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=(int)1e9+7;
const int maxn=100005;
int main(){
int t;
cin>>t;
while(t--){
int n,m;
scanf("%d%d",&n,&m);
int n0=n-m,n1=m;
printf("%d ",m);
printf("%d\n",(n1+n0)/(n0+1));
}
return 0;
}
K XOR Clique
水题略
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=1e6+9;
const LL mod=1e9+7;
LL read(){ LL ans=0; char last=' ',ch=getchar();
while(ch<'0' || ch>'9')last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans; return ans;
}
int bit[40];
int main(){
int t=read();
while(t--){
memset(bit,0,sizeof(bit));
int ans=0;
int n=read();
while(n--){
int a=read();
int ca=0;
while(a){
ca++;a>>=1;
}
bit[ca]++;ans=max(ans,bit[ca]);
}
printf("%d\n",ans);
}
}
C Halting Problem
n个操作,每个操作为:符合要求便走到固定的操作前,否则便走到下一个位置,问是否可以走到n+1的位置,那么可以知道有一片操作可能为一个循环节,如果有循环节便走不到
vis数组如果每次清零发现T了,用bitset优化才过
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=(int)1e9+7;
const int maxn=100005;
int n;
char op[10005][5];
bitset<10005> state[300];
int v[10005],k[10005];
int main(){
int t;
cin>>t;
while(t--){
for(int i=0;i<260;i++)state[i].reset();
int now=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",op[i]+1);
scanf("%d",&v[i]);
if(op[i][1]!='a'){
scanf("%d",&k[i]);
}
}
int nd=1,flag=0;
while(nd!=n+1){
if(state[now][nd]) {
flag=1;
break;
}
state[now][nd]=1;
if(op[nd][1]=='a'){
now=(now+v[nd])%256;
nd++;
}
else if(op[nd][2]=='e'){
if(now==v[nd]) nd=k[nd];
else nd++;
}
else if(op[nd][2]=='n'){
if(now!=v[nd]) nd=k[nd];
else nd++;
}
else if(op[nd][2]=='l'){
if(now<v[nd]) nd=k[nd];
else nd++;
}
else if(op[nd][2]=='g'){
if(now>v[nd]) nd=k[nd];
else nd++;
}
}
if(flag) printf("No\n");
else printf("Yes\n");
}
return 0;
}
H Traveling on the Axis
走红路灯,0红要等一秒,一秒后01转置。1绿直接走到下一个位置。用Ans(q,p)表示q点走到p点的时间,求 用dp[i]表示以第i个位置为起点的段的和
不够,因为红灯等一秒走一秒后面不会变,但是绿灯走一秒后面要变的,所以要用dp[0][i]表示原来的走到i的答案,dp[1][i]表示翻转后走到i的答案,那么转移方程为:
i位为1时:
i位为0时:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
char a[100005];
ll dp[2][100005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",a+1);
int n=strlen(a+1);
if(a[n]=='1') dp[1][n]=2,dp[0][n]=1;
else dp[1][n]=1,dp[0][n]=2;
for(int i=n-1;i>=1;i--)
{
if(a[i]=='1')
{
dp[0][i]=dp[1][i+1]+n-i+1;
dp[1][i]=dp[1][i+1]+2*(n-i+1);
}
else
{
dp[0][i]=dp[0][i+1]+2*(n-i+1);
dp[1][i]=dp[0][i+1]+n-i+1;
}
}
ll ans=0;
for(int i=1;i<=n;i++)
ans+=dp[0][i];//printf("dp[0][%d] = %lld ,dp[1][%d] = %lld\n",i,dp[0][i],i,dp[1][i]),
printf("%lld\n",ans);
}
return 0;
}
J Press the Button
暴力lcm为一个循环节,把a的倍数和c的倍数塞进优先队列,一个一个取出来
结果优先队列T了,改成数组就可以了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const int mod=(int)1e9+7;
const int maxn=100005;
//priority_queue<pii, vector<pii>,greater<pii> > aim;
pii aim[4000009];
int n;
ll a,b,c,d,v,t;
int main(){
int T;
cin>>T;
while(T--){
n=0;
scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&v,&t);
ll lcm=a*c/__gcd(a,c);
ll upa=lcm/a;
ll upb=lcm/c;
ll ar1=1,ar2=1;
while(ar1<=upa&&ar2<=upb){
if(a*ar1<=c*ar2)aim[++n]={a*ar1,1},ar1++;
else aim[++n]={c*ar2,2},ar2++;
}
while(ar1<=upa)aim[++n]={a*ar1,1},ar1++;
while(ar2<=upb)aim[++n]={c*ar2,2},ar2++;
ll nowti=0,ans=b+d-1,tmp=0,tmp2=0,yu=t%lcm,bei=t/lcm;
for(int ar=1;ar<=n;ar++){
ll fi=aim[ar].first;
if(aim[ar].second==1){
if(fi<=nowti+v){
tmp+=b;
if(fi<=yu){
tmp2+=b;
}
}
else {
tmp+=b-1;
if(fi<=yu){
tmp2+=b-1;
}
}
}
else{
if(fi<=nowti+v){
tmp+=d;
if(fi<=yu){
tmp2+=d;
}
}
else {
tmp+=d-1;
if(fi<=yu){
tmp2+=d-1;
}
}
}
nowti=fi;
}
ans+=bei*tmp+tmp2;
printf("%lld\n",ans);
}
return 0;
}