我们来打钢丝罢!就打提高,先灭了阎老西
众所周知,众所周知的,众所周知是个众所周知的成语这件事众所周知的非常的众所周知事情已经众所周知。
某人表示:今天题目比较简单。
这种事情就很劝退,人无者也。
菜!
T1 cut
模拟一般猜题意,
贪心只能过样例。
数学上来先打表,
啥也不会瞎暴力。
#include<cstdio>
#include<algorithm>
#define N 200010
using namespace std;
int n,m,a[N],b[N<<2][2],last,r[N],bl[N],wh[N],p[N],ans,cut[N];
char BuF[1<<26],*InF=BuF;
template<typename T>void read(T &x){
for(;*InF<33;++InF);
for(x=0;32<*InF;x=(x<<3)+(x<<1)+(*InF++^48));
}
void add(int x,int y){
b[++last][0]=a[x];
b[a[x]=last][1]=y;
}
bool cmp(int x,int y){
return(r[x]>r[y]);
}
int main(){
freopen("cut.in","r",stdin);
freopen("cut.out","w",stdout);
fread(BuF,1,1<<26,stdin);
read(n);read(m);
for(int i=0,x,y;i<m;++i){
read(x);read(y);
add(x,y);
add(y,x);
++r[x];++r[y];
p[i]=i+1;
}
sort(p,p+n,cmp);
for(int i=0;i<n;++i){
for(int j=a[p[i]];j;j=b[j][0]){
if(cut[b[j][1]]!=1){
cut[b[j][1]]=-1;
++wh[p[i]];
}
}
if(wh[p[i]]>bl[p[i]]){
ans+=wh[p[i]]-bl[p[i]];
cut[p[i]]=1;
for(int j=a[p[i]];j;j=b[j][0]){
if(cut[b[j][1]]!=1){
++bl[b[j][1]];
}
}
if(ans>=(m>>1)+(m&1)){
break;
}
}
}
for(int i=1;i<=n;++i){
printf("%d ",cut[i]>0);
}
fclose(stdin);
fclose(stdout);
return 0;
}
T2 busy
瞎暴力。
#include<cstdio>
#include<algorithm>
using namespace std;
int n,l,r,a[100010],cnt;
long long f[20000010];
char BuF[1<<26],*InF=BuF;
template<typename T>void read(T &x){
for(;*InF<33;++InF);
for(x=0;32<*InF;x=(x<<3)+(x<<1)+(*InF++^48));
}
int main(){
freopen("busy.in","r",stdin);
freopen("busy.out","w",stdout);
fread(BuF,1,1<<26,stdin);
read(n);
for(int i=0;i<n;++i){
read(a[i]);
for(int j=i,mi=a[i];j>=0;mi=min(mi,a[--j])){
f[++cnt]=(i-j+1)*mi;
}
}
read(l);read(r);
sort(f+1,f+cnt);
for(int i=l;i<=r;++i){
printf("%lld ",f[i]);
}
fclose(stdin);
fclose(stdout);
return 0;
}
T3 palindrome
考试的时候准备先写一个 manacher 然后维护回文长度。
没错那个准备写树套树的 B 又是我,但因为那啥没写。
明明是一道很水的二分,你说它为什么呢……
以下代码正解:
#include<cstdio>
#include<iostream>
#define N 1000010
using namespace std;
int q,len=1,p[N],r,mid,f[21][N],log[N];
char BuF[1<<26],*InF=BuF,s[N];
template<typename T>void read(T &x){
for(;*InF<33;++InF);
for(x=0;32<*InF;x=(x<<3)+(x<<1)+(*InF++^48));
}
void manacher(){
for(register int i=1;i<len;++i){
if(i<r){
f[0][i]=min(f[0][(mid<<1)-i],r-i);
}
for(;s[i-f[0][i]-1]==s[i+f[0][i]+1];++f[0][i]);
if(i+p[i]>r){
r=i+p[i];
mid=i;
}
}
}
int get(int l,int r){
int s=log[r-l+1];
return(max(f[s][l],f[s][r-(1<<s)+1]));
}
int main(){
freopen("palindrome.in","r",stdin);
freopen("palindrome.out","w",stdout);
fread(BuF,1,1<<26,stdin);
for(s[0]='@',s[1]='#';32<*InF;++InF){
s[++len]=*InF;
s[++len]='#';
}
manacher();
for(int i=2;i<=len;++i){
log[i]=log[i>>1]+1;
}
for(int j=0;j<log[len];++j){
for(int i=1;i+(1<<j)-1<=len;++i){
f[j+1][i]=max(f[j][i],f[j][i+(1<<j)]);
}
}
read(q);
for(register int i=0,x,y;i<q;++i){
read(x);read(y);x=(x<<1)-1;y=y<<1|1;
int l=1,r=(y-x)>>1;
while(l<r){
int mid=((l+r)>>1)+1;
if(get(x+mid,y-mid)>=mid){
l=mid;
}else{
r=mid-1;
}
}
printf("%d
",l);
}
fclose(stdin);
fclose(stdout);
return 0;
}
T4 night
模拟尝试猜题意,暴力不会秒放弃。
勉强指数想拿分,N 方直接只三题。