今天的思维题没有一个是自己做出来的,该给自己两个大逼兜,,,
Problem - 1304C - Codeforces
这道题去年也没有做出来,今天又来做这道题,还是没有想出来,自己还是那么菜啊(虽然也有sb干扰,但这并不能成为自己菜的理由),其实这就是一个判断区间交集的问题;最关键的地方就是如何处理左区间和右区间,既然可以升温也可以降温,那我们就让左端点降温,右端点升温,这样可以更宽泛的满足下一个区间,每次判断完不要忘了更新左端点和右端点;
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=32768;
const ll inf=0x3f3f3f3f;
ll t,n,m;
struct sb{
ll ti,l,r;
}a[110];
int main(){
//freopen("in.txt","r",stdin);
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&a[i].ti,&a[i].l,&a[i].r);
ll l=m,r=m;
a[0].ti=0;
bool flag=1;
for(int i=1;i<=n;i++){
ll ti=a[i].ti-a[i-1].ti;
l-=ti;r+=ti;
if(r<a[i].l||l>a[i].r){flag=0;break;}
l=max(l,a[i].l);
r=min(r,a[i].r);
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
Problem - 1404A - Codeforces
可以发现我们要保证s[i]和s[i+k](以下标0开始)相等,那样的话是不是就要保证s[i]与s[i%k]相等了?那我们就可以开始判断了,让每个字串都与[0,k]这个子串比较,能改就改,不能改就No,最后还要看看[0,k]这个子串是否合法即可;
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=32768;
const ll inf=0x3f3f3f3f;
ll t,n,k;
string s;
int main(){
//freopen("in.txt","r",stdin);
scanf("%lld",&t);
while(t--){
ll one=0,zero=0;
scanf("%lld%lld",&n,&k);
cin>>s;
bool flag=1;
for(int i=0;i<n;i++){
if(s[i]=='?'||s[i]==s[i%k]) continue;
else if(s[i%k]=='?') s[i%k]=s[i];
else{
flag=0;break;
}
}
for(int i=0;i<k;i++)
if(s[i]=='1') one++;
else if(s[i]=='0') zero++;
if(one>k/2||zero>k/2) flag=0;
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
Problem - 1391C - Codeforces
丫的打表打错了呀,我这个废物!然后就没往下去想了,其实要是有环说明一定存在一个数两边都有大于他的数,这么简单我都没看出来,,,那要是没有环的情况就是以n为峰顶的单峰序列了,这个单峰序列要怎么求呢,想一下固定n的位置,我们将n-1~1一个一个的去放,每个数有两种可能放到左边或右边,因为我们是从n-1开始放的,那么最后的序列的一般状况一定是先递增到n在递减,正好是我们想要的,1~n-1每个数有两种可能所以是2^(n-1),最后答案就是n!-2^(n-1);
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const ll inf=0x3f3f3f3f;
ll fac[1000006],n,two[1000006];
int main(){
//freopen("in.txt","r",stdin);
fac[0]=1;
two[0]=1;
for(int i=1;i<=1000000;i++) fac[i]=fac[i-1]*i%mod,two[i]=two[i-1]*2LL%mod;
scanf("%lld",&n);
printf("%lld\n",(fac[n]-two[n-1]+mod)%mod);
return 0;
}
P1531 I Hate It - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
虽然是水题,但反映了很多细节问题,值得注意一下
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1000000007;
const ll inf=0x3f3f3f3f;
const ll bou=1e15;
const int maxn=1e7+5;
ll n,m,a[200005],t[200005<<2];
void pushup(ll p){t[p]=max(t[p<<1],t[p<<1|1]);}
void update(ll l,ll r,ll p,ll L,ll R,ll c){
if(L<=l&&r<=R){
if(t[p]<c) t[p]=c;
return;
}
ll mid=l+r>>1;
if(mid>=L) update(l,mid,p<<1,L,R,c);//注意一定是L,R,不是l,r
if(mid<R) update(mid+1,r,p<<1|1,L,R,c);
pushup(p);
}
ll query(ll l,ll r,ll p,ll L,ll R){
if(L<=l&&r<=R) return t[p];
ll mid=l+r>>1;
ll res=0;
if(mid>=L) res=max(res,query(l,mid,p<<1,L,R));
//else if就错了,这不是if else的关系
if(mid<R) res=max(res,query(mid+1,r,p<<1|1,L,R));
return res;
}
int main(){
//freopen("in.txt","r",stdin);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
update(1,n,1,i,i,a[i]);
}
ll aa,b;
char c;
while(m--){
cin>>c>>aa>>b;
if(c=='Q'){
printf("%lld\n",query(1,n,1,aa,b));
}
else{
update(1,n,1,aa,aa,b);
}
}
return 0;
}