之前没接触过oi赛制打了一下心态小崩。。以为会了五题写出来对了两题,我就是纯纯小丑哈哈。
只打了两个小时也不能算正经vp把,就当是一个补题
2.灭鼠先锋
推必败必胜局面即可。具体的我就是乱推的,对于必胜的可能要稍微多想一会,对于必败的只要找出一种必败情况那显然就是必败了。但是因为看错题所以写反了。
(这题也要放代码?)
#include <iostream>
using namespace std;
int main()
{
cout<<"LLLV"<<endl;
return 0;
}
4.选数异或
思路:通过预处理找到每个l右边最小可行的r,然后查询就是O(1)。注意要处理两遍,第一遍先找到两个数异或等于x的最小r(显然是选每个数a右边第一个x^a),第二遍遍历lmin进一步缩小范围。
不知道为啥wa了(真是败给oi赛制了牛魔的)。后面重新写了一下分类讨论过了
#include<bits/stdc++.h>
using namespace std;
const int maxn=2097152;
int a[maxn];
int lmin[maxn];bool vis[maxn];
vector<int>E[maxn];
set<int>st;
int main()
{
int n,m,x;cin>>n>>m>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
E[a[i]].push_back(i);
st.insert(a[i]);
}
for(int i=1;i<=n+1;i++)lmin[i]=0x3f3f3f3f;
for(int i:st){
if(vis[i])continue;
int tmp=x^i;vis[i]=1;vis[tmp]=1;
if(tmp==i){
for(int j=E[i].size()-1;j>0;j--){
lmin[E[i][j-1]]=E[i][j];
}
}
else{
int len1=E[tmp].size(),len2=E[i].size();
int li=0,lj=0;
while(li<len2&&lj<len1){
int xi=E[i][li],xj=E[tmp][lj];
if(xi>xj){
lmin[xj]=xi;lj++;
}
else{
lmin[xi]=xj;li++;
}
}
}
}
for(int i=n;i>=1;i--){
lmin[i]=min(lmin[i],lmin[i+1]);
//cout<<lmin[i]<<' ';
}
while(m--){
int l,r;cin>>l>>r;
if(r>=lmin[l])cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
5.爬树的甲壳虫
不会概率。
6.青蛙过河
我看到nlogn的复杂度又可以二分第一时间想的是二分+dp结果直接假了。。甚至写成了贪心(所以还是要多考虑一下思路正确性)
其实是结论题(佬说别的方法做不了的时候可能就是缺结论)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define mkp make_pair
#define fir first
#define sec second
#define pb push_back
const int maxn = 1e5+10;
int h[maxn],f[maxn],x,n,pre[maxn];
bool jud(int mid){
bool q=1;
for(int i=mid;i<n;i++){
if(pre[i]-pre[i-mid]<x)q=0;
}
if(q)return 1;
else return 0;
}
signed main(){
cin>>n>>x;
x*=2;
int l=1,r=n;bool xqq=1;
for(int i=1;i<n;i++){
cin>>h[i];pre[i]=pre[i-1]+h[i];
}
int mid=(l+r)>>1;
while(l<r){
if(jud(mid))r=mid;
else l=mid+1;
mid=(l+r)>>1;
//cout<<mid<<endl;
}
cout<<mid<<endl;
}
标签:cout,赛省赛,C++,蓝桥,int,maxn,bool,lmin,define
From: https://www.cnblogs.com/lyrrr/p/18399406