由于之前学了下快读,后面所有程序都用快读了,代码长一些(全是模板)
A太水,n>=3直接不可能,n=1也不可能,n=2判断一下两位是否一样就行
#include<bits/stdc++.h> using namespace std; template <typename T> inline void read(T& x) { x=0;T f=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=x*f; return; } template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){ read(x); read(arg...); } template <typename T>inline void write(T x) { if(x<0)putchar('-'),x=-x; if(x<10)putchar(x+'0'); else write(x/10),putchar(x%10+'0'); } template <typename T,typename ...Arg>void write(T& x,Arg& ...arg){ write(x); putchar(' '); write(arg...); } int main(){ int x,T,n; read(T); string s; while(T--){ read(n); cin>>s; if(n>=3) printf("NO\n"); else if (n==2){ if(s[0]!=s[1]) printf("YES\n"); else printf("NO\n"); } else printf("YES\n"); } return 0; }
B:0-n的某种排列,让每相邻两个数做异或,总共有n个结果,问max(n个结果)的最小值是多少
max(n个结果)最高位肯定是1,是某最高位为1和另一最高位为0的数异或而成,不如直接让所有最高位为0放左边,最高位为1放右边,交界处是0和10000000,异或结果是最小的
#include<bits/stdc++.h> using namespace std; template <typename T> inline void read(T& x) { x=0;T f=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=x*f; return; } template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){ read(x); read(arg...); } template <typename T>inline void write(T x) { if(x<0)putchar('-'),x=-x; if(x<10)putchar(x+'0'); else write(x/10),putchar(x%10+'0'); } template <typename T,typename ...Arg>void write(T& x,Arg& ...arg){ write(x); putchar(' '); write(arg...); } int a[200005]; int main(){ int x,T,i,t,n; read(T); x=1; while(x<200005){ a[x]=666;x*=2; } while(T--){ cin>>n;t=0;n--; if(a[n]==666){ for(i=1;i<n;i++) printf("%d ",i); printf("%d %d\n",0,n); continue; } while(n--){ if(a[n+1]==666&&t==0){ printf("%d 0 ",n+1); t=n+1; } else printf("%d ",n+1); } } }
C:
给你a,b,有如下三种操作
a++
b++
a=a | b
每次选一种进行一次操作,问最少多少次可以让a=b
本来用自己脑补的巧方法做半天,后来群友说直接暴力,结果真就直接暴力出来了:
两种情况:1、不停地给a+1,直到a|b=b;2、不停地给b+1,直到a|b=b
#include<bits/stdc++.h> using namespace std; template <typename T> inline void read(T& x) { x=0;T f=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=x*f; return; } template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){ read(x); read(arg...); } template <typename T>inline void write(T x) { if(x<0)putchar('-'),x=-x; if(x<10)putchar(x+'0'); else write(x/10),putchar(x%10+'0'); } template <typename T,typename ...Arg>void write(T& x,Arg& ...arg){ write(x); putchar(' '); write(arg...); } int main(){ int x,y,a,b,yy,xx,ans,res,T; read(T); while(T--){ read(x,y); ans=y-x; for(int i=x;i<=x+ans;i++){ if(i==y) ans=min(ans,i-x); else if((i|y)==y) ans=min(ans,i-x+1); } for(int i=y;i<=y+ans;i++){ if((i|x)==i) ans=min(ans,i-y+1); } // printf("xx:%d yy:%d a:%d\n",xx,yy,a); printf("%d\n",ans); } }
D题略可惜,st表题,手头没有st表的模板,对网上的st表板子修改时间也不够了,这两天赶紧补一个st表板子出来。