题目来源:https://codeforces.com/contest/1301
过几天准备复习 (预习) 一下RMQ 然后补一下E
既然c一定要变成a或b中的一个,那如果他和a或b中对应的某一位相等,那换另一个不相等的就可以了,即判断c是不是每一位都可以在a或b中找到对应相等
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
double n,m;
int f[N];
char s3[N];
char s1[N],s2[N];
template<class T>
inline void read(T &x)
{
char c; x=1;
while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
T res=c-'0';
while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
x*=res;
}
int main()
{
int t;
r(t);
while(t--){
scanf("%s",s1+1);
scanf("%s",s2+1);
scanf("%s",s3+1);
int len=strlen(s1+1);
bool flag=1;
FOR(i,1,len){
if(s1[i]==s3[i]||s2[i]==s3[i]){
flag=1;
}
else{
flag=0;
break;
}
}
if(flag) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
完全可以把和-1相邻的正数放到一个x轴上,然后我们找一个点p使得p到这些点的距离的最大值最小。这么一说好像特别像牛客寒假训练营的某题,不过简单多了,因为没有y轴。我们直接取最大值和最小值的中间值即可
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
double n,m;
int f[N];
int g[N];
template<class T>
inline void read(T &x)
{
char c; x=1;
while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
T res=c-'0';
while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
x*=res;
}
int main()
{
int t;
r(t);
while(t--){
r(n);
FOR(i,1,n) r(f[i]);
int cnt=0;
FOR(i,1,n){
if(f[i]==-1){
if(i+1<=n&&f[i+1]!=-1) g[++cnt]=f[i+1];
if(i-1>=1&&f[i-1]!=-1) g[++cnt]=f[i-1];
}
}
sort(g+1,g+cnt+1);
//cout<
int mid=(g[cnt]+g[1])/2;
FOR(i,1,n) if(f[i]==-1) f[i]=mid;
int ans=0;
FOR(i,1,n-1) ans=max(ans,abs(f[i+1]-f[i]));
cout<<ans<<' '<<mid<<endl;
}
return 0;
}
这题我想了好久,关键是这个数据忒巧妙了,它前几个都是 1 2 3 4 5 6 之类的 我以为有什么规律… 找半天发现不太对。后来转换了角度,其实总的可以求出来,减去连续0的情况就好了
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,int> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
LL n,m;
template<class T>
inline void read(T &x)
{
char c; x=1;
while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
T res=c-'0';
while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
x*=res;
}
int main()
{
int t;
r(t);
while(t--){
r(n); r(m);
LL ans=n*(n+1)/2;
LL rest=n-m;
LL get=rest/(m+1);
LL cnt=rest%(m+1);
LL ans1=cnt*(get+1)*(get+2)/2;
ans1+=(m+1-cnt)*(get+1)*get/2;
cout<<ans-ans1<<endl;
}
return 0;
}
这题我写的时候就对自己的推论存在疑虑,但是我还是相信自己的,虽然最后还是没敲出来233 最后发现自己的推论错了,这个人有方法走完所有的路 !
①:往右走到尽头 然后折返
②:往下走一步
③:继续往右走到尽头
④:往上走一步,再往下走一步,再往左走一步 重复这三个操作 直到回到最左边
⑤:重复② ③ ④ 直到不能往下走
⑥:往上走到尽头
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
#define mp(x,y) make_pair(x,y)
#define r(x) read(x)
#define rrr(x,y,z) read(x);read(y);read(z)
#define FOR(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long LL;
typedef pair<int,string> pt;
const int N=1e6+5;
const int M=2e3+5;
const int INF=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-10;
const double pi=acos(-1);
int n,m;
template<class T>
inline void read(T &x)
{
char c; x=1;
while((c=getchar())<'0'||c>'9') if(c=='-') x=-1;
T res=c-'0';
while((c=getchar())>='0'&&c<='9') res=res*10+c-'0';
x*=res;
}
int main()
{
int k;
rrr(n,m,k);
if(4*n*m-2*n-2*m<k){
cout<<"NO\n";
return 0;
}
vector<pt> ans;
FOR(i,1,n){
if(i==1){
if(m-1>0){
if(k>m-1){
k-=(m-1);
ans.push_back(mp(m-1,"R"));
if(k>m-1){
ans.push_back(mp(m-1,"L"));
k-=(m-1);
}
else{
ans.push_back(mp(k,"L"));
k=0;
break;
}
}
else{
ans.push_back(mp(k,"R"));
k=0;
break;
}
}
}
else{
ans.push_back(mp(1,"D"));
k--;
if(k==0) break;
if(m-1>0){
if(k>m-1){
k-=(m-1);
ans.push_back(mp(m-1,"R"));
if(k>3*(m-1)){
k-=3*(m-1);
ans.push_back(mp(m-1,"UDL"));
}
else{
int cnt=k/3;
if(cnt>0) ans.push_back(mp(cnt,"UDL"));
int ext=k%3;
if(ext==1){
ans.push_back(mp(1,"U"));
}
else if(ext==2){
ans.push_back(mp(1,"UD"));
}
k=0;
break;
}
}
else{
ans.push_back(mp(k,"R"));
k=0;
break;
}
}
}
}
if(k!=0){
ans.push_back(mp(k,"U"));
}
cout<<"YES\n";
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++){
cout<<ans[i].first<<' '<<ans[i].second<<endl;
}
return 0;
}
虽然这题超出我当前的水平很多了,但我还是想补补,保证不咕