CF622
CF622A
实际上就是找到 \(n\) 包含的所有完整的序列 然后删去 剩下的 \(n\) 就是答案
这个直接暴力做就行 或者我们发现前 \(x\) 个序列总长度为 \(x(x+1)/2\)
那么找到最大的 \(x\) 满足 \(x(x+1)/2<n\) 二分/解方程均可
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define inl inline
#define ll long long
#define int ll
#define endl '\n'
const int N=2e2+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int base=131;
const int mod=998244853;
inl int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
inl void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
inl void writei(int x){write(x);putchar(' ');}
inl void writel(int x){write(x);putchar(endl);}
bool st;
int n;
bool ed;
signed main(){
n=read();
int l=0,r=1e9,ans;
while(l<=r){
int mid=l+r>>1;
if(mid*(mid+1)<n*2)ans=mid,l=mid+1;
else r=mid-1;
}
writel(n-ans*(ans+1)/2);
return 0;
}
CF622B
这题真没啥可说的。直接模拟就行。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define inl inline
#define ll long long
#define int ll
#define endl '\n'
const int N=2e2+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int base=131;
const int mod=998244853;
inl int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
inl void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
inl void writei(int x){write(x);putchar(' ');}
inl void writel(int x){write(x);putchar(endl);}
bool st;
int n;
bool ed;
signed main(){
int x=(getchar()-'0')*10+(getchar()-'0');getchar();
int y=(getchar()-'0')*10+(getchar()-'0');
int n=read();
y+=n;x+=(y/60);y%=60;x%=24;
printf("%02d:%02d",x,y);
return 0;
}
CF622C
只想到了莫队怎么说。
维护 \(pos_i\) 表示颜色和当前点 \(i\) 相同的左侧最远位置
对于每个询问 考虑 \(r\) 颜色是否为 \(x\) 不是的话直接选 否则看是否 \(pos_r<=l\) 是则一定没有答案 否则答案为 \(pos_r-1\)
CF622D
稍微转换一下形式: \(s=\sum\limits_{i=1}^n(n-i)\times\left\vert d_i-(n-i)\right\vert\)
显然 对于每个 \(i\) 放到距离为 \(n-i\) 的两个地方最优
那么 \(1\) 可以放到 \(1,n\);\(2\) 放到 \(n+1,n\times2-1\);\(3\) 放到 \(2,n-1\)......
对于 \(n\) 由于 \(n-i\) 等于0 塞到剩下的两个位置即可
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define inl inline
#define ll long long
#define int ll
#define endl '\n'
const int N=1e6+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int base=131;
const int mod=998244853;
inl int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
inl void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
inl void writei(int x){write(x);putchar(' ');}
inl void writel(int x){write(x);putchar(endl);}
bool st;
int n,m,a[N],pos[N],lp,rp,llp,rrp;
bool ed;
signed main(){
n=read();
lp=1,rp=n,llp=n+1,rrp=(n<<1)-1;
for(int i=1;i<=n-1;i++){
if(i&1){
a[lp++]=a[rp--]=i;
}else a[llp++]=a[rrp--]=i;
}
if(n&1)a[lp]=a[n<<1]=n;
else a[llp]=a[n<<1]=n;
for(int i=1;i<=(n<<1);i++)writei(a[i]);
return 0;
}
CF622E
首先 发现根节点与其他节点不同 蚂蚁可以一次进入多个 最后答案就是根节点各子树的最大答案
对于每个子树 我们可以求出每个节点的深度 那么每个叶子在不用等着的情况下 答案就是他的深度
考虑把叶子深度从小到大排序 看当前答案(深度)与前一个是否冲突 如果矛盾改为前一个答案加1
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define inl inline
#define ll long long
#define endl '\n'
const int N=1e6+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int base=131;
const int mod=998244853;
inl int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
inl void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
inl void writei(int x){write(x);putchar(' ');}
inl void writel(int x){write(x);putchar(endl);}
bool st;
int n,m,dep[N],tim[N],res;
vector<int>v;
int head[N],to[N],nxt[N],cnt;
inl void add(int u,int v){
nxt[++cnt]=head[u];
to[cnt]=v;
head[u]=cnt;
}
inl void dfs(int x,int fa){
int son=0;dep[x]=dep[fa]+1;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y==fa)continue;
dfs(y,x);son=1;
}
if(!son)v.push_back(dep[x]);
}
bool ed;
signed main(){
n=read();
for(int i=1;i<=n-1;i++){
int u=read(),v=read();
add(u,v);add(v,u);
}
for(int i=head[1];i;i=nxt[i]){
int y=to[i];v.clear();
dfs(y,1);
sort(v.begin(),v.end());
tim[0]=v[0];
for(int i=1;i<v.size();i++){
if(v[i]<=tim[i-1])tim[i]=max(v[i],tim[i-1]+1);
else tim[i]=max(v[i],tim[i]);
}
res=max(res,tim[v.size()-1]);
}
writel(res);
return 0;
}
CF622E
不会数学。