Codeforces Round #480 (Div. 2)

15 篇文章 0 订阅
13 篇文章 0 订阅

比赛链接

彻底沦为要么过不掉pp要么就FST的智障选手。

看余数是否为0即可。

#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x); i<=(y); i++)
#define per(i,x,y) for (int i=(x); i>=(y); i--)
#define ll long long
#define ull unsigned long long
#define ld long double
#define inf 1000000001
#define INF 1000000000000000001ll
#define pii pair<int,int>
#define F first
#define S second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define sqr(x) ((x)*(x))
#define y1 y1_
#define mset(x,y) memset((x),(y),sizeof(x))
#define mcpy(x,y) memcpy((x),(y),sizeof(y))
using namespace std;
const ld pi=acos(-1);
const ld eps=1e-8;
template<typename T> void cmin(T &x,T y){ x=y<x?y:x; }
template<typename T> void cmax(T &x,T y){ x=y>x?y:x; }
 header files 
ll read(){
    char ch=getchar(); ll x=0; int op=1;
    for (; !isdigit(ch); ch=getchar()) if (ch=='-') op=-1;
    for (; isdigit(ch); ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
    return x*op;
}
void write(ll a){
    if (a<0) putchar('-'),a=-a;
    if (a>=10) write(a/10); putchar(a%10+'0');
}
// fast i/o //
#ifdef mod
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x%mod) if (p&1) ret=ret*x%mod;
    return ret;
}
ll getinv(ll x){ return ksm(x,mod-2); }
#else
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x) if (p&1) ret=ret*x;
    return ret;
}
#endif
 qpow 
char s[105];int n,cnt1,cnt2;
//#define local
int main(){
#ifdef local
    freopen("test.in","r",stdin); freopen("test.out","w",stdout);
#endif
    scanf("%s",s+1);n=strlen(s+1);
    rep (i,1,n) if (s[i]=='o') cnt1++; else cnt2++;
    if (!cnt1) puts("YES");
    else{
        if (cnt2%cnt1==0) puts("YES"); else puts("NO");
    }
    return 0;
}
// sample data:
/*

*/

// rest:
/*

*/

B. Marlin

对称构造即可。

#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x); i<=(y); i++)
#define per(i,x,y) for (int i=(x); i>=(y); i--)
#define ll long long
#define ull unsigned long long
#define ld long double
#define inf 1000000000
#define INF 1000000000000000000ll
#define pii pair<int,int>
#define F first
#define S second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define sqr(x) ((x)*(x))
#define y1 y1_
#define mset(x,y) memset((x),(y),sizeof(x))
#define mcpy(x,y) memcpy((x),(y),sizeof(y))
using namespace std;
const ld pi=acos(-1);
const ld eps=1e-8;
template<typename T> void cmin(T &x,T y){ x=y<x?y:x; }
template<typename T> void cmax(T &x,T y){ x=y>x?y:x; }
 header files 
ll read(){
    char ch=getchar(); ll x=0; int op=1;
    for (; !isdigit(ch); ch=getchar()) if (ch=='-') op=-1;
    for (; isdigit(ch); ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
    return x*op;
}
void write(ll a){
    if (a<0) putchar('-'),a=-a;
    if (a>=10) write(a/10); putchar(a%10+'0');
}
// fast i/o //
#ifdef mod
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x%mod) if (p&1) ret=ret*x%mod;
    return ret;
}
ll getinv(ll x){ return ksm(x,mod-2); }
#else
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x) if (p&1) ret=ret*x;
    return ret;
}
#endif
 qpow 
#define N 105
int n,k;char a[10][N];
//#define local
int main(){
#ifdef local
    freopen("test.in","r",stdin); freopen("test.out","w",stdout);
#endif
    n=read(),k=read();
    rep (i,1,4) rep (j,1,n) a[i][j]='.';
    if (k%2==0){
        rep (i,2,k/2+1) a[2][i]=a[3][i]='#';
    } else{
        a[2][(n+1)/2]='#';k--;
        rep (i,2,n/2){
            if (!k) break;
            k-=2;a[2][i]=a[2][n-i+1]='#';
        }
        rep (i,2,n/2){
            if (!k) break;
            k-=2;a[3][i]=a[3][n-i+1]='#';
        }
    }
    puts("YES");
    rep (i,1,4){rep (j,1,n) putchar(a[i][j]);puts("");}
    return 0;
}
// sample data:
/*

*/

// rest:
/*

*/

C. Posterized

直接依次贪心下去即可。

#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x); i<=(y); i++)
#define per(i,x,y) for (int i=(x); i>=(y); i--)
#define ll long long
#define ull unsigned long long
#define ld long double
#define inf 1000000000
#define INF 1000000000000000000ll
#define pii pair<int,int>
#define F first
#define S second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define sqr(x) ((x)*(x))
#define y1 y1_
#define mset(x,y) memset((x),(y),sizeof(x))
#define mcpy(x,y) memcpy((x),(y),sizeof(y))
using namespace std;
const ld pi=acos(-1);
const ld eps=1e-8;
template<typename T> void cmin(T &x,T y){ x=y<x?y:x; }
template<typename T> void cmax(T &x,T y){ x=y>x?y:x; }
 header files 
ll read(){
    char ch=getchar(); ll x=0; int op=1;
    for (; !isdigit(ch); ch=getchar()) if (ch=='-') op=-1;
    for (; isdigit(ch); ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
    return x*op;
}
void write(ll a){
    if (a<0) putchar('-'),a=-a;
    if (a>=10) write(a/10); putchar(a%10+'0');
}
// fast i/o //
#ifdef mod
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x%mod) if (p&1) ret=ret*x%mod;
    return ret;
}
ll getinv(ll x){ return ksm(x,mod-2); }
#else
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x) if (p&1) ret=ret*x;
    return ret;
}
#endif
 qpow 
#define N 100005
int n,k,vis[N],a[N],cnt[N];
//#define local
int main(){
#ifdef local
    freopen("test.in","r",stdin); freopen("test.out","w",stdout);
#endif
    n=read(),k=read();
    memset(vis,-1,sizeof(vis));
    rep (i,1,n){
        a[i]=read();if (vis[a[i]]!=-1){printf("%d ",vis[a[i]]);continue;}
        int x=a[i],tmp=1;//cerr<<"x="<<x<<' ';
        while (tmp<k&&x>=0){
            if (vis[x]!=-1) break; else x--,tmp++;
        }
        if (vis[x]==-1){
            printf("%d ",x);
            rep (j,x,a[i]) vis[j]=x,cnt[x]++;
            continue;
        }
        if (cnt[vis[x]]+a[i]-x>k){
            x++;printf("%d ",x);
            rep (j,x,a[i]) vis[j]=x,cnt[x]++;
            continue;
        } else{
            printf("%d ",vis[x]);
            rep (j,x+1,a[i]) vis[j]=vis[x],cnt[vis[x]]++;
        }
    }
    return 0;
}
// sample data:
/*

*/

// rest:
/*

*/

D. Perfect Groups

一些吐槽:这pp也太坑了qwq。全场被坑。果然注意特判才是硬道理….。

考虑 a×b a × b b×c b × c 如果都是完全平方数,那么 a×c a × c 一定也是。

预处理出vector<int> b[i]表示1~i中的数和i哪些乘起来为完全平方数(0不算),然后枚举所有子区间左端点,在右端一个个插入数。如果插入一个非0的数,对于这个数j如果在当前左端点到j-1中有某个数和它相乘是完全平方数的则不用新建小组,否则cnt++。

另外0有点坑,现将非0的数全部分好以后,如果有0就随便分到一组,组数不会增加。但如果这个子区间只有0,没有非0,是需要1组的。

//没想到0的情况啊!!…><

#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x); i<=(y); i++)
#define per(i,x,y) for (int i=(x); i>=(y); i--)
#define ll long long
#define ull unsigned long long
#define ld long double
#define inf 1000000000
#define INF 1000000000000000000ll
#define pii pair<int,int>
#define F first
#define S second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define sqr(x) ((x)*(x))
#define y1 y1_
#define mset(x,y) memset((x),(y),sizeof(x))
#define mcpy(x,y) memcpy((x),(y),sizeof(y))
using namespace std;
const ld pi=acos(-1);
const ld eps=1e-8;
template<typename T> void cmin(T &x,T y){ x=y<x?y:x; }
template<typename T> void cmax(T &x,T y){ x=y>x?y:x; }
 header files 
ll read(){
    char ch=getchar(); ll x=0; int op=1;
    for (; !isdigit(ch); ch=getchar()) if (ch=='-') op=-1;
    for (; isdigit(ch); ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
    return x*op;
}
void write(ll a){
    if (a<0) putchar('-'),a=-a;
    if (a>=10) write(a/10); putchar(a%10+'0');
}
// fast i/o //
#ifdef mod
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x%mod) if (p&1) ret=ret*x%mod;
    return ret;
}
ll getinv(ll x){ return ksm(x,mod-2); }
#else
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x) if (p&1) ret=ret*x;
    return ret;
}
#endif
 qpow 
#define N 5005
int n,ans[N],po[N];ll a[N];vector<int> b[N];
//#define local
int main(){
#ifdef local
    freopen("test.in","r",stdin); freopen("test.out","w",stdout);
#endif
    n=read();
    rep (i,1,n){
        a[i]=read();
        rep (j,1,i-1){
            ll tmp=a[i]*a[j];
            if (tmp>0&&sqr((ll)sqrt((ld)tmp))==tmp) b[i].push_back(j);
        }
        b[i].push_back(i);
    }
    rep (i,1,n) po[i]=0;
    rep (i,1,n){
        int cnt=0,cnt0=0;
        rep (j,i,n){
            while (po[j]<SZ(b[j])&&b[j][po[j]]<i) po[j]++;
            if (!a[j]) cnt0++;
            if (a[j]&&b[j][po[j]]==j) cnt++;
            if (!cnt0||cnt0&&cnt) ans[cnt]++;
            else if (!cnt) ans[1]++;
        }
    }
    rep (i,1,n) printf("%d ",ans[i]);puts("");
    return 0;
}
// sample data:
/*

*/

// rest:
/*

*/

E. The Number Games

一些吐槽:思维能力欠缺怪自己=.= 考场上还有35+分钟来着,想+写这题,如果直接走上正轨应该来得及的>< 然而绕了很大的圈子走上了歧途…;我怎么会想到并查集的呢…。窝有病吧(

思路是贪心,先转化成选择权值最大的n-k个留下来。从大到小取,如果当前数i到之前连通块的最近距离,<=剩下能选择的数的话,就可以选。

至于怎么处理【到之前连通块的最近距离】,可以发现如果以n为根,每次添加的是树上一条链(初始时是n一个点),考虑这条链对其余点的影响,显然是对子树有影响,于是预处理出dfs序,树状数组实现区间加单点查询即可。

#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x); i<=(y); i++)
#define per(i,x,y) for (int i=(x); i>=(y); i--)
#define ll long long
#define ull unsigned long long
#define ld long double
#define inf 1000000001
#define INF 1000000000000000001ll
#define pii pair<int,int>
#define F first
#define S second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define sqr(x) ((x)*(x))
#define y1 y1_
#define mset(x,y) memset((x),(y),sizeof(x))
#define mcpy(x,y) memcpy((x),(y),sizeof(y))
using namespace std;
const ld pi=acos(-1);
const ld eps=1e-8;
template<typename T> void cmin(T &x,T y){ x=y<x?y:x; }
template<typename T> void cmax(T &x,T y){ x=y>x?y:x; }
 header files 
ll read(){
    char ch=getchar(); ll x=0; int op=1;
    for (; !isdigit(ch); ch=getchar()) if (ch=='-') op=-1;
    for (; isdigit(ch); ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
    return x*op;
}
void write(ll a){
    if (a<0) putchar('-'),a=-a;
    if (a>=10) write(a/10); putchar(a%10+'0');
}
// fast i/o //
#ifdef mod
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x%mod) if (p&1) ret=ret*x%mod;
    return ret;
}
ll getinv(ll x){ return ksm(x,mod-2); }
#else
ll ksm(ll x,ll p){
    ll ret=1;
    for (; p; p>>=1,x=x*x) if (p&1) ret=ret*x;
    return ret;
}
#endif
 qpow 
#define N 1000005
int n,k,cnt,clk,head[N],vis[N],fa[N],in[N],out[N],dep[N];
struct bit{
    int t[N];bit(){memset(t,0,sizeof(t));}
    void upd(int x,int val){for (int i=x;i<=n;i+=i&-i) t[i]+=val;}
    int qry(int x){int ret=0;for (int i=x;i;i-=i&-i) ret+=t[i];return ret;}
}tr;
struct edge{int to,nxt;}e[N<<1];
void adde(int x,int y){e[++cnt].to=y;e[cnt].nxt=head[x];head[x]=cnt;}
void ins(int x,int y){adde(x,y);adde(y,x);}
void dfs(int u,int pr){
    in[u]=++clk;
    for (int i=head[u],v;i;i=e[i].nxt) if ((v=e[i].to)!=pr){
        fa[v]=u;dep[v]=dep[u]+1;dfs(v,u);
    }
    out[u]=clk;
}
//#define local
int main(){
#ifdef local
    freopen("test.in","r",stdin); freopen("test.out","w",stdout);
#endif
    n=read(),k=n-read();
    rep (i,1,n-1){int x=read(),y=read();ins(x,y);}
    dfs(n,0);vis[n]=1;k--;
    rep (i,1,n) tr.upd(in[i],dep[i]),tr.upd(in[i]+1,-dep[i]);
    per (i,n-1,1){
        if (!k) break;if (vis[i]) continue;
        int tmp=tr.qry(in[i]);
        if (tmp>k) continue;
        k-=tmp;int now=i;
        for (;tmp;now=fa[now],tmp--){
            vis[now]=1;
            tr.upd(in[now],-1);tr.upd(out[now]+1,1);
        }
    }
    rep (i,1,n) if (!vis[i]) printf("%d ",i);puts("");
    return 0;
}
// sample data:
/*
15 3
9 11
11 8
7 9
9 14
12 8
10 7
1 14
1 5
12 15
10 3
5 2
13 15
4 13
6 4
*/

// rest:
/*

*/

总结

rk150,rating+35…..。

这怎么黄名线下调我还打不上master啊。我怎么div2都打这么烂啊。我怎么整天过不掉pp,过pp的全fst啊。

人生没希望了啊。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值