CF4
Posted knife-rose
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF4相关的知识,希望对你有一定的参考价值。
A
奇数或者(2)是(NO)
#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-')f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
int n;
inline void main()
{
n=read();
if(n&1||n==2) puts("NO");
else puts("YES");
}
}
signed main()
{
red::main();
return 0;
}
B
先都给最少的,然后从前往后加就行了
#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-')f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=50;
int n,sum;
int a[N],b[N],c[N];
inline void main()
{
n=read(),sum=read();
for(int i=1;i<=n;++i)
{
a[i]=read(),b[i]=read();
}
for(int i=1;i<=n;++i)
{
c[i]=a[i],sum-=a[i];
}
if(sum<0)
{
puts("NO");
return;
}
for(int i=1;i<=n&∑++i)
{
c[i]+=min(sum,b[i]-a[i]);
sum-=min(sum,b[i]-a[i]);
}
if(sum)
{
puts("NO");
return;
}
puts("YES");
for(int i=1;i<=n;++i) printf("%d ",c[i]);
}
}
signed main()
{
red::main();
return 0;
}
C
(map)
#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-')f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
int n;
map<string,int> q;
string s;
char t[110];
int st[100],top,l;
inline void main()
{
n=read();
for(int i=1;i<=n;++i)
{
cin>>s;
if(!q[s])
{
q[s]=1;
puts("OK");
}
else
{
int tmp=q[s];
++q[s];
memset(t,0,sizeof(t));
while(tmp) st[++top]=tmp%10,tmp/=10;
l=0;
while(top) t[l++]=st[top--]+'0';
cout<<s<<t<<endl;
}
}
}
}
signed main()
{
red::main();
return 0;
}
D
按(w)排序以后就是裸的最长严格上升子序列了……
(nle 5000)显然可以直接暴力,然而我还是写了线段树优化……
注意严格上升,当(w)与上一位不同时再把上一位(w)值加进线段树
#include<bits/stdc++.h>
using namespace std;
namespace red{
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define mid ((l+r)>>1)
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-')f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=1e6+10;
int aa,bb,tot,n,m,pre;
int f[N],g[N];
int ret,w;
int st[N],top;
struct node
{
int x,y,id;
inline bool operator < (const node &t) const
{
return x<t.x;
}
}a[N];
int ans[N<<2],pos[N<<2];
inline void update(int d,int l,int r,int p,int k,int w)
{
if(l==r)
{
if(k>ans[p])
{
ans[p]=k;
pos[p]=w;
}
return;
}
if(d<=mid) update(d,l,mid,ls(p),k,w);
else update(d,mid+1,r,rs(p),k,w);
ans[p]=max(ans[ls(p)],ans[rs(p)]);
pos[p]=ans[ls(p)]>=ans[rs(p)]?pos[ls(p)]:pos[rs(p)];
}
inline node query(int tl,int tr,int l,int r,int p)
{
if(!tr) return (node){0,0};
if(tl<=l&&r<=tr) return (node){ans[p],pos[p]};
if(tr<=mid) return query(tl,tr,l,mid,ls(p));
if(tl>mid) return query(tl,tr,mid+1,r,rs(p));
node tx=query(tl,tr,l,mid,ls(p)),ty=query(tl,tr,mid+1,r,rs(p));
return tx.x>=ty.x?tx:ty;
}
inline void main()
{
tot=read(),aa=read(),bb=read();
for(int x,y,i=1;i<=tot;++i)
{
x=read(),y=read();
if(x<=aa||y<=bb) continue;
a[++n].x=x,a[n].y=y,a[n].id=i;
m=max(m,a[n].y);
}
if(!n)
{
puts("0");
return;
}
sort(a+1,a+n+1);
pre=1;
for(int i=1;i<=n;++i)
{
if(a[i].x^a[i-1].x)
{
for(int j=pre;j<=i-1;++j) update(a[j].y,1,m,1,f[j],j);
pre=i;
}
node t=query(1,a[i].y-1,1,m,1);
f[i]=f[t.y]+1;
g[i]=t.y;
if(f[i]>ret) ret=f[i],w=i;
}
printf("%d
",ret);
while(w) st[++top]=a[w].id,w=g[w];
while(top) printf("%d ",st[top--]);
}
}
signed main()
{
red::main();
return 0;
}
以上是关于CF4的主要内容,如果未能解决你的问题,请参考以下文章