Codeforces Round #480 (Div. 2)

比賽鏈接

徹底淪爲要麼過不掉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×bb×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啊。

人生沒希望了啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章