徹底淪爲要麼過不掉pp要麼就FST的智障選手。
A. Links and Pearls
看餘數是否爲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。全場被坑。果然注意特判纔是硬道理….。
考慮 和 如果都是完全平方數,那麼 一定也是。
預處理出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啊。
人生沒希望了啊。